diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index f66de15db31..e5786455704 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -1405,6 +1405,12 @@ set_append_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset); } } } @@ -1477,6 +1483,12 @@ set_mergeappend_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset); } } } diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index 6e80947d874..1f31dd4cf24 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -1839,6 +1839,38 @@ explain (costs off) select * from rparted_by_int2 where a > 100000000000000; (2 rows) drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + QUERY PLAN +------------------------------------------------------------------------------------------- + Nested Loop + -> Seq Scan on int4_tbl touter + -> Append + -> Index Only Scan using asptab0_pkey on asptab0 asptab_1 + Index Cond: (id > ((alternatives: SubPlan 3 or hashed SubPlan 4))::integer) + SubPlan 3 + -> Seq Scan on int4_tbl tinner_2 + Filter: (f1 = touter.f1) + SubPlan 4 + -> Seq Scan on int4_tbl tinner_3 + -> Index Only Scan using asptab1_pkey on asptab1 asptab_2 + Index Cond: (id > ((alternatives: SubPlan 3 or hashed SubPlan 4))::integer) + SubPlan 1 + -> Seq Scan on int4_tbl tinner + Filter: (f1 = touter.f1) + SubPlan 2 + -> Seq Scan on int4_tbl tinner_1 +(17 rows) + +drop table asptab; -- -- Test Partition pruning for HASH partitioning -- diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index fec07a9a30b..d9e0fafbfb2 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -362,6 +362,21 @@ explain (costs off) select * from rparted_by_int2 where a > 100000000000000; drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up + +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); + +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + +drop table asptab; + -- -- Test Partition pruning for HASH partitioning --