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
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