agora inbox for pgsql-committers@postgresql.orghelp / color / mirror / Atom feed
pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi 7+ messages / 1 participants [nested] [flat]
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/35d3f2069a3c842665bbc020295fb165dcb2b6ec Modified Files -------------- src/backend/optimizer/plan/createplan.c | 37 ++++++++- src/test/regress/expected/partition_join.out | 112 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 ++++++++++ 3 files changed, 188 insertions(+), 4 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_19_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/729e4a322786381c68b83d014f8ad5be300b942f Modified Files -------------- src/backend/optimizer/plan/createplan.c | 37 ++++++++- src/test/regress/expected/partition_join.out | 112 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 ++++++++++ 3 files changed, 188 insertions(+), 4 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_18_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/e0f5f79d2f69be061646c685e3a1a6851e742743 Modified Files -------------- src/backend/optimizer/plan/createplan.c | 37 ++++++++- src/test/regress/expected/partition_join.out | 112 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 ++++++++++ 3 files changed, 188 insertions(+), 4 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_17_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/f2e9e3aa1237611bc18c2b0742f019eea59c7364 Modified Files -------------- src/backend/optimizer/plan/createplan.c | 18 +++-- src/test/regress/expected/partition_join.out | 111 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 +++++++++++ 3 files changed, 167 insertions(+), 5 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_16_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/071fb9af2dc54b218ff29bc21187cd70698feb3d Modified Files -------------- src/backend/optimizer/plan/createplan.c | 18 +++-- src/test/regress/expected/partition_join.out | 111 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 +++++++++++ 3 files changed, 167 insertions(+), 5 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_15_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/a9875e35eed18d1db251f6c8246242c404709b40 Modified Files -------------- src/backend/optimizer/plan/createplan.c | 18 +++-- src/test/regress/expected/partition_join.out | 111 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 +++++++++++ 3 files changed, 167 insertions(+), 5 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
* pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi @ 2026-09-08 01:14 Richard Guo <rguo@postgresql.org> 0 siblings, 0 replies; 7+ messages in thread From: Richard Guo @ 2026-09-08 01:14 UTC (permalink / raw) To: pgsql-committers@lists.postgresql.org Fix nestloop parameter handling for PlaceHolderVars in child joins When creating a nestloop plan for a partitionwise child join, the outer rel's relids are child relids, but PlaceHolderInfo.ph_eval_at is always expressed in terms of the topmost parent rels. As a result, replace_nestloop_params() and identify_current_nestloop_params() failed to recognize that a PlaceHolderVar evaluated at the outer child rel can be supplied as a nestloop param. Instead, the Vars within the PHV's expression were replaced with params, but the outer child rel emits only the PHV, not those bare Vars, leading to "variable not found in subplan target list" errors from setrefs.c. To fix, also include the outer rel's top parent relids in the relid set used for these checks, so that ph_eval_at comparisons are done in terms of parent rels while Var checks continue to work in terms of child rels. On v18 and later, the required-outer set passed to identify_current_nestloop_params() has the same problem: it is in terms of child rels once a parameterized child join path has been reparameterized by an upper child join. With the above fix in place, a PlaceHolderVar that depends on both the outer rel and the parameter source becomes a single NestLoopParam, and that param was never claimed by any nestloop node, leading to "failed to assign all NestLoopParams to plan nodes" errors. To fix, also include the top parents of any child rels in that set. Older branches lack this code path, so they receive only the first change. Back-patch to all supported branches. Bug: #19653 Reported-by: Annie <10215501441@stu.ecnu.edu.cn> Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/19653-9352cc6ba17b662f@postgresql.org Backpatch-through: 14 Branch ------ REL_14_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/627081c73932ce9c2c70f6660bf8de320c0c40f7 Modified Files -------------- src/backend/optimizer/plan/createplan.c | 18 +++-- src/test/regress/expected/partition_join.out | 111 +++++++++++++++++++++++++++ src/test/regress/sql/partition_join.sql | 43 +++++++++++ 3 files changed, 167 insertions(+), 5 deletions(-) ^ permalink raw reply [nested|flat] 7+ messages in thread
end of thread, other threads:[~2026-09-08 01:14 UTC | newest] Thread overview: 7+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org> 2026-09-08 01:14 pgsql: Fix nestloop parameter handling for PlaceHolderVars in child joi Richard Guo <rguo@postgresql.org>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox