@ -1169,6 +1169,57 @@ select * from boolpart where a is not unknown;
t
(2 rows)
-- try some other permutations with a NULL partition instead of a DEFAULT
delete from boolpart where a is null;
create table boolpart_null partition of boolpart for values in (null);
insert into boolpart values(null);
explain (costs off) select * from boolpart where a is not true;
QUERY PLAN
--------------------------------------------
Append
-> Seq Scan on boolpart_f boolpart_1
Filter: (a IS NOT TRUE)
-> Seq Scan on boolpart_null boolpart_2
Filter: (a IS NOT TRUE)
(5 rows)
explain (costs off) select * from boolpart where a is not true and a is not false;
QUERY PLAN
--------------------------------------------------
Seq Scan on boolpart_null boolpart
Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE))
(2 rows)
explain (costs off) select * from boolpart where a is not false;
QUERY PLAN
--------------------------------------------
Append
-> Seq Scan on boolpart_t boolpart_1
Filter: (a IS NOT FALSE)
-> Seq Scan on boolpart_null boolpart_2
Filter: (a IS NOT FALSE)
(5 rows)
select * from boolpart where a is not true;
a
---
f
(2 rows)
select * from boolpart where a is not true and a is not false;
a
---
(1 row)
select * from boolpart where a is not false;
a
---
t
(2 rows)
-- inverse boolean partitioning - a seemingly unlikely design, but we've got
-- code for it, so we'd better test it.
create table iboolpart (a bool) partition by list ((not a));
@ -1315,11 +1366,37 @@ select * from iboolpart where a is not unknown;
f
(2 rows)
-- Try some other permutations with a NULL partition instead of a DEFAULT
delete from iboolpart where a is null;
create table iboolpart_null partition of iboolpart for values in (null);
insert into iboolpart values(null);
-- Pruning shouldn't take place for these. Just check the result is correct
select * from iboolpart where a is not true;
a
---
f
(2 rows)
select * from iboolpart where a is not true and a is not false;
a
---
(1 row)
select * from iboolpart where a is not false;
a
---
t
(2 rows)
create table boolrangep (a bool, b bool, c int) partition by range (a,b,c);
create table boolrangep_tf partition of boolrangep for values from ('true', 'false', 0) to ('true', 'false', 100);
create table boolrangep_ft partition of boolrangep for values from ('false', 'true', 0) to ('false', 'true', 100);
create table boolrangep_ff1 partition of boolrangep for values from ('false', 'false', 0) to ('false', 'false', 50);
create table boolrangep_ff2 partition of boolrangep for values from ('false', 'false', 50) to ('false', 'false', 100);
create table boolrangep_null partition of boolrangep default;
-- try a more complex case that's been known to trip up pruning in the past
explain (costs off) select * from boolrangep where not a and not b and c = 25;
QUERY PLAN
@ -1328,6 +1405,32 @@ explain (costs off) select * from boolrangep where not a and not b and c = 25;
Filter: ((NOT a) AND (NOT b) AND (c = 25))
(2 rows)
-- ensure we prune boolrangep_tf
explain (costs off) select * from boolrangep where a is not true and not b and c = 25;
QUERY PLAN
------------------------------------------------------------
Append
-> Seq Scan on boolrangep_ff1 boolrangep_1
Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25))
-> Seq Scan on boolrangep_ff2 boolrangep_2
Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25))
-> Seq Scan on boolrangep_ft boolrangep_3
Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25))
-> Seq Scan on boolrangep_null boolrangep_4
Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25))
(9 rows)
-- ensure we prune everything apart from boolrangep_tf and boolrangep_null
explain (costs off) select * from boolrangep where a is not false and not b and c = 25;
QUERY PLAN
-------------------------------------------------------------
Append
-> Seq Scan on boolrangep_tf boolrangep_1
Filter: ((a IS NOT FALSE) AND (NOT b) AND (c = 25))
-> Seq Scan on boolrangep_null boolrangep_2
Filter: ((a IS NOT FALSE) AND (NOT b) AND (c = 25))
(5 rows)
-- test scalar-to-array operators
create table coercepart (a varchar) partition by list (a);
create table coercepart_ab partition of coercepart for values in ('ab');