Skip to content

Commit cf807eb

Browse files
committed
Avoid dangling-pointer problem with partitionwise joins under GEQO.
build_child_join_sjinfo creates a derived SpecialJoinInfo in the short-lived GEQO context, but afterwards the semi_rhs_exprs from that may be used in a UniquePath for a child base relation. This breaks the expectation that all base-relation-level structures are in the planning-lifespan context, leading to use of a dangling pointer with probable ensuing crash later on in create_unique_plan. To fix, copy the expression trees when making a UniquePath. Per bug #18360 from Alexander Lakhin. This has been broken since partitionwise joins were added, so back-patch to all supported branches. Discussion: https://postgr.es/m/18360-a23caf3157f34e62@postgresql.org
1 parent 3ffcd24 commit cf807eb

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

src/backend/optimizer/util/pathnode.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,8 +1647,13 @@ create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath,
16471647
pathnode->path.pathkeys = NIL;
16481648

16491649
pathnode->subpath = subpath;
1650-
pathnode->in_operators = sjinfo->semi_operators;
1651-
pathnode->uniq_exprs = sjinfo->semi_rhs_exprs;
1650+
1651+
/*
1652+
* Under GEQO, the sjinfo might be short-lived, so we'd better make copies
1653+
* of data structures we extract from it.
1654+
*/
1655+
pathnode->in_operators = copyObject(sjinfo->semi_operators);
1656+
pathnode->uniq_exprs = copyObject(sjinfo->semi_rhs_exprs);
16521657

16531658
/*
16541659
* If the input is a relation and it has a unique index that proves the

0 commit comments

Comments
 (0)