v2-0001-Fix-parent_sjinfo-wrong-freed-issue.patch

text/plain

Filename: v2-0001-Fix-parent_sjinfo-wrong-freed-issue.patch
Type: text/plain
Part: 0
Message: Re: BUG #18806: When enable_rartitionwise_join is set to ON, the database shuts down abnormally

Patch

Format: format-patch
Series: patch v2-0001
Subject: Fix parent_sjinfo wrong freed issue.
File+
src/backend/optimizer/path/joinrels.c 3 2
src/test/regress/expected/partition_join.out 21 0
src/test/regress/sql/partition_join.sql 7 0
From 09e75e99aab7933ce690ad1cf8b3e46be11bd9f0 Mon Sep 17 00:00:00 2001
From: Tender Wang <tndrwang@gmail.com>
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