mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
Fix run-time partition pruning code to handle NULL values properly.
The previous coding just ignored pruning constraints that compare a partition key to a null-valued expression. This is silly, since really what we can do there is conclude that all partitions are rejected: the pruning operator is known strict so the comparison must always fail. This also fixes the logic to not ignore constisnull for a Const comparison value. That's probably an unreachable case, since the planner would normally have simplified away a strict operator with a constant-null input. But this code has no business assuming that. David Rowley, per a gripe from me Discussion: https://postgr.es/m/26279.1528670981@sss.pgh.pa.us
This commit is contained in:
@ -2731,6 +2731,20 @@ explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,1);
|
||||
Filter: ((b = ANY (ARRAY[$1, $2])) AND ($3 <> b) AND ($4 <> b))
|
||||
(4 rows)
|
||||
|
||||
-- Ensure Params that evaluate to NULL properly prune away all partitions
|
||||
explain (analyze, costs off, summary off, timing off)
|
||||
select * from listp where a = (select null::int);
|
||||
QUERY PLAN
|
||||
----------------------------------------------
|
||||
Append (actual rows=0 loops=1)
|
||||
InitPlan 1 (returns $0)
|
||||
-> Result (actual rows=1 loops=1)
|
||||
-> Seq Scan on listp_1_1 (never executed)
|
||||
Filter: (a = $0)
|
||||
-> Seq Scan on listp_2_1 (never executed)
|
||||
Filter: (a = $0)
|
||||
(7 rows)
|
||||
|
||||
drop table listp;
|
||||
-- Ensure runtime pruning works with initplans params with boolean types
|
||||
create table boolvalues (value bool not null);
|
||||
|
@ -685,6 +685,10 @@ explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,0);
|
||||
-- One subplan will remain in this case, but it should not be executed.
|
||||
explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,1);
|
||||
|
||||
-- Ensure Params that evaluate to NULL properly prune away all partitions
|
||||
explain (analyze, costs off, summary off, timing off)
|
||||
select * from listp where a = (select null::int);
|
||||
|
||||
drop table listp;
|
||||
|
||||
-- Ensure runtime pruning works with initplans params with boolean types
|
||||
|
Reference in New Issue
Block a user