diff options
author | Richard Guo <rguo@postgresql.org> | 2025-08-29 13:14:12 +0900 |
---|---|---|
committer | Richard Guo <rguo@postgresql.org> | 2025-08-29 13:14:12 +0900 |
commit | 97b0f36bde9a08bc6f004438ff8fc0afbcb418c0 (patch) | |
tree | 207c4d4099365a00108bb7f35c5ba99c4be7868f /src/backend/optimizer/plan/planner.c | |
parent | fabd8b8e2a72bac9e5a361856a355bd5bb2e61b8 (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.c | 9 |
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 |