From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: 0xPoe <poe.liu@pm.me>
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)

