Fix executor prune failure when plan already pruned
In a multi-layer partitioning setup, if at plan time all the sub-partitions are pruned but the intermediate one remains, the executor later throws a spurious error that there's nothing to prune. That is correct, but there's no reason to throw an error. Therefore, don't. Reported-by: Andreas Seltenreich <seltenreich@gmx.de> Author: David Rowley <david.rowley@2ndquadrant.com> Discussion: https://postgr.es/m/87in4h98i0.fsf@ansel.ydns.eu
This commit is contained in:
parent
fa73b377ee
commit
1eb9221585
@ -1886,8 +1886,13 @@ find_matching_subplans_recurse(PartitionPruningData *prunedata,
|
|||||||
initial_prune, validsubplans);
|
initial_prune, validsubplans);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Shouldn't happen */
|
/*
|
||||||
elog(ERROR, "partition missing from subplans");
|
* We get here if the planner already pruned all the sub-
|
||||||
|
* partitions for this partition. Silently ignore this
|
||||||
|
* partition in this case. The end result is the same: we
|
||||||
|
* would have pruned all partitions just the same, but we
|
||||||
|
* don't have any pruning steps to execute to verify this.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3570,3 +3570,21 @@ execute q (1, 1);
|
|||||||
|
|
||||||
reset plan_cache_mode;
|
reset plan_cache_mode;
|
||||||
drop table p, q;
|
drop table p, q;
|
||||||
|
-- Ensure run-time pruning works correctly when we match a partitioned table
|
||||||
|
-- on the first level but find no matching partitions on the second level.
|
||||||
|
create table listp (a int, b int) partition by list (a);
|
||||||
|
create table listp1 partition of listp for values in(1);
|
||||||
|
create table listp2 partition of listp for values in(2) partition by list(b);
|
||||||
|
create table listp2_10 partition of listp2 for values in (10);
|
||||||
|
explain (analyze, costs off, summary off, timing off)
|
||||||
|
select * from listp where a = (select 2) and b <> 10;
|
||||||
|
QUERY PLAN
|
||||||
|
-------------------------------------------
|
||||||
|
Append (actual rows=0 loops=1)
|
||||||
|
InitPlan 1 (returns $0)
|
||||||
|
-> Result (actual rows=1 loops=1)
|
||||||
|
-> Seq Scan on listp1 (never executed)
|
||||||
|
Filter: ((b <> 10) AND (a = $0))
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
drop table listp;
|
||||||
|
@ -946,3 +946,15 @@ execute q (1, 1);
|
|||||||
|
|
||||||
reset plan_cache_mode;
|
reset plan_cache_mode;
|
||||||
drop table p, q;
|
drop table p, q;
|
||||||
|
|
||||||
|
-- Ensure run-time pruning works correctly when we match a partitioned table
|
||||||
|
-- on the first level but find no matching partitions on the second level.
|
||||||
|
create table listp (a int, b int) partition by list (a);
|
||||||
|
create table listp1 partition of listp for values in(1);
|
||||||
|
create table listp2 partition of listp for values in(2) partition by list(b);
|
||||||
|
create table listp2_10 partition of listp2 for values in (10);
|
||||||
|
|
||||||
|
explain (analyze, costs off, summary off, timing off)
|
||||||
|
select * from listp where a = (select 2) and b <> 10;
|
||||||
|
|
||||||
|
drop table listp;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user