From 73754e24178087cf8aa53904acfb032343be25df Mon Sep 17 00:00:00 2001 From: amit Date: Thu, 18 May 2017 10:45:44 +0900 Subject: [PATCH] Fix crash when partitioned table Append referenced in subplans --- src/backend/optimizer/plan/planner.c | 2 +- src/test/regress/expected/inherit.out | 31 +++++++++++++++++++++++++++++++ src/test/regress/sql/inherit.sql | 10 ++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index c4a5651abd..bc2797e42c 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -6076,7 +6076,7 @@ get_partitioned_child_rels(PlannerInfo *root, Index rti) if (pc->parent_relid == rti) { - result = pc->child_rels; + result = list_copy(pc->child_rels); break; } } diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index af7090ba0d..35d182d599 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -1918,3 +1918,34 @@ explain (costs off) select * from mcrparted where a = 20 and c > 20; -- scans mc (7 rows) drop table mcrparted; +-- check that partitioned table Appends cope with being referenced in +-- subplans +create table parted_minmax (a int, b varchar(16)) partition by range (a); +create table parted_minmax1 partition of parted_minmax for values from (1) to (10); +create index parted_minmax1i on parted_minmax1 (a, b); +insert into parted_minmax values (1,'12345'); +explain (costs off) select min(a), max(a) from parted_minmax where b = '12345'; + QUERY PLAN +------------------------------------------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Merge Append + Sort Key: parted_minmax1.a + -> Index Only Scan using parted_minmax1i on parted_minmax1 + Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) + InitPlan 2 (returns $1) + -> Limit + -> Merge Append + Sort Key: parted_minmax1_1.a DESC + -> Index Only Scan Backward using parted_minmax1i on parted_minmax1 parted_minmax1_1 + Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) +(13 rows) + +select min(a), max(a) from parted_minmax where b = '12345'; + min | max +-----+----- + 1 | 1 +(1 row) + +drop table parted_minmax; diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index 7f34f43ec0..70fe971d51 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -661,3 +661,13 @@ explain (costs off) select * from mcrparted where a > -1; -- scans all partition explain (costs off) select * from mcrparted where a = 20 and abs(b) = 10 and c > 10; -- scans mcrparted4 explain (costs off) select * from mcrparted where a = 20 and c > 20; -- scans mcrparted3, mcrparte4, mcrparte5 drop table mcrparted; + +-- check that partitioned table Appends cope with being referenced in +-- subplans +create table parted_minmax (a int, b varchar(16)) partition by range (a); +create table parted_minmax1 partition of parted_minmax for values from (1) to (10); +create index parted_minmax1i on parted_minmax1 (a, b); +insert into parted_minmax values (1,'12345'); +explain (costs off) select min(a), max(a) from parted_minmax where b = '12345'; +select min(a), max(a) from parted_minmax where b = '12345'; +drop table parted_minmax; -- 2.11.0