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);
|
||||
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;
|
||||
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;
|
||||
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