summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
authorRichard Guo <rguo@postgresql.org>2025-08-29 13:14:12 +0900
committerRichard Guo <rguo@postgresql.org>2025-08-29 13:14:12 +0900
commit97b0f36bde9a08bc6f004438ff8fc0afbcb418c0 (patch)
tree207c4d4099365a00108bb7f35c5ba99c4be7868f /src/backend/optimizer/plan/planner.c
parentfabd8b8e2a72bac9e5a361856a355bd5bb2e61b8 (diff)
Fix semijoin unique-ification for child relations
For a child relation, we should not assume that its parent's unique-ified relation (or unique-ified path in v18) always exists. In cases where all RHS columns that need to be unique-ified are equated to constants, the unique-ified relation/path for the parent table is not built, as there are no columns left to unique-ify. Failing to account for this can result in a SIGSEGV crash during planning. This patch checks whether the parent's unique-ified relation or path exists and skips unique-ification of the child relation if it does not. Author: Richard Guo <guofenglinux@gmail.com> Discussion: https://postgr.es/m/CAMbWs49MOdLW2c+qbLHHBt8VBu=4ONpM91D19=AWeW93eFUF6A@mail.gmail.com Backpatch-through: 18
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index a8c8edfac75..41bd8353430 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8308,6 +8308,15 @@ create_unique_paths(PlannerInfo *root, RelOptInfo *rel, SpecialJoinInfo *sjinfo)
return NULL;
/*
+ * Punt if this is a child relation and we failed to build a unique-ified
+ * relation for its parent. This can happen if all the RHS columns were
+ * found to be equated to constants when unique-ifying the parent table,
+ * leaving no columns to unique-ify.
+ */
+ if (IS_OTHER_REL(rel) && rel->top_parent->unique_rel == NULL)
+ return NULL;
+
+ /*
* When called during GEQO join planning, we are in a short-lived memory
* context. We must make sure that the unique rel and any subsidiary data
* structures created for a baserel survive the GEQO cycle, else the