From 09e75e99aab7933ce690ad1cf8b3e46be11bd9f0 Mon Sep 17 00:00:00 2001 From: Tender Wang Date: Wed, 12 Feb 2025 19:35:33 +0800 Subject: [PATCH v2] Fix parent_sjinfo wrong freed issue. --- src/backend/optimizer/path/joinrels.c | 5 +++-- src/test/regress/expected/partition_join.out | 21 ++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 7 +++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index c2eb300ea9..c33baeca6d 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -1703,7 +1703,7 @@ static SpecialJoinInfo * build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, Relids left_relids, Relids right_relids) { - SpecialJoinInfo *sjinfo = makeNode(SpecialJoinInfo); + SpecialJoinInfo *sjinfo; AppendRelInfo **left_appinfos; int left_nappinfos; AppendRelInfo **right_appinfos; @@ -1713,11 +1713,12 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, if (parent_sjinfo->jointype == JOIN_INNER) { Assert(parent_sjinfo->ojrelid == 0); + sjinfo = makeNode(SpecialJoinInfo); init_dummy_sjinfo(sjinfo, left_relids, right_relids); return sjinfo; } - memcpy(sjinfo, parent_sjinfo, sizeof(SpecialJoinInfo)); + sjinfo = copyObject(parent_sjinfo); left_appinfos = find_appinfos_by_relids(root, left_relids, &left_nappinfos); right_appinfos = find_appinfos_by_relids(root, right_relids, diff --git a/src/test/regress/expected/partition_join.out b/src/test/regress/expected/partition_join.out index af468682a2..c1b7df8659 100644 --- a/src/test/regress/expected/partition_join.out +++ b/src/test/regress/expected/partition_join.out @@ -713,6 +713,27 @@ SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) RESET enable_partitionwise_aggregate; RESET enable_hashjoin; +-- bug free parent_sjinfo +create table pw_test(order_id int, name varchar); +create table pw_orders(order_id int, name char(10)) partition by hash (order_id); +create table orders_p1 partition of pw_orders for values with ( modulus 32, remainder 0); +explain(costs off) select * from pw_test t join pw_orders o on +t.order_id =o.order_id where t.order_id in (select order_id from pw_orders); + QUERY PLAN +--------------------------------------------------------------- + Hash Join + Hash Cond: (o.order_id = t.order_id) + -> Seq Scan on orders_p1 o + -> Hash + -> Hash Join + Hash Cond: (t.order_id = pw_orders.order_id) + -> Seq Scan on pw_test t + -> Hash + -> HashAggregate + Group Key: pw_orders.order_id + -> Seq Scan on orders_p1 pw_orders +(11 rows) + -- -- partitioned by expression -- diff --git a/src/test/regress/sql/partition_join.sql b/src/test/regress/sql/partition_join.sql index e84b65f444..d8ad4ce3dc 100644 --- a/src/test/regress/sql/partition_join.sql +++ b/src/test/regress/sql/partition_join.sql @@ -143,6 +143,13 @@ SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) RESET enable_partitionwise_aggregate; RESET enable_hashjoin; +-- bug free parent_sjinfo +create table pw_test(order_id int, name varchar); +create table pw_orders(order_id int, name char(10)) partition by hash (order_id); +create table orders_p1 partition of pw_orders for values with ( modulus 32, remainder 0); +explain(costs off) select * from pw_test t join pw_orders o on +t.order_id =o.order_id where t.order_id in (select order_id from pw_orders); + -- -- partitioned by expression -- -- 2.34.1