agora inbox for pgsql-hackers@postgresql.org  
help / color / mirror / Atom feed
[PATCH v34 08/11] Add aggregates support in IVM
358+ messages / 4 participants
[nested] [flat]

* [PATCH v34 08/11] Add aggregates support in IVM
@ 2023-05-31 11:46 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2023-05-31 11:46 UTC (permalink / raw)

count, sum, adn avg are supported.

As a restriction, expressions specified in GROUP BY must appear in
the target list because tuples to be updated in IMMV are identified
by using this group key. However, in the case of aggregates without
GROUP BY, there is only one tuple in the view, so keys are not uses
to identify tuples.

When creating a IMMV, in addition to __ivm_count column, some hidden
columns for each aggregate are added to the target list. For example,
names of these hidden columns are ivm_count_avg and ivm_sum_avg for
the average function, and so on.

When a base table is modified, the aggregated values and related
hidden columns are also updated as well as __ivm_count__. The
way of update depends the kind of aggregate function.=E3=80=80Specifically,
sum and count are updated by simply adding or subtracting delta value
calculated from delta tables. avg is updated by using values of sum
and count stored in views as hidden columns and deltas calculated
from delta tables.

About aggregate functions except "count()" (sum and avg), NULLs in input
values are ignored, and the result of aggegate should be NULL when no
rows are selected.  To support this specification, the numbers of non-NULL
input values are counted and stored in hidden columns. In the case of
count(), count(x) returns zero when no rows are selected, but count(*)
doesn't ignore NULL input.
---
 src/backend/commands/createas.c | 265 +++++++++++++++++--
 src/backend/commands/matview.c  | 433 ++++++++++++++++++++++++++++++--
 src/include/commands/createas.h |   1 +
 3 files changed, 662 insertions(+), 37 deletions(-)

diff --git a/src/backend/commands/createas.c b/src/backend/commands/createa=
s.c
index 7138dd59ce..d8767137d9 100644
--- a/src/backend/commands/createas.c
+++ b/src/backend/commands/createas.c
@@ -51,13 +51,19 @@
 #include "parser/parsetree.h"
 #include "parser/parse_clause.h"
 #include "parser/parse_func.h"
+#include "parser/parse_type.h"
 #include "rewrite/rewriteHandler.h"
+#include "rewrite/rewriteManip.h"
+#include "storage/smgr.h"
 #include "tcop/tcopprot.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
+#include "utils/regproc.h"
+#include "utils/fmgroids.h"
 #include "utils/rel.h"
 #include "utils/rls.h"
 #include "utils/snapmgr.h"
+#include "utils/syscache.h"
=20
 typedef struct
 {
@@ -71,6 +77,11 @@ typedef struct
 	BulkInsertState bistate;	/* bulk insert state */
 } DR_intorel;
=20
+typedef struct
+{
+	bool	has_agg;
+} check_ivm_restriction_context;
+
 /* utility functions for CTAS definition creation */
 static ObjectAddress create_ctas_internal(List *attrList, IntoClause *into=
);
 static ObjectAddress create_ctas_nodata(List *tlist, IntoClause *into);
@@ -85,8 +96,9 @@ static void CreateIvmTriggersOnBaseTablesRecurse(Query *q=
ry, Node *node, Oid mat
 									 Relids *relids, bool ex_lock);
 static void CreateIvmTrigger(Oid relOid, Oid viewOid, int16 type, int16 ti=
ming, bool ex_lock);
 static void check_ivm_restriction(Node *node);
-static bool check_ivm_restriction_walker(Node *node, void *context);
+static bool check_ivm_restriction_walker(Node *node, check_ivm_restriction=
_context *context);
 static Bitmapset *get_primary_key_attnos_from_query(Query *query, List **c=
onstraintList);
+static bool check_aggregate_supports_ivm(Oid aggfnoid);
=20
 /*
  * create_ctas_internal
@@ -417,6 +429,7 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt=
 *stmt,
  * rewriteQueryForIMMV -- rewrite view definition query for IMMV
  *
  * count(*) is added for counting distinct tuples in views.
+ * Also, additional hidden columns are added for aggregate values.
  */
 Query *
 rewriteQueryForIMMV(Query *query, List *colNames)
@@ -430,16 +443,49 @@ rewriteQueryForIMMV(Query *query, List *colNames)
 	rewritten =3D copyObject(query);
 	pstate->p_expr_kind =3D EXPR_KIND_SELECT_TARGET;
=20
-	/*
-	 * Convert DISTINCT to GROUP BY and add count(*) for counting distinct
-	 * tuples in views.
-	 */
-	if (rewritten->distinctClause)
+	/* group keys must be in targetlist */
+	if (rewritten->groupClause)
 	{
-		TargetEntry *tle;
+		ListCell *lc;
+		foreach(lc, rewritten->groupClause)
+		{
+			SortGroupClause *scl =3D (SortGroupClause *) lfirst(lc);
+			TargetEntry *tle =3D get_sortgroupclause_tle(scl, rewritten->targetList=
);
=20
+			if (tle->resjunk)
+				ereport(ERROR,
+						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+						 errmsg("GROUP BY expression not appearing in select list is not sup=
ported on incrementally maintainable materialized view")));
+		}
+	}
+	/* Convert DISTINCT to GROUP BY.  count(*) will be added afterward. */
+	else if (!rewritten->hasAggs && rewritten->distinctClause)
 		rewritten->groupClause =3D transformDistinctClause(NULL, &rewritten->tar=
getList, rewritten->sortClause, false);
=20
+	/* Add additional columns for aggregate values */
+	if (rewritten->hasAggs)
+	{
+		ListCell *lc;
+		List *aggs =3D NIL;
+		AttrNumber next_resno =3D list_length(rewritten->targetList) + 1;
+
+		foreach(lc, rewritten->targetList)
+		{
+			TargetEntry *tle =3D (TargetEntry *) lfirst(lc);
+			char *resname =3D (colNames =3D=3D NIL || foreach_current_index(lc) >=
=3D list_length(colNames) ?
+								tle->resname : strVal(list_nth(colNames, tle->resno - 1)));
+
+			if (IsA(tle->expr, Aggref))
+				makeIvmAggColumn(pstate, (Aggref *) tle->expr, resname, &next_resno, &=
aggs);
+		}
+		rewritten->targetList =3D list_concat(rewritten->targetList, aggs);
+	}
+
+	/* Add count(*) for counting distinct tuples in views */
+	if (rewritten->distinctClause || rewritten->hasAggs)
+	{
+		TargetEntry *tle;
+
 		fn =3D makeFuncCall(SystemFuncName("count"), NIL, COERCE_EXPLICIT_CALL, =
-1);
 		fn->agg_star =3D true;
=20
@@ -456,6 +502,91 @@ rewriteQueryForIMMV(Query *query, List *colNames)
 	return rewritten;
 }
=20
+/*
+ * makeIvmAggColumn -- make additional aggregate columns for IVM
+ *
+ * For an aggregate column specified by aggref, additional aggregate colum=
ns
+ * are added, which are used to calculate the new aggregate value in IMMV.
+ * An additional aggregate columns has a name based on resname
+ * (ex. ivm_count_resname), and resno specified by next_resno. The created
+ * columns are returned to aggs, and the resno for the next column is also
+ * returned to next_resno.
+ *
+ * Currently, an additional count() is created for aggref other than count.
+ * In addition, sum() is created for avg aggregate column.
+ */
+void
+makeIvmAggColumn(ParseState *pstate, Aggref *aggref, char *resname, AttrNu=
mber *next_resno, List **aggs)
+{
+	TargetEntry *tle_count;
+	Node *node;
+	FuncCall *fn;
+	Const	*dmy_arg =3D makeConst(INT4OID,
+								 -1,
+								 InvalidOid,
+								 sizeof(int32),
+								 Int32GetDatum(1),
+								 false,
+								 true); /* pass by value */
+	const char *aggname =3D get_func_name(aggref->aggfnoid);
+
+	/*
+	 * For aggregate functions except count, add count() func with the same a=
rg parameters.
+	 * This count result is used for determining if the aggregate value shoul=
d be NULL or not.
+	 * Also, add sum() func for avg because we need to calculate an average v=
alue as sum/count.
+	 *
+	 * XXX: If there are same expressions explicitly in the target list, we c=
an use this instead
+	 * of adding new duplicated one.
+	 */
+	if (strcmp(aggname, "count") !=3D 0)
+	{
+		fn =3D makeFuncCall(SystemFuncName("count"), NIL, COERCE_EXPLICIT_CALL, =
-1);
+
+		/* Make a Func with a dummy arg, and then override this by the original =
agg's args. */
+		node =3D ParseFuncOrColumn(pstate, fn->funcname, list_make1(dmy_arg), NU=
LL, fn, false, -1);
+		((Aggref *)node)->args =3D aggref->args;
+
+		tle_count =3D makeTargetEntry((Expr *) node,
+									*next_resno,
+									pstrdup(makeObjectName("__ivm_count",resname, "_")),
+									false);
+		*aggs =3D lappend(*aggs, tle_count);
+		(*next_resno)++;
+	}
+	if (strcmp(aggname, "avg") =3D=3D 0)
+	{
+		List *dmy_args =3D NIL;
+		ListCell *lc;
+		foreach(lc, aggref->aggargtypes)
+		{
+			Oid		typeid =3D lfirst_oid(lc);
+			Type	type =3D typeidType(typeid);
+
+			Const *con =3D makeConst(typeid,
+								   -1,
+								   typeTypeCollation(type),
+								   typeLen(type),
+								   (Datum) 0,
+								   true,
+								   typeByVal(type));
+			dmy_args =3D lappend(dmy_args, con);
+			ReleaseSysCache(type);
+		}
+		fn =3D makeFuncCall(SystemFuncName("sum"), NIL, COERCE_EXPLICIT_CALL, -1=
);
+
+		/* Make a Func with dummy args, and then override this by the original a=
gg's args. */
+		node =3D ParseFuncOrColumn(pstate, fn->funcname, dmy_args, NULL, fn, fal=
se, -1);
+		((Aggref *)node)->args =3D aggref->args;
+
+		tle_count =3D makeTargetEntry((Expr *) node,
+									*next_resno,
+									pstrdup(makeObjectName("__ivm_sum",resname, "_")),
+									false);
+		*aggs =3D lappend(*aggs, tle_count);
+		(*next_resno)++;
+	}
+}
+
 /*
  * GetIntoRelEFlags --- compute executor flags needed for CREATE TABLE AS
  *
@@ -939,11 +1070,13 @@ CreateIvmTrigger(Oid relOid, Oid viewOid, int16 type=
, int16 timing, bool ex_lock
 static void
 check_ivm_restriction(Node *node)
 {
-	check_ivm_restriction_walker(node, NULL);
+	check_ivm_restriction_context context =3D {false};
+
+	check_ivm_restriction_walker(node, &context);
 }
=20
 static bool
-check_ivm_restriction_walker(Node *node, void *context)
+check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *co=
ntext)
 {
 	if (node =3D=3D NULL)
 		return false;
@@ -972,6 +1105,10 @@ check_ivm_restriction_walker(Node *node, void *contex=
t)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 							 errmsg("CTE is not supported on incrementally maintainable materia=
lized view")));
+				if (qry->groupClause !=3D NIL && !qry->hasAggs)
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("GROUP BY clause without aggregate is not supported on incr=
ementally maintainable materialized view")));
 				if (qry->havingQual !=3D NULL)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1024,6 +1161,8 @@ check_ivm_restriction_walker(Node *node, void *contex=
t)
 					}
 				}
=20
+				context->has_agg |=3D qry->hasAggs;
+
 				/* restrictions for rtable */
 				foreach(lc, qry->rtable)
 				{
@@ -1072,7 +1211,7 @@ check_ivm_restriction_walker(Node *node, void *contex=
t)
=20
 				}
=20
-				query_tree_walker(qry, check_ivm_restriction_walker, NULL, QTW_IGNORE_=
RANGE_TABLE);
+				query_tree_walker(qry, check_ivm_restriction_walker, (void *) context,=
 QTW_IGNORE_RANGE_TABLE);
=20
 				break;
 			}
@@ -1083,8 +1222,12 @@ check_ivm_restriction_walker(Node *node, void *conte=
xt)
 						ereport(ERROR,
 								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 								 errmsg("column name %s is not supported on incrementally maintain=
able materialized view", tle->resname)));
+				if (context->has_agg && !IsA(tle->expr, Aggref) && contain_aggs_of_lev=
el((Node *) tle->expr, 0))
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("expression containing an aggregate in it is not supported =
on incrementally maintainable materialized view")));
=20
-				expression_tree_walker(node, check_ivm_restriction_walker, NULL);
+				expression_tree_walker(node, check_ivm_restriction_walker, (void *) co=
ntext);
 				break;
 			}
 		case T_JoinExpr:
@@ -1096,14 +1239,36 @@ check_ivm_restriction_walker(Node *node, void *cont=
ext)
 								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 								 errmsg("OUTER JOIN is not supported on incrementally maintainable=
 materialized view")));
=20
-				expression_tree_walker(node, check_ivm_restriction_walker, NULL);
+				expression_tree_walker(node, check_ivm_restriction_walker, (void *) co=
ntext);
+				break;
 			}
-			break;
 		case T_Aggref:
-			ereport(ERROR,
-					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 errmsg("aggregate function is not supported on incrementally maintai=
nable materialized view")));
-			break;
+			{
+				/* Check if this supports IVM */
+				Aggref *aggref =3D (Aggref *) node;
+				const char *aggname =3D format_procedure(aggref->aggfnoid);
+
+				if (aggref->aggfilter !=3D NULL)
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("aggregate function with FILTER clause is not supported on =
incrementally maintainable materialized view")));
+
+				if (aggref->aggdistinct !=3D NULL)
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("aggregate function with DISTINCT arguments is not supporte=
d on incrementally maintainable materialized view")));
+
+				if (aggref->aggorder !=3D NULL)
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("aggregate function with ORDER clause is not supported on i=
ncrementally maintainable materialized view")));
+
+				if (!check_aggregate_supports_ivm(aggref->aggfnoid))
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("aggregate function %s is not supported on incrementally ma=
intainable materialized view", aggname)));
+				break;
+			}
 		default:
 			expression_tree_walker(node, check_ivm_restriction_walker, (void *) con=
text);
 			break;
@@ -1111,6 +1276,46 @@ check_ivm_restriction_walker(Node *node, void *conte=
xt)
 	return false;
 }
=20
+/*
+ * check_aggregate_supports_ivm
+ *
+ * Check if the given aggregate function is supporting IVM
+ */
+static bool
+check_aggregate_supports_ivm(Oid aggfnoid)
+{
+	switch (aggfnoid)
+	{
+		/* count */
+		case F_COUNT_ANY:
+		case F_COUNT_:
+
+		/* sum */
+		case F_SUM_INT8:
+		case F_SUM_INT4:
+		case F_SUM_INT2:
+		case F_SUM_FLOAT4:
+		case F_SUM_FLOAT8:
+		case F_SUM_MONEY:
+		case F_SUM_INTERVAL:
+		case F_SUM_NUMERIC:
+
+		/* avg */
+		case F_AVG_INT8:
+		case F_AVG_INT4:
+		case F_AVG_INT2:
+		case F_AVG_NUMERIC:
+		case F_AVG_FLOAT4:
+		case F_AVG_FLOAT8:
+		case F_AVG_INTERVAL:
+
+			return true;
+
+		default:
+			return false;
+	}
+}
+
 /*
  * CreateIndexOnIMMV
  *
@@ -1168,7 +1373,29 @@ CreateIndexOnIMMV(Query *query, Relation matviewRel)
 	index->concurrent =3D false;
 	index->if_not_exists =3D false;
=20
-	if (query->distinctClause)
+	if (query->groupClause)
+	{
+		/* create unique constraint on GROUP BY expression columns */
+		foreach(lc, query->groupClause)
+		{
+			SortGroupClause *scl =3D (SortGroupClause *) lfirst(lc);
+			TargetEntry *tle =3D get_sortgroupclause_tle(scl, query->targetList);
+			Form_pg_attribute attr =3D TupleDescAttr(matviewRel->rd_att, tle->resno=
 - 1);
+			IndexElem  *iparam;
+
+			iparam =3D makeNode(IndexElem);
+			iparam->name =3D pstrdup(NameStr(attr->attname));
+			iparam->expr =3D NULL;
+			iparam->indexcolname =3D NULL;
+			iparam->collation =3D NIL;
+			iparam->opclass =3D NIL;
+			iparam->opclassopts =3D NIL;
+			iparam->ordering =3D SORTBY_DEFAULT;
+			iparam->nulls_ordering =3D SORTBY_NULLS_DEFAULT;
+			index->indexParams =3D lappend(index->indexParams, iparam);
+		}
+	}
+	else if (query->distinctClause)
 	{
 		/* create unique constraint on all columns */
 		foreach(lc, query->targetList)
@@ -1226,7 +1453,7 @@ CreateIndexOnIMMV(Query *query, Relation matviewRel)
 					(errmsg("could not create an index on materialized view \"%s\" automa=
tically",
 							RelationGetRelationName(matviewRel)),
 					 errdetail("This target list does not have all the primary key column=
s, "
-							   "or this view does not contain DISTINCT clause."),
+							   "or this view does not contain GROUP BY or DISTINCT clause."),
 					 errhint("Create an index on the materialized view for efficient incr=
emental maintenance.")));
 			return;
 		}
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index bd7d65888d..ca6d236989 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_opclass.h"
 #include "commands/cluster.h"
+#include "commands/defrem.h"
 #include "commands/matview.h"
 #include "commands/tablecmds.h"
 #include "commands/tablespace.h"
@@ -36,6 +37,7 @@
 #include "executor/tstoreReceiver.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
+#include "optimizer/optimizer.h"
 #include "parser/analyze.h"
 #include "parser/parse_clause.h"
 #include "parser/parse_func.h"
@@ -107,6 +109,13 @@ static HTAB *mv_trigger_info =3D NULL;
=20
 static bool in_delta_calculation =3D false;
=20
+/* kind of IVM operation for the view */
+typedef enum
+{
+	IVM_ADD,
+	IVM_SUB
+} IvmOp;
+
 /* ENR name for materialized view delta */
 #define NEW_DELTA_ENRNAME "new_delta"
 #define OLD_DELTA_ENRNAME "old_delta"
@@ -138,7 +147,7 @@ static RangeTblEntry *get_prestate_rte(RangeTblEntry *r=
te, MV_TriggerTable *tabl
 				 QueryEnvironment *queryEnv, Oid matviewid);
 static RangeTblEntry *replace_rte_with_delta(RangeTblEntry *rte, MV_Trigge=
rTable *table, bool is_new,
 		   QueryEnvironment *queryEnv);
-static Query *rewrite_query_for_counting(Query *query, ParseState *pstate);
+static Query *rewrite_query_for_counting_and_aggregates(Query *query, Pars=
eState *pstate);
=20
 static void calc_delta(MV_TriggerTable *table, int rte_index, Query *query,
 			DestReceiver *dest_old, DestReceiver *dest_new,
@@ -149,14 +158,27 @@ static Query *rewrite_query_for_postupdate_state(Quer=
y *query, MV_TriggerTable *
 static void apply_delta(Oid matviewOid, Tuplestorestate *old_tuplestores, =
Tuplestorestate *new_tuplestores,
 			TupleDesc tupdesc_old, TupleDesc tupdesc_new,
 			Query *query, bool use_count, char *count_colname);
+static void append_set_clause_for_count(const char *resname, StringInfo bu=
f_old,
+							StringInfo buf_new,StringInfo aggs_list);
+static void append_set_clause_for_sum(const char *resname, StringInfo buf_=
old,
+						  StringInfo buf_new, StringInfo aggs_list);
+static void append_set_clause_for_avg(const char *resname, StringInfo buf_=
old,
+						  StringInfo buf_new, StringInfo aggs_list,
+						  const char *aggtype);
+static char *get_operation_string(IvmOp op, const char *col, const char *a=
rg1, const char *arg2,
+					 const char* count_col, const char *castType);
+static char *get_null_condition_string(IvmOp op, const char *arg1, const c=
har *arg2,
+						  const char* count_col);
 static void apply_old_delta(const char *matviewname, const char *deltaname=
_old,
 				List *keys);
 static void apply_old_delta_with_count(const char *matviewname, const char=
 *deltaname_old,
-				List *keys, const char *count_colname);
+				List *keys, StringInfo aggs_list, StringInfo aggs_set,
+				const char *count_colname);
 static void apply_new_delta(const char *matviewname, const char *deltaname=
_new,
 				StringInfo target_list);
 static void apply_new_delta_with_count(const char *matviewname, const char=
* deltaname_new,
-				List *keys, StringInfo target_list, const char* count_colname);
+				List *keys, StringInfo target_list, StringInfo aggs_set,
+				const char* count_colname);
 static char *get_matching_condition_string(List *keys);
 static void generate_equal(StringInfo querybuf, Oid opttype,
 			   const char *leftop, const char *rightop);
@@ -1454,11 +1476,44 @@ IVM_immediate_maintenance(PG_FUNCTION_ARGS)
 	 * When a base table is truncated, the view content will be empty if the
 	 * view definition query does not contain an aggregate without a GROUP cl=
ause.
 	 * Therefore, such views can be truncated.
+	 *
+	 * Aggregate views without a GROUP clause always have one row. Therefore,
+	 * if a base table is truncated, the view will not be empty and will cont=
ain
+	 * a row with NULL value (or 0 for count()). So, in this case, we refresh=
 the
+	 * view instead of truncating it.
 	 */
 	if (TRIGGER_FIRED_BY_TRUNCATE(trigdata->tg_event))
 	{
-		ExecuteTruncateGuts(list_make1(matviewRel), list_make1_oid(matviewOid),
-							NIL, DROP_RESTRICT, false, false);
+		if (!(query->hasAggs && query->groupClause =3D=3D NIL))
+			ExecuteTruncateGuts(list_make1(matviewRel), list_make1_oid(matviewOid),
+								NIL, DROP_RESTRICT, false, false);
+		else
+		{
+			Oid			OIDNewHeap;
+			DestReceiver *dest;
+			uint64		processed =3D 0;
+			Query	   *dataQuery =3D rewriteQueryForIMMV(query, NIL);
+			char		relpersistence =3D matviewRel->rd_rel->relpersistence;
+
+			/*
+			 * Create the transient table that will receive the regenerated data. L=
ock
+			 * it against access by any other process until commit (by which time it
+			 * will be gone).
+			 */
+			OIDNewHeap =3D make_new_heap(matviewOid, matviewRel->rd_rel->reltablesp=
ace,
+									   matviewRel->rd_rel->relam,
+									   relpersistence,  ExclusiveLock);
+			LockRelationOid(OIDNewHeap, AccessExclusiveLock);
+			dest =3D CreateTransientRelDestReceiver(OIDNewHeap);
+
+			/* Generate the data */
+			processed =3D refresh_matview_datafill(dest, dataQuery, NULL, NULL, "");
+			refresh_by_heap_swap(matviewOid, OIDNewHeap, relpersistence);
+
+			/* Inform cumulative stats system about our activity */
+			pgstat_count_truncate(matviewRel);
+			pgstat_count_heap_insert(matviewRel, processed);
+		}
=20
 		/* Clean up hash entry and delete tuplestores */
 		clean_up_IVM_hash_entry(entry, false);
@@ -1498,8 +1553,8 @@ IVM_immediate_maintenance(PG_FUNCTION_ARGS)
 	/* Set all tables in the query to pre-update state */
 	rewritten =3D rewrite_query_for_preupdate_state(rewritten, entry->tables,
 												  pstate, matviewOid);
-	/* Rewrite for counting duplicated tuples */
-	rewritten =3D rewrite_query_for_counting(rewritten, pstate);
+	/* Rewrite for counting duplicated tuples and aggregates functions*/
+	rewritten =3D rewrite_query_for_counting_and_aggregates(rewritten, pstate=
);
=20
 	/* Create tuplestores to store view deltas */
 	if (entry->has_old)
@@ -1550,7 +1605,7 @@ IVM_immediate_maintenance(PG_FUNCTION_ARGS)
=20
 			count_colname =3D pstrdup("__ivm_count__");
=20
-			if (query->distinctClause)
+			if (query->hasAggs || query->distinctClause)
 				use_count =3D true;
=20
 			/* calculate delta tables */
@@ -1946,17 +2001,34 @@ replace_rte_with_delta(RangeTblEntry *rte, MV_Trigg=
erTable *table, bool is_new,
 }
=20
 /*
- * rewrite_query_for_counting
+ * rewrite_query_for_counting_and_aggregates
  *
- * Rewrite query for counting duplicated tuples.
+ * Rewrite query for counting duplicated tuples and aggregate functions.
  */
 static Query *
-rewrite_query_for_counting(Query *query, ParseState *pstate)
+rewrite_query_for_counting_and_aggregates(Query *query, ParseState *pstate)
 {
 	TargetEntry *tle_count;
 	FuncCall *fn;
 	Node *node;
=20
+	/* For aggregate views */
+	if (query->hasAggs)
+	{
+		ListCell *lc;
+		List *aggs =3D NIL;
+		AttrNumber next_resno =3D list_length(query->targetList) + 1;
+
+		foreach(lc, query->targetList)
+		{
+			TargetEntry *tle =3D (TargetEntry *) lfirst(lc);
+
+			if (IsA(tle->expr, Aggref))
+				makeIvmAggColumn(pstate, (Aggref *)tle->expr, tle->resname, &next_resn=
o, &aggs);
+		}
+		query->targetList =3D list_concat(query->targetList, aggs);
+	}
+
 	/* Add count(*) for counting distinct tuples in views */
 	fn =3D makeFuncCall(SystemFuncName("count"), NIL, COERCE_EXPLICIT_CALL, -=
1);
 	fn->agg_star =3D true;
@@ -2029,6 +2101,8 @@ rewrite_query_for_postupdate_state(Query *query, MV_T=
riggerTable *table, int rte
 	return query;
 }
=20
+#define IVM_colname(type, col) makeObjectName("__ivm_" type, col, "_")
+
 /*
  * apply_delta
  *
@@ -2042,6 +2116,9 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tupl=
estores, Tuplestorestate *n
 {
 	StringInfoData querybuf;
 	StringInfoData target_list_buf;
+	StringInfo	aggs_list_buf =3D NULL;
+	StringInfo	aggs_set_old =3D NULL;
+	StringInfo	aggs_set_new =3D NULL;
 	Relation	matviewRel;
 	char	   *matviewname;
 	ListCell	*lc;
@@ -2064,6 +2141,15 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tup=
lestores, Tuplestorestate *n
 	initStringInfo(&querybuf);
 	initStringInfo(&target_list_buf);
=20
+	if (query->hasAggs)
+	{
+		if (old_tuplestores && tuplestore_tuple_count(old_tuplestores) > 0)
+			aggs_set_old =3D makeStringInfo();
+		if (new_tuplestores && tuplestore_tuple_count(new_tuplestores) > 0)
+			aggs_set_new =3D makeStringInfo();
+		aggs_list_buf =3D makeStringInfo();
+	}
+
 	/* build string of target list */
 	for (i =3D 0; i < matviewRel->rd_att->natts; i++)
 	{
@@ -2080,13 +2166,61 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tu=
plestores, Tuplestorestate *n
 	{
 		TargetEntry *tle =3D (TargetEntry *) lfirst(lc);
 		Form_pg_attribute attr =3D TupleDescAttr(matviewRel->rd_att, i);
+		char *resname =3D NameStr(attr->attname);
=20
 		i++;
=20
 		if (tle->resjunk)
 			continue;
=20
-		keys =3D lappend(keys, attr);
+		/*
+		 * For views without aggregates, all attributes are used as keys to iden=
tify a
+		 * tuple in a view.
+		 */
+		if (!query->hasAggs)
+			keys =3D lappend(keys, attr);
+
+		/* For views with aggregates, we need to build SET clause for updating a=
ggregate
+		 * values. */
+		if (query->hasAggs && IsA(tle->expr, Aggref))
+		{
+			Aggref *aggref =3D (Aggref *) tle->expr;
+			const char *aggname =3D get_func_name(aggref->aggfnoid);
+
+			/*
+			 * We can use function names here because it is already checked if these
+			 * can be used in IMMV by its OID at the definition time.
+			 */
+
+			/* count */
+			if (!strcmp(aggname, "count"))
+				append_set_clause_for_count(resname, aggs_set_old, aggs_set_new, aggs_=
list_buf);
+
+			/* sum */
+			else if (!strcmp(aggname, "sum"))
+				append_set_clause_for_sum(resname, aggs_set_old, aggs_set_new, aggs_li=
st_buf);
+
+			/* avg */
+			else if (!strcmp(aggname, "avg"))
+				append_set_clause_for_avg(resname, aggs_set_old, aggs_set_new, aggs_li=
st_buf,
+										  format_type_be(aggref->aggtype));
+
+			else
+				elog(ERROR, "unsupported aggregate function: %s", aggname);
+		}
+	}
+
+	/* If we have GROUP BY clause, we use its entries as keys. */
+	if (query->hasAggs && query->groupClause)
+	{
+		foreach (lc, query->groupClause)
+		{
+			SortGroupClause *sgcl =3D (SortGroupClause *) lfirst(lc);
+			TargetEntry		*tle =3D get_sortgroupclause_tle(sgcl, query->targetList);
+			Form_pg_attribute attr =3D TupleDescAttr(matviewRel->rd_att, tle->resno=
 - 1);
+
+			keys =3D lappend(keys, attr);
+		}
 	}
=20
 	/* Start maintaining the materialized view. */
@@ -2117,7 +2251,8 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tupl=
estores, Tuplestorestate *n
 		if (use_count)
 			/* apply old delta and get rows to be recalculated */
 			apply_old_delta_with_count(matviewname, OLD_DELTA_ENRNAME,
-									   keys, count_colname);
+									   keys, aggs_list_buf, aggs_set_old,
+									   count_colname);
 		else
 			apply_old_delta(matviewname, OLD_DELTA_ENRNAME, keys);
=20
@@ -2143,7 +2278,7 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tupl=
estores, Tuplestorestate *n
 		/* apply new delta */
 		if (use_count)
 			apply_new_delta_with_count(matviewname, NEW_DELTA_ENRNAME,
-								keys, &target_list_buf, count_colname);
+								keys, aggs_set_new, &target_list_buf, count_colname);
 		else
 			apply_new_delta(matviewname, NEW_DELTA_ENRNAME, &target_list_buf);
 	}
@@ -2158,6 +2293,250 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tu=
plestores, Tuplestorestate *n
 		elog(ERROR, "SPI_finish failed");
 }
=20
+/*
+ * append_set_clause_for_count
+ *
+ * Append SET clause string for count aggregation to given buffers.
+ * Also, append resnames required for calculating the aggregate value.
+ */
+static void
+append_set_clause_for_count(const char *resname, StringInfo buf_old,
+							StringInfo buf_new,StringInfo aggs_list)
+{
+	/* For tuple deletion */
+	if (buf_old)
+	{
+		/* resname =3D mv.resname - t.resname */
+		appendStringInfo(buf_old,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_SUB, resname, "mv", "t", NULL, NULL));
+	}
+	/* For tuple insertion */
+	if (buf_new)
+	{
+		/* resname =3D mv.resname + diff.resname */
+		appendStringInfo(buf_new,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_ADD, resname, "mv", "diff", NULL, NULL));
+	}
+
+	appendStringInfo(aggs_list, ", %s",
+		quote_qualified_identifier("diff", resname)
+	);
+}
+
+/*
+ * append_set_clause_for_sum
+ *
+ * Append SET clause string for sum aggregation to given buffers.
+ * Also, append resnames required for calculating the aggregate value.
+ */
+static void
+append_set_clause_for_sum(const char *resname, StringInfo buf_old,
+						  StringInfo buf_new, StringInfo aggs_list)
+{
+	char *count_col =3D IVM_colname("count", resname);
+
+	/* For tuple deletion */
+	if (buf_old)
+	{
+		/* sum =3D mv.sum - t.sum */
+		appendStringInfo(buf_old,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_SUB, resname, "mv", "t", count_col, NULL)
+		);
+		/* count =3D mv.count - t.count */
+		appendStringInfo(buf_old,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, count_col),
+			get_operation_string(IVM_SUB, count_col, "mv", "t", NULL, NULL)
+		);
+	}
+	/* For tuple insertion */
+	if (buf_new)
+	{
+		/* sum =3D mv.sum + diff.sum */
+		appendStringInfo(buf_new,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_ADD, resname, "mv", "diff", count_col, NULL)
+		);
+		/* count =3D mv.count + diff.count */
+		appendStringInfo(buf_new,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, count_col),
+			get_operation_string(IVM_ADD, count_col, "mv", "diff", NULL, NULL)
+		);
+	}
+
+	appendStringInfo(aggs_list, ", %s, %s",
+		quote_qualified_identifier("diff", resname),
+		quote_qualified_identifier("diff", IVM_colname("count", resname))
+	);
+}
+
+/*
+ * append_set_clause_for_avg
+ *
+ * Append SET clause string for avg aggregation to given buffers.
+ * Also, append resnames required for calculating the aggregate value.
+ */
+static void
+append_set_clause_for_avg(const char *resname, StringInfo buf_old,
+						  StringInfo buf_new, StringInfo aggs_list,
+						  const char *aggtype)
+{
+	char *sum_col =3D IVM_colname("sum", resname);
+	char *count_col =3D IVM_colname("count", resname);
+
+	/* For tuple deletion */
+	if (buf_old)
+	{
+		/* avg =3D (mv.sum - t.sum)::aggtype / (mv.count - t.count) */
+		appendStringInfo(buf_old,
+			", %s =3D %s OPERATOR(pg_catalog./) %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_SUB, sum_col, "mv", "t", count_col, aggtype),
+			get_operation_string(IVM_SUB, count_col, "mv", "t", NULL, NULL)
+		);
+		/* sum =3D mv.sum - t.sum */
+		appendStringInfo(buf_old,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, sum_col),
+			get_operation_string(IVM_SUB, sum_col, "mv", "t", count_col, NULL)
+		);
+		/* count =3D mv.count - t.count */
+		appendStringInfo(buf_old,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, count_col),
+			get_operation_string(IVM_SUB, count_col, "mv", "t", NULL, NULL)
+		);
+
+	}
+	/* For tuple insertion */
+	if (buf_new)
+	{
+		/* avg =3D (mv.sum + diff.sum)::aggtype / (mv.count + diff.count) */
+		appendStringInfo(buf_new,
+			", %s =3D %s OPERATOR(pg_catalog./) %s",
+			quote_qualified_identifier(NULL, resname),
+			get_operation_string(IVM_ADD, sum_col, "mv", "diff", count_col, aggtype=
),
+			get_operation_string(IVM_ADD, count_col, "mv", "diff", NULL, NULL)
+		);
+		/* sum =3D mv.sum + diff.sum */
+		appendStringInfo(buf_new,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, sum_col),
+			get_operation_string(IVM_ADD, sum_col, "mv", "diff", count_col, NULL)
+		);
+		/* count =3D mv.count + diff.count */
+		appendStringInfo(buf_new,
+			", %s =3D %s",
+			quote_qualified_identifier(NULL, count_col),
+			get_operation_string(IVM_ADD, count_col, "mv", "diff", NULL, NULL)
+		);
+	}
+
+	appendStringInfo(aggs_list, ", %s, %s, %s",
+		quote_qualified_identifier("diff", resname),
+		quote_qualified_identifier("diff", IVM_colname("sum", resname)),
+		quote_qualified_identifier("diff", IVM_colname("count", resname))
+	);
+}
+
+/*
+ * get_operation_string
+ *
+ * Build a string to calculate the new aggregate values.
+ */
+static char *
+get_operation_string(IvmOp op, const char *col, const char *arg1, const ch=
ar *arg2,
+					 const char* count_col, const char *castType)
+{
+	StringInfoData buf;
+	StringInfoData castString;
+	char   *col1 =3D quote_qualified_identifier(arg1, col);
+	char   *col2 =3D quote_qualified_identifier(arg2, col);
+	char	op_char =3D (op =3D=3D IVM_SUB ? '-' : '+');
+
+	initStringInfo(&buf);
+	initStringInfo(&castString);
+
+	if (castType)
+		appendStringInfo(&castString, "::%s", castType);
+
+	if (!count_col)
+	{
+		/*
+		 * If the attributes don't have count columns then calc the result
+		 * by using the operator simply.
+		 */
+		appendStringInfo(&buf, "(%s OPERATOR(pg_catalog.%c) %s)%s",
+			col1, op_char, col2, castString.data);
+	}
+	else
+	{
+		/*
+		 * If the attributes have count columns then consider the condition
+		 * where the result becomes NULL.
+		 */
+		char *null_cond =3D get_null_condition_string(op, arg1, arg2, count_col);
+
+		appendStringInfo(&buf,
+			"(CASE WHEN %s THEN NULL "
+				"WHEN %s IS NULL THEN %s "
+				"WHEN %s IS NULL THEN %s "
+				"ELSE (%s OPERATOR(pg_catalog.%c) %s)%s END)",
+			null_cond,
+			col1, col2,
+			col2, col1,
+			col1, op_char, col2, castString.data
+		);
+	}
+
+	return buf.data;
+}
+
+/*
+ * get_null_condition_string
+ *
+ * Build a predicate string for CASE clause to check if an aggregate value
+ * will became NULL after the given operation is applied.
+ */
+static char *
+get_null_condition_string(IvmOp op, const char *arg1, const char *arg2,
+						  const char* count_col)
+{
+	StringInfoData null_cond;
+	initStringInfo(&null_cond);
+
+	switch (op)
+	{
+		case IVM_ADD:
+			appendStringInfo(&null_cond,
+				"%s OPERATOR(pg_catalog.=3D) 0 AND %s OPERATOR(pg_catalog.=3D) 0",
+				quote_qualified_identifier(arg1, count_col),
+				quote_qualified_identifier(arg2, count_col)
+			);
+			break;
+		case IVM_SUB:
+			appendStringInfo(&null_cond,
+				"%s OPERATOR(pg_catalog.=3D) %s",
+				quote_qualified_identifier(arg1, count_col),
+				quote_qualified_identifier(arg2, count_col)
+			);
+			break;
+		default:
+			elog(ERROR,"unknown operation");
+	}
+
+	return null_cond.data;
+}
+
+
 /*
  * apply_old_delta_with_count
  *
@@ -2165,13 +2544,20 @@ apply_delta(Oid matviewOid, Tuplestorestate *old_tu=
plestores, Tuplestorestate *n
  * which contains tuples to be deleted from to a materialized view given by
  * matviewname.  This is used when counting is required, that is, the view
  * has aggregate or distinct.
+ *
+ * If the view desn't have aggregates or has GROUP BY, this requires a keys
+ * list to identify a tuple in the view. If the view has aggregates, this
+ * requires strings representing resnames of aggregates and SET clause for
+ * updating aggregate values.
  */
 static void
 apply_old_delta_with_count(const char *matviewname, const char *deltaname_=
old,
-				List *keys, const char *count_colname)
+				List *keys, StringInfo aggs_list, StringInfo aggs_set,
+				const char *count_colname)
 {
 	StringInfoData	querybuf;
 	char   *match_cond;
+	bool	agg_without_groupby =3D (list_length(keys) =3D=3D 0);
=20
 	/* build WHERE condition for searching tuples to be deleted */
 	match_cond =3D get_matching_condition_string(keys);
@@ -2181,22 +2567,26 @@ apply_old_delta_with_count(const char *matviewname,=
 const char *deltaname_old,
 	appendStringInfo(&querybuf,
 					"WITH t AS ("			/* collecting tid of target tuples in the view */
 						"SELECT diff.%s, "			/* count column */
-								"(diff.%s OPERATOR(pg_catalog.=3D) mv.%s) AS for_dlt, "
+								"(diff.%s OPERATOR(pg_catalog.=3D) mv.%s AND %s) AS for_dlt, "
 								"mv.ctid "
+								"%s "				/* aggregate columns */
 						"FROM %s AS mv, %s AS diff "
 						"WHERE %s"					/* tuple matching condition */
 					"), updt AS ("			/* update a tuple if this is not to be deleted */
 						"UPDATE %s AS mv SET %s =3D mv.%s OPERATOR(pg_catalog.-) t.%s "
+											"%s"	/* SET clauses for aggregates */
 						"FROM t WHERE mv.ctid OPERATOR(pg_catalog.=3D) t.ctid AND NOT for_dl=
t "
 					")"
 					/* delete a tuple if this is to be deleted */
 					"DELETE FROM %s AS mv USING t "
 					"WHERE mv.ctid OPERATOR(pg_catalog.=3D) t.ctid AND for_dlt",
 					count_colname,
-					count_colname, count_colname,
+					count_colname, count_colname, (agg_without_groupby ? "false" : "true"=
),
+					(aggs_list !=3D NULL ? aggs_list->data : ""),
 					matviewname, deltaname_old,
 					match_cond,
 					matviewname, count_colname, count_colname, count_colname,
+					(aggs_set !=3D NULL ? aggs_set->data : ""),
 					matviewname);
=20
 	if (SPI_exec(querybuf.data, 0) !=3D SPI_OK_DELETE)
@@ -2260,10 +2650,15 @@ apply_old_delta(const char *matviewname, const char=
 *deltaname_old,
  * matviewname.  This is used when counting is required, that is, the view
  * has aggregate or distinct. Also, when a table in EXISTS sub queries
  * is modified.
+ *
+ * If the view desn't have aggregates or has GROUP BY, this requires a keys
+ * list to identify a tuple in the view. If the view has aggregates, this
+ * requires strings representing SET clause for updating aggregate values.
  */
 static void
 apply_new_delta_with_count(const char *matviewname, const char* deltaname_=
new,
-				List *keys, StringInfo target_list, const char* count_colname)
+				List *keys, StringInfo aggs_set, StringInfo target_list,
+				const char* count_colname)
 {
 	StringInfoData	querybuf;
 	StringInfoData	returning_keys;
@@ -2294,6 +2689,7 @@ apply_new_delta_with_count(const char *matviewname, c=
onst char* deltaname_new,
 	appendStringInfo(&querybuf,
 					"WITH updt AS ("		/* update a tuple if this exists in the view */
 						"UPDATE %s AS mv SET %s =3D mv.%s OPERATOR(pg_catalog.+) diff.%s "
+											"%s "	/* SET clauses for aggregates */
 						"FROM %s AS diff "
 						"WHERE %s "					/* tuple matching condition */
 						"RETURNING %s"				/* returning keys of updated tuples */
@@ -2301,6 +2697,7 @@ apply_new_delta_with_count(const char *matviewname, c=
onst char* deltaname_new,
 						"SELECT %s FROM %s AS diff "
 						"WHERE NOT EXISTS (SELECT 1 FROM updt AS mv WHERE %s);",
 					matviewname, count_colname, count_colname, count_colname,
+					(aggs_set !=3D NULL ? aggs_set->data : ""),
 					deltaname_new,
 					match_cond,
 					returning_keys.data,
diff --git a/src/include/commands/createas.h b/src/include/commands/createa=
s.h
index 6b47e66bfd..af3a5b4b27 100644
--- a/src/include/commands/createas.h
+++ b/src/include/commands/createas.h
@@ -30,6 +30,7 @@ extern void CreateIvmTriggersOnBaseTables(Query *qry, Oid=
 matviewOid);
 extern void CreateIndexOnIMMV(Query *query, Relation matviewRel);
=20
 extern Query *rewriteQueryForIMMV(Query *query, List *colNames);
+extern void makeIvmAggColumn(ParseState *pstate, Aggref *aggref, char *res=
name, AttrNumber *next_resno, List **aggs);
=20
 extern int	GetIntoRelEFlags(IntoClause *intoClause);
=20
--=20
2.34.1


--Multipart=_Thu__11_Jul_2024_13_23_57_+0900_hKsU2G3a3BgS2FFs
Content-Type: text/x-diff;
 name="v34-0007-Add-DISTINCT-support-for-IVM.patch"
Content-Disposition: attachment;
 filename="v34-0007-Add-DISTINCT-support-for-IVM.patch"
Content-Transfer-Encoding: 7bit



^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-06-05 07:56 Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  0 siblings, 1 reply; 358+ messages in thread

From: Yugo Nagata @ 2026-06-05 07:56 UTC (permalink / raw)
  To: pgsql-hackers

Hi,

While looking at alternatives.out in the regression test of pg_plan_advice,
I was a bit confused because there are exists_1 and exists_2 in the generated
plan advice even though the query contains only one EXISTS.

  EXPLAIN (COSTS OFF, PLAN_ADVICE)
  SELECT * FROM alt_t1
  WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
                              QUERY PLAN
  -------------------------------------------------------------------
   Seq Scan on alt_t1
     Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
     SubPlan exists_2
       ->  Seq Scan on alt_t2
   Generated Plan Advice:
     SEQ_SCAN(alt_t1 alt_t2@exists_2)
     NO_GATHER(alt_t1 alt_t2@exists_2)
     DO_NOT_SCAN(alt_t2@exists_1)
  (8 rows)

I realized that when an EXISTS is simple, it is converted into an additional
ANY subplan. However, it seems slightly confusing that the prefix "exists_"
is the same as the original EXISTS subplan, especially when using
pg_plan_advice to control the plan.

I am wondering whether it might be worth renaming the subplan to something
like "exists_to_any", to make it clearer that it is an ANY subplan converted
from EXISTS rather than the original EXISTS. I’ve attached a patch in this direction.

What do you think?

-- 
Yugo Nagata <nagata@sraoss.co.jp>


^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
@ 2026-06-09 06:01 ` Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  0 siblings, 1 reply; 358+ messages in thread

From: Fujii Masao @ 2026-06-09 06:01 UTC (permalink / raw)
  To: Yugo Nagata <nagata@sraoss.co.jp>; +Cc: pgsql-hackers

On Fri, Jun 5, 2026 at 4:56 PM Yugo Nagata <nagata@sraoss.co.jp> wrote:
>
> Hi,
>
> While looking at alternatives.out in the regression test of pg_plan_advice,
> I was a bit confused because there are exists_1 and exists_2 in the generated
> plan advice even though the query contains only one EXISTS.
>
>   EXPLAIN (COSTS OFF, PLAN_ADVICE)
>   SELECT * FROM alt_t1
>   WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
>                               QUERY PLAN
>   -------------------------------------------------------------------
>    Seq Scan on alt_t1
>      Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
>      SubPlan exists_2
>        ->  Seq Scan on alt_t2
>    Generated Plan Advice:
>      SEQ_SCAN(alt_t1 alt_t2@exists_2)
>      NO_GATHER(alt_t1 alt_t2@exists_2)
>      DO_NOT_SCAN(alt_t2@exists_1)
>   (8 rows)
>
> I realized that when an EXISTS is simple, it is converted into an additional
> ANY subplan. However, it seems slightly confusing that the prefix "exists_"
> is the same as the original EXISTS subplan, especially when using
> pg_plan_advice to control the plan.
>
> I am wondering whether it might be worth renaming the subplan to something
> like "exists_to_any", to make it clearer that it is an ANY subplan converted
> from EXISTS rather than the original EXISTS. I’ve attached a patch in this direction.
>
> What do you think?

Agreed.

Using the same "exists_*" prefix for both the original EXISTS subplan and
the EXISTS-to-ANY converted alternative is confusing, especially for
pg_plan_advice where the subplan name is user-visible and used when
specifying advice.

Renaming the converted subplan to "exists_to_any_*" makes the EXPLAIN
output and generated advice easier to understand without changing planner
behavior, so this seems like a reasonable improvement.

Regards,

-- 
Fujii Masao





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
@ 2026-06-18 01:51   ` Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 1 reply; 358+ messages in thread

From: Fujii Masao @ 2026-06-18 01:51 UTC (permalink / raw)
  To: Yugo Nagata <nagata@sraoss.co.jp>; +Cc: pgsql-hackers

On Tue, Jun 9, 2026 at 3:01 PM Fujii Masao <masao.fujii@gmail.com> wrote:
>
> On Fri, Jun 5, 2026 at 4:56 PM Yugo Nagata <nagata@sraoss.co.jp> wrote:
> >
> > Hi,
> >
> > While looking at alternatives.out in the regression test of pg_plan_advice,
> > I was a bit confused because there are exists_1 and exists_2 in the generated
> > plan advice even though the query contains only one EXISTS.
> >
> >   EXPLAIN (COSTS OFF, PLAN_ADVICE)
> >   SELECT * FROM alt_t1
> >   WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
> >                               QUERY PLAN
> >   -------------------------------------------------------------------
> >    Seq Scan on alt_t1
> >      Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
> >      SubPlan exists_2
> >        ->  Seq Scan on alt_t2
> >    Generated Plan Advice:
> >      SEQ_SCAN(alt_t1 alt_t2@exists_2)
> >      NO_GATHER(alt_t1 alt_t2@exists_2)
> >      DO_NOT_SCAN(alt_t2@exists_1)
> >   (8 rows)
> >
> > I realized that when an EXISTS is simple, it is converted into an additional
> > ANY subplan. However, it seems slightly confusing that the prefix "exists_"
> > is the same as the original EXISTS subplan, especially when using
> > pg_plan_advice to control the plan.
> >
> > I am wondering whether it might be worth renaming the subplan to something
> > like "exists_to_any", to make it clearer that it is an ANY subplan converted
> > from EXISTS rather than the original EXISTS. I’ve attached a patch in this direction.
> >
> > What do you think?
>
> Agreed.
>
> Using the same "exists_*" prefix for both the original EXISTS subplan and
> the EXISTS-to-ANY converted alternative is confusing, especially for
> pg_plan_advice where the subplan name is user-visible and used when
> specifying advice.
>
> Renaming the converted subplan to "exists_to_any_*" makes the EXPLAIN
> output and generated advice easier to understand without changing planner
> behavior, so this seems like a reasonable improvement.

I think this is an improvement rather than a bug fix. However, since the
subplan name is user-visible in EXPLAIN/PLAN_ADVICE and can also be
referenced by pg_plan_advice in v19, it seems better to make this
adjustment before v19 is released rather than ship the current naming
and change it later in v20. Thoughts?

If we agree with this direction and there are no objections,
I'll commit the patch.

Reards,

-- 
Fujii Masao





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
@ 2026-06-18 02:14     ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 03:03       ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  0 siblings, 1 reply; 358+ messages in thread

From: Tom Lane @ 2026-06-18 02:14 UTC (permalink / raw)
  To: Fujii Masao <masao.fujii@gmail.com>; +Cc: Robert Haas <robertmhaas@gmail.com>; Yugo Nagata <nagata@sraoss.co.jp>; pgsql-hackers

Fujii Masao <masao.fujii@gmail.com> writes:
> I think this is an improvement rather than a bug fix. However, since the
> subplan name is user-visible in EXPLAIN/PLAN_ADVICE and can also be
> referenced by pg_plan_advice in v19, it seems better to make this
> adjustment before v19 is released rather than ship the current naming
> and change it later in v20. Thoughts?

This changes user-visible behavior, but we already changed that since
v18.  I checked this case:

create table alt_t1(a int, b int);
create table alt_t2(a int, b int);
explain SELECT * FROM alt_t1 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;

v18 says

 Seq Scan on alt_t1  (cost=0.00..7896.89 rows=1507 width=8)
   Filter: ((ANY (a = (hashed SubPlan 2).col1)) OR (a < 0))
   SubPlan 2
     ->  Seq Scan on alt_t2  (cost=0.00..32.60 rows=2260 width=4)

HEAD says

 Seq Scan on alt_t1  (cost=0.00..7896.89 rows=1507 width=8)
   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
   SubPlan exists_2
     ->  Seq Scan on alt_t2  (cost=0.00..32.60 rows=2260 width=4)

So if we wait till v20 then v19 will be unlike both the previous and
following releases.  Probably better to change only once.

IIRC, Robert is responsible for the change we have now, so looping
him in to see if he's got any objections to changing it again.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-06-18 03:03       ` Fujii Masao <masao.fujii@gmail.com>
  2026-07-17 11:10         ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any solai v <solai.cdac@gmail.com>
  0 siblings, 1 reply; 358+ messages in thread

From: Fujii Masao @ 2026-06-18 03:03 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: Robert Haas <robertmhaas@gmail.com>; Yugo Nagata <nagata@sraoss.co.jp>; pgsql-hackers

On Thu, Jun 18, 2026 at 11:14 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
> So if we wait till v20 then v19 will be unlike both the previous and
> following releases.  Probably better to change only once.

Agreed.


> IIRC, Robert is responsible for the change we have now, so looping
> him in to see if he's got any objections to changing it again.

Yes, looping him in sounds reasonable.

Regards,

-- 
Fujii Masao





^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 03:03       ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
@ 2026-07-17 11:10         ` solai v <solai.cdac@gmail.com>
  2026-07-24 17:12           ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 1 reply; 358+ messages in thread

From: solai v @ 2026-07-17 11:10 UTC (permalink / raw)
  To: Fujii Masao <masao.fujii@gmail.com>; +Cc: Tom Lane <tgl@sss.pgh.pa.us>; Robert Haas <robertmhaas@gmail.com>; Yugo Nagata <nagata@sraoss.co.jp>; pgsql-hackers

Hi,

I tested this patch on the current HEAD.
Before applying the patch, I observed that the converted subplan was
displayed with the exists_ prefix in the EXPLAIN output.
For example:
Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
SubPlan exists_2
Even though the planner had internally converted the simple EXISTS
subquery into an ANY subplan, the displayed name still used the
exists_ prefix, which could be a little confusing when reading the
execution plan.

After applying the patch, the same query produced:
Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
SubPlan exists_to_any_1
The new name makes it much clearer that this subplan is the result of
an EXISTS-to-ANY conversion.

I also verified that the query executed successfully before and after
applying the patch. I didn't notice any change in the execution plan
or query results ,the only visible difference was the improved subplan
naming in the EXPLAIN output.
Overall, the patch improves the readability of the user-visible plan
without changing planner behavior.



Regards,
Solai






^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 03:03       ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-07-17 11:10         ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any solai v <solai.cdac@gmail.com>
@ 2026-07-24 17:12           ` Yugo Nagata <nagata@sraoss.co.jp>
  2026-08-05 03:00             ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 1 reply; 358+ messages in thread

From: Yugo Nagata @ 2026-07-24 17:12 UTC (permalink / raw)
  To: solai v <solai.cdac@gmail.com>; Robert Haas <robertmhaas@gmail.com>; +Cc: Fujii Masao <masao.fujii@gmail.com>; Tom Lane <tgl@sss.pgh.pa.us>; pgsql-hackers

On Fri, 17 Jul 2026 16:40:29 +0530
solai v <solai.cdac@gmail.com> wrote:

> I tested this patch on the current HEAD.
> Before applying the patch, I observed that the converted subplan was
> displayed with the exists_ prefix in the EXPLAIN output.
> For example:
> Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
> SubPlan exists_2
> Even though the planner had internally converted the simple EXISTS
> subquery into an ANY subplan, the displayed name still used the
> exists_ prefix, which could be a little confusing when reading the
> execution plan.
> 
> After applying the patch, the same query produced:
> Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
> SubPlan exists_to_any_1
> The new name makes it much clearer that this subplan is the result of
> an EXISTS-to-ANY conversion.
> 
> I also verified that the query executed successfully before and after
> applying the patch. I didn't notice any change in the execution plan
> or query results ,the only visible difference was the improved subplan
> naming in the EXPLAIN output.
> Overall, the patch improves the readability of the user-visible plan
> without changing planner behavior.

Hi Solai, Robert,

Thank you, Solai, for testing the patch and confirming the results.
It is good to hear that the change improves the readability of the
EXPLAIN output as intended.

Robert, do you have a chance to review this? As Tom and Fujii-san
suggested, we'd like to get this into v19 to keep the naming consistent.
If you don't have any objections, we'd like to move forward with this patch.

Regards,
Yugo Nagata

-- 
Yugo Nagata <nagata@sraoss.co.jp>






^ permalink  raw  reply  [nested|flat] 358+ messages in thread

* Re: Rename EXISTS-to-ANY converted subplan to exists_to_any
  2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
  2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 03:03       ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
  2026-07-17 11:10         ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any solai v <solai.cdac@gmail.com>
  2026-07-24 17:12           ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
@ 2026-08-05 03:00             ` Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 358+ messages in thread

From: Yugo Nagata @ 2026-08-05 03:00 UTC (permalink / raw)
  To: Robert Haas <robertmhaas@gmail.com>; +Cc: solai v <solai.cdac@gmail.com>; Fujii Masao <masao.fujii@gmail.com>; Tom Lane <tgl@sss.pgh.pa.us>; pgsql-hackers

On Sat, 25 Jul 2026 02:12:56 +0900
Yugo Nagata <nagata@sraoss.co.jp> wrote:

> On Fri, 17 Jul 2026 16:40:29 +0530
> solai v <solai.cdac@gmail.com> wrote:
> 
> > I tested this patch on the current HEAD.
> > Before applying the patch, I observed that the converted subplan was
> > displayed with the exists_ prefix in the EXPLAIN output.
> > For example:
> > Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
> > SubPlan exists_2
> > Even though the planner had internally converted the simple EXISTS
> > subquery into an ANY subplan, the displayed name still used the
> > exists_ prefix, which could be a little confusing when reading the
> > execution plan.
> > 
> > After applying the patch, the same query produced:
> > Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
> > SubPlan exists_to_any_1
> > The new name makes it much clearer that this subplan is the result of
> > an EXISTS-to-ANY conversion.
> > 
> > I also verified that the query executed successfully before and after
> > applying the patch. I didn't notice any change in the execution plan
> > or query results ,the only visible difference was the improved subplan
> > naming in the EXPLAIN output.
> > Overall, the patch improves the readability of the user-visible plan
> > without changing planner behavior.
> 
> Hi Solai, Robert,
> 
> Thank you, Solai, for testing the patch and confirming the results.
> It is good to hear that the change improves the readability of the
> EXPLAIN output as intended.
> 
> Robert, do you have a chance to review this? As Tom and Fujii-san
> suggested, we'd like to get this into v19 to keep the naming consistent.
> If you don't have any objections, we'd like to move forward with this patch.

Hi Robert,

As we'd like to get this into v19 if possible, I'd like to check one more time
if there are any objections to this change.

Regards,
Yugo Nagata


-- 
Yugo Nagata <nagata@sraoss.co.jp>






^ permalink  raw  reply  [nested|flat] 358+ messages in thread


end of thread, other threads:[~2026-08-05 03:00 UTC | newest]

Thread overview: 358+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2023-05-31 11:46 [PATCH v34 08/11] Add aggregates support in IVM Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-06-05 07:56 Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-06-09 06:01 ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
2026-06-18 01:51   ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
2026-06-18 02:14     ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Tom Lane <tgl@sss.pgh.pa.us>
2026-06-18 03:03       ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Fujii Masao <masao.fujii@gmail.com>
2026-07-17 11:10         ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any solai v <solai.cdac@gmail.com>
2026-07-24 17:12           ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-08-05 03:00             ` Re: Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox