From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: 0xPoe Date: Wed, 28 Oct 2026 21:09:37 +0100 Subject: [PATCH v1] Build subquery RTEs directly for ANY sublinks Build the RTE directly in convert_ANY_sublink_to_join() to avoid a dummy ParseState and unused parser namespace structures. Keep the existing column names, alias, and flags. No behavior change is intended. Discussion: https://postgr.es/m/CAMbWs48iucjHBsVEeOsxAW8PwMYuB9nkBXKJTTFU29HWuRXBZw@mail.gmail.com --- src/backend/optimizer/plan/subselect.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 1b66906ad11b4f9182e9733435b4f5f551a98834..cb821c75512a3a1defa7c014bfcb008ca8935e30 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -33,7 +33,6 @@ #include "optimizer/planner.h" #include "optimizer/prep.h" #include "optimizer/subselect.h" -#include "parser/parse_relation.h" #include "rewrite/rewriteManip.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -1361,12 +1360,11 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, Query *subselect = (Query *) sublink->subselect; Relids upper_varnos; int rtindex; - ParseNamespaceItem *nsitem; RangeTblEntry *rte; + List *colnames; RangeTblRef *rtr; List *subquery_vars; Node *quals; - ParseState *pstate; Relids sub_ref_outer_relids; bool use_lateral; @@ -1420,9 +1418,6 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, if (contain_volatile_functions(sublink->testexpr)) return NULL; - /* Create a dummy ParseState for addRangeTableEntryForSubquery */ - pstate = make_parsestate(NULL); - /* * Okay, pull up the sub-select into upper range table. * @@ -1431,12 +1426,19 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, * below). Therefore this is a lot easier than what pull_up_subqueries has * to go through. */ - nsitem = addRangeTableEntryForSubquery(pstate, - subselect, - NULL, - use_lateral, - false); - rte = nsitem->p_rte; + rte = makeNode(RangeTblEntry); + rte->rtekind = RTE_SUBQUERY; + rte->subquery = subselect; + rte->alias = NULL; + colnames = NIL; + foreach_node(TargetEntry, tle, subselect->targetList) + { + if (!tle->resjunk) + colnames = lappend(colnames, makeString(pstrdup(tle->resname))); + } + rte->eref = makeAlias("unnamed_subquery", colnames); + rte->lateral = use_lateral; + rte->inFromCl = false; parse->rtable = lappend(parse->rtable, rte); rtindex = list_length(parse->rtable); base-commit: 700b422af7e26cf310caf3fb76d78f4c8ca39c1f -- 2.54.0 (Apple Git-157)