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

text/plain

Filename: 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 0001
Subject: Fix parent_sjinfo wrong freed issue.
File+
src/backend/optimizer/path/joinrels.c 1 1
src/test/regress/expected/partition_join.out 21 0
src/test/regress/sql/partition_join.sql 7 0
From 248cf398a3777fc20233dd4dea941179fcb4170e Mon Sep 17 00:00:00 2001
From: Tender Wang <tndrwang@gmail.com>
Date: Wed, 12 Feb 2025 19:35:33 +0800
Subject: [PATCH] Fix parent_sjinfo wrong freed issue.

---
 src/backend/optimizer/path/joinrels.c        |  2 +-
 src/test/regress/expected/partition_join.out | 21 ++++++++++++++++++++
 src/test/regress/sql/partition_join.sql      |  7 +++++++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c
index c2eb300ea9..dd598c79b5 100644
--- a/src/backend/optimizer/path/joinrels.c
+++ b/src/backend/optimizer/path/joinrels.c
@@ -1717,7 +1717,7 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo,
 		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