agora inbox for pgsql-hackers@postgresql.org  
help / color / mirror / Atom feed
[PATCH v4 1/1] remove toast reloptions
356+ messages / 5 participants
[nested] [flat]

* [PATCH v4 1/1] remove toast reloptions
@ 2026-04-07 20:30 Nathan Bossart <nathan@postgresql.org>
  0 siblings, 0 replies; 356+ messages in thread

From: Nathan Bossart @ 2026-04-07 20:30 UTC (permalink / raw)

---
 doc/src/sgml/ref/create_table.sgml            | 51 ++++++-------
 src/backend/access/common/reloptions.c        | 49 +++++-------
 src/backend/catalog/toasting.c                | 31 ++++----
 src/backend/commands/createas.c               | 13 +---
 src/backend/commands/repack.c                 | 15 +---
 src/backend/commands/tablecmds.c              | 19 +----
 src/backend/commands/vacuum.c                 | 14 +---
 src/backend/postmaster/autovacuum.c           | 48 +++++-------
 src/backend/tcop/utility.c                    | 19 +----
 src/bin/pg_upgrade/check.c                    | 75 +++++++++++++++++++
 src/include/access/reloptions.h               | 24 +++---
 src/include/catalog/toasting.h                |  6 +-
 .../injection_points/expected/vacuum.out      | 24 +++---
 .../modules/injection_points/sql/vacuum.sql   | 20 ++---
 src/test/regress/expected/alter_table.out     |  9 ---
 src/test/regress/expected/reloptions.out      | 56 ++------------
 src/test/regress/expected/vacuum.out          |  8 --
 src/test/regress/sql/alter_table.sql          |  4 -
 src/test/regress/sql/reloptions.sql           | 32 +-------
 src/test/regress/sql/vacuum.sql               |  8 --
 20 files changed, 199 insertions(+), 326 deletions(-)

diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index e342585c7f0..b8d2a657d10 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1589,14 +1589,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     Storage parameters for
     indexes are documented in <xref linkend="sql-createindex"/>.
     The storage parameters currently
-    available for tables are listed below.  For many of these parameters, as
-    shown, there is an additional parameter with the same name prefixed with
-    <literal>toast.</literal>, which controls the behavior of the
+    available for tables are listed below.  Unless otherwise noted, a table's
+    parameter value also controls the behavior of the
     table's secondary <acronym>TOAST</acronym> table, if any
     (see <xref linkend="storage-toast"/> for more information about TOAST).
-    If a table parameter value is set and the
-    equivalent <literal>toast.</literal> parameter is not, the TOAST table
-    will use the table's parameter value.
     Specifying these parameters for partitioned tables is not supported,
     but you may specify them for individual leaf partitions.
    </para>
@@ -1622,7 +1618,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       updates</link> more likely.
       For a table whose entries are never updated, complete packing is the
       best choice, but in heavily updated tables smaller fillfactors are
-      appropriate.  This parameter cannot be set for TOAST tables.
+      appropriate.  This parameter does not affect the table's secondary TOAST
+      table.
      </para>
     </listitem>
    </varlistentry>
@@ -1648,7 +1645,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       Note that the default setting is often close to optimal, and
       it is possible that setting this parameter could have negative
       effects in some cases.
-      This parameter cannot be set for TOAST tables.
+      This parameter does not affect the table's secondary TOAST table.
      </para>
     </listitem>
    </varlistentry>
@@ -1671,7 +1668,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-enabled" xreflabel="autovacuum_enabled">
-    <term><literal>autovacuum_enabled</literal>, <literal>toast.autovacuum_enabled</literal> (<type>boolean</type>)
+    <term><literal>autovacuum_enabled</literal> (<type>boolean</type>)
     <indexterm>
      <primary><varname>autovacuum_enabled</varname> storage parameter</primary>
     </indexterm>
@@ -1696,7 +1693,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-vacuum-index-cleanup" xreflabel="vacuum_index_cleanup">
-    <term><literal>vacuum_index_cleanup</literal>, <literal>toast.vacuum_index_cleanup</literal> (<type>enum</type>)
+    <term><literal>vacuum_index_cleanup</literal> (<type>enum</type>)
     <indexterm>
      <primary><varname>vacuum_index_cleanup</varname> storage parameter</primary>
     </indexterm>
@@ -1722,7 +1719,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-vacuum-truncate" xreflabel="vacuum_truncate">
-    <term><literal>vacuum_truncate</literal>, <literal>toast.vacuum_truncate</literal> (<type>boolean</type>)
+    <term><literal>vacuum_truncate</literal> (<type>boolean</type>)
     <indexterm>
      <primary><varname>vacuum_truncate</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1755,7 +1752,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-threshold" xreflabel="autovacuum_vacuum_threshold">
-    <term><literal>autovacuum_vacuum_threshold</literal>, <literal>toast.autovacuum_vacuum_threshold</literal> (<type>integer</type>)
+    <term><literal>autovacuum_vacuum_threshold</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_threshold</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1770,7 +1767,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-max-threshold" xreflabel="autovacuum_vacuum_max_threshold">
-    <term><literal>autovacuum_vacuum_max_threshold</literal>, <literal>toast.autovacuum_vacuum_max_threshold</literal> (<type>integer</type>)
+    <term><literal>autovacuum_vacuum_max_threshold</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_max_threshold</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1785,7 +1782,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
   </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-scale-factor" xreflabel="autovacuum_vacuum_scale_factor">
-    <term><literal>autovacuum_vacuum_scale_factor</literal>, <literal>toast.autovacuum_vacuum_scale_factor</literal> (<type>floating point</type>)
+    <term><literal>autovacuum_vacuum_scale_factor</literal> (<type>floating point</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_scale_factor</varname> </primary>
      <secondary>storage parameter</secondary>
@@ -1800,7 +1797,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-insert-threshold" xreflabel="autovacuum_vacuum_insert_threshold">
-    <term><literal>autovacuum_vacuum_insert_threshold</literal>, <literal>toast.autovacuum_vacuum_insert_threshold</literal> (<type>integer</type>)
+    <term><literal>autovacuum_vacuum_insert_threshold</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_insert_threshold</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1815,7 +1812,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-insert-scale-factor" xreflabel="autovacuum_vacuum_insert_scale_factor">
-    <term><literal>autovacuum_vacuum_insert_scale_factor</literal>, <literal>toast.autovacuum_vacuum_insert_scale_factor</literal> (<type>floating point</type>)
+    <term><literal>autovacuum_vacuum_insert_scale_factor</literal> (<type>floating point</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_insert_scale_factor</varname> </primary>
      <secondary>storage parameter</secondary>
@@ -1860,7 +1857,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-cost-delay" xreflabel="autovacuum_vacuum_cost_delay">
-    <term><literal>autovacuum_vacuum_cost_delay</literal>, <literal>toast.autovacuum_vacuum_cost_delay</literal> (<type>floating point</type>)
+    <term><literal>autovacuum_vacuum_cost_delay</literal> (<type>floating point</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_cost_delay</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1875,7 +1872,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-vacuum-cost-limit" xreflabel="autovacuum_vacuum_cost_limit">
-    <term><literal>autovacuum_vacuum_cost_limit</literal>, <literal>toast.autovacuum_vacuum_cost_limit</literal> (<type>integer</type>)
+    <term><literal>autovacuum_vacuum_cost_limit</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_vacuum_cost_limit</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1890,7 +1887,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-freeze-min-age" xreflabel="autovacuum_freeze_min_age">
-    <term><literal>autovacuum_freeze_min_age</literal>, <literal>toast.autovacuum_freeze_min_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_freeze_min_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_freeze_min_age</varname> storage parameter</primary>
     </indexterm>
@@ -1907,7 +1904,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-freeze-max-age" xreflabel="autovacuum_freeze_max_age">
-    <term><literal>autovacuum_freeze_max_age</literal>, <literal>toast.autovacuum_freeze_max_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_freeze_max_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_freeze_max_age</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1924,7 +1921,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-freeze-table-age" xreflabel="autovacuum_freeze_table_age">
-    <term><literal>autovacuum_freeze_table_age</literal>, <literal>toast.autovacuum_freeze_table_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_freeze_table_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_freeze_table_age</varname> storage parameter</primary>
     </indexterm>
@@ -1938,7 +1935,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-multixact-freeze-min-age" xreflabel="autovacuum_multixact_freeze_min_age">
-    <term><literal>autovacuum_multixact_freeze_min_age</literal>, <literal>toast.autovacuum_multixact_freeze_min_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_multixact_freeze_min_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_multixact_freeze_min_age</varname> storage parameter</primary>
     </indexterm>
@@ -1956,7 +1953,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-multixact-freeze-max-age" xreflabel="autovacuum_multixact_freeze_max_age">
-    <term><literal>autovacuum_multixact_freeze_max_age</literal>, <literal>toast.autovacuum_multixact_freeze_max_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_multixact_freeze_max_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_multixact_freeze_max_age</varname></primary>
      <secondary>storage parameter</secondary>
@@ -1975,7 +1972,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-autovacuum-multixact-freeze-table-age" xreflabel="autovacuum_multixact_freeze_table_age">
-    <term><literal>autovacuum_multixact_freeze_table_age</literal>, <literal>toast.autovacuum_multixact_freeze_table_age</literal> (<type>integer</type>)
+    <term><literal>autovacuum_multixact_freeze_table_age</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>autovacuum_multixact_freeze_table_age</varname> storage parameter</primary>
     </indexterm>
@@ -1989,7 +1986,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-log-autovacuum-min-duration" xreflabel="log_autovacuum_min_duration">
-    <term><literal>log_autovacuum_min_duration</literal>, <literal>toast.log_autovacuum_min_duration</literal> (<type>integer</type>)
+    <term><literal>log_autovacuum_min_duration</literal> (<type>integer</type>)
     <indexterm>
      <primary><varname>log_autovacuum_min_duration</varname></primary>
      <secondary>storage parameter</secondary>
@@ -2019,7 +2016,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
-    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
     <indexterm>
      <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
      <secondary>storage parameter</secondary>
@@ -2044,7 +2041,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       Declare the table as an additional catalog table for purposes of
       logical replication. See
       <xref linkend="logicaldecoding-capabilities"/> for details.
-      This parameter cannot be set for TOAST tables.
+      This parameter does not affect the table's secondary TOAST table.
      </para>
     </listitem>
    </varlistentry>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 3e832c3797e..50d9805f3d8 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -111,7 +111,7 @@ static relopt_bool boolRelOpts[] =
 		{
 			"autovacuum_enabled",
 			"Enables autovacuum in this relation",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		true
@@ -172,7 +172,7 @@ static relopt_ternary ternaryRelOpts[] =
 		{
 			"vacuum_truncate",
 			"Enables vacuum to truncate empty pages at the end of this table",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		}
 	},
@@ -249,7 +249,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_vacuum_threshold",
 			"Minimum number of tuple updates or deletes prior to vacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0, INT_MAX
@@ -258,7 +258,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_vacuum_max_threshold",
 			"Maximum number of tuple updates or deletes prior to vacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-2, -1, INT_MAX
@@ -267,7 +267,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_vacuum_insert_threshold",
 			"Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-2, -1, INT_MAX
@@ -285,7 +285,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_vacuum_cost_limit",
 			"Vacuum cost amount available before napping, for autovacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 1, 10000
@@ -294,7 +294,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_freeze_min_age",
 			"Minimum age at which VACUUM should freeze a table row, for autovacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0, 1000000000
@@ -303,7 +303,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_multixact_freeze_min_age",
 			"Minimum multixact age at which VACUUM should freeze a row multixact's, for autovacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0, 1000000000
@@ -312,7 +312,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_freeze_max_age",
 			"Age at which to autovacuum a table to prevent transaction ID wraparound",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 100000, 2000000000
@@ -321,7 +321,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_multixact_freeze_max_age",
 			"Multixact age at which to autovacuum a table to prevent multixact wraparound",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 10000, 2000000000
@@ -330,7 +330,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_freeze_table_age",
 			"Age at which VACUUM should perform a full table sweep to freeze row versions",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		}, -1, 0, 2000000000
 	},
@@ -338,7 +338,7 @@ static relopt_int intRelOpts[] =
 		{
 			"autovacuum_multixact_freeze_table_age",
 			"Age of multixact at which VACUUM should perform a full table sweep to freeze row versions",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		}, -1, 0, 2000000000
 	},
@@ -346,7 +346,7 @@ static relopt_int intRelOpts[] =
 		{
 			"log_autovacuum_min_duration",
 			"Sets the minimum execution time above which vacuum actions by autovacuum will be logged",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, -1, INT_MAX
@@ -424,7 +424,7 @@ static relopt_real realRelOpts[] =
 		{
 			"autovacuum_vacuum_cost_delay",
 			"Vacuum cost delay in milliseconds, for autovacuum",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0.0, 100.0
@@ -433,7 +433,7 @@ static relopt_real realRelOpts[] =
 		{
 			"autovacuum_vacuum_scale_factor",
 			"Number of tuple updates or deletes prior to vacuum as a fraction of reltuples",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0.0, 100.0
@@ -442,7 +442,7 @@ static relopt_real realRelOpts[] =
 		{
 			"autovacuum_vacuum_insert_scale_factor",
 			"Number of tuple inserts prior to vacuum as a fraction of reltuples",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0.0, 100.0
@@ -460,7 +460,7 @@ static relopt_real realRelOpts[] =
 		{
 			"vacuum_max_eager_freeze_failure_rate",
 			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		-1, 0.0, 1.0
@@ -554,7 +554,7 @@ static relopt_enum enumRelOpts[] =
 		{
 			"vacuum_index_cleanup",
 			"Controls index vacuuming and index cleanup",
-			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
 		StdRdOptIndexCleanupValues,
@@ -2163,21 +2163,8 @@ view_reloptions(Datum reloptions, bool validate)
 bytea *
 heap_reloptions(char relkind, Datum reloptions, bool validate)
 {
-	StdRdOptions *rdopts;
-
 	switch (relkind)
 	{
-		case RELKIND_TOASTVALUE:
-			rdopts = (StdRdOptions *)
-				default_reloptions(reloptions, validate, RELOPT_KIND_TOAST);
-			if (rdopts != NULL)
-			{
-				/* adjust default-only parameters for TOAST relations */
-				rdopts->fillfactor = 100;
-				rdopts->autovacuum.analyze_threshold = -1;
-				rdopts->autovacuum.analyze_scale_factor = -1;
-			}
-			return (bytea *) rdopts;
 		case RELKIND_RELATION:
 		case RELKIND_MATVIEW:
 			return default_reloptions(reloptions, validate, RELOPT_KIND_HEAP);
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
index 4aa52a4bd25..9f1f822702c 100644
--- a/src/backend/catalog/toasting.c
+++ b/src/backend/catalog/toasting.c
@@ -34,11 +34,11 @@
 #include "utils/rel.h"
 #include "utils/syscache.h"
 
-static void CheckAndCreateToastTable(Oid relOid, Datum reloptions,
+static void CheckAndCreateToastTable(Oid relOid,
 									 LOCKMODE lockmode, bool check,
 									 Oid OIDOldToast);
 static bool create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
-							   Datum reloptions, LOCKMODE lockmode, bool check,
+							   LOCKMODE lockmode, bool check,
 							   Oid OIDOldToast);
 static bool needs_toast_table(Relation rel);
 
@@ -48,35 +48,30 @@ static bool needs_toast_table(Relation rel);
  *		If the table needs a toast table, and doesn't already have one,
  *		then create a toast table for it.
  *
- * reloptions for the toast table can be passed, too.  Pass (Datum) 0
- * for default reloptions.
- *
  * We expect the caller to have verified that the relation is a table and have
  * already done any necessary permission checks.  Callers expect this function
  * to end with CommandCounterIncrement if it makes any changes.
  */
 void
-AlterTableCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode)
+AlterTableCreateToastTable(Oid relOid, LOCKMODE lockmode)
 {
-	CheckAndCreateToastTable(relOid, reloptions, lockmode, true, InvalidOid);
+	CheckAndCreateToastTable(relOid, lockmode, true, InvalidOid);
 }
 
 void
-NewHeapCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode,
-						Oid OIDOldToast)
+NewHeapCreateToastTable(Oid relOid, LOCKMODE lockmode, Oid OIDOldToast)
 {
-	CheckAndCreateToastTable(relOid, reloptions, lockmode, false, OIDOldToast);
+	CheckAndCreateToastTable(relOid, lockmode, false, OIDOldToast);
 }
 
 void
-NewRelationCreateToastTable(Oid relOid, Datum reloptions)
+NewRelationCreateToastTable(Oid relOid)
 {
-	CheckAndCreateToastTable(relOid, reloptions, AccessExclusiveLock, false,
-							 InvalidOid);
+	CheckAndCreateToastTable(relOid, AccessExclusiveLock, false, InvalidOid);
 }
 
 static void
-CheckAndCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode,
+CheckAndCreateToastTable(Oid relOid, LOCKMODE lockmode,
 						 bool check, Oid OIDOldToast)
 {
 	Relation	rel;
@@ -84,7 +79,7 @@ CheckAndCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode,
 	rel = table_open(relOid, lockmode);
 
 	/* create_toast_table does all the work */
-	(void) create_toast_table(rel, InvalidOid, InvalidOid, reloptions, lockmode,
+	(void) create_toast_table(rel, InvalidOid, InvalidOid, lockmode,
 							  check, OIDOldToast);
 
 	table_close(rel, NoLock);
@@ -108,7 +103,7 @@ BootstrapToastTable(char *relName, Oid toastOid, Oid toastIndexOid)
 			 relName);
 
 	/* create_toast_table does all the work */
-	if (!create_toast_table(rel, toastOid, toastIndexOid, (Datum) 0,
+	if (!create_toast_table(rel, toastOid, toastIndexOid,
 							AccessExclusiveLock, false, InvalidOid))
 		elog(ERROR, "\"%s\" does not require a toast table",
 			 relName);
@@ -126,7 +121,7 @@ BootstrapToastTable(char *relName, Oid toastOid, Oid toastIndexOid)
  */
 static bool
 create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
-				   Datum reloptions, LOCKMODE lockmode, bool check,
+				   LOCKMODE lockmode, bool check,
 				   Oid OIDOldToast)
 {
 	Oid			relOid = RelationGetRelid(rel);
@@ -266,7 +261,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
 										   shared_relation,
 										   mapped_relation,
 										   ONCOMMIT_NOOP,
-										   reloptions,
+										   (Datum) 0,
 										   false,
 										   true,
 										   true,
diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c
index 6dbb831ca89..188e167999b 100644
--- a/src/backend/commands/createas.c
+++ b/src/backend/commands/createas.c
@@ -84,8 +84,6 @@ create_ctas_internal(List *attrList, IntoClause *into)
 	CreateStmt *create = makeNode(CreateStmt);
 	bool		is_matview;
 	char		relkind;
-	Datum		toast_options;
-	const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
 	ObjectAddress intoRelationAddr;
 
 	/* This code supports both CREATE TABLE AS and CREATE MATERIALIZED VIEW */
@@ -120,16 +118,7 @@ create_ctas_internal(List *attrList, IntoClause *into)
 	 */
 	CommandCounterIncrement();
 
-	/* parse and validate reloptions for the toast table */
-	toast_options = transformRelOptions((Datum) 0,
-										create->options,
-										"toast",
-										validnsps,
-										true, false);
-
-	(void) heap_reloptions(RELKIND_TOASTVALUE, toast_options, true);
-
-	NewRelationCreateToastTable(intoRelationAddr.objectId, toast_options);
+	NewRelationCreateToastTable(intoRelationAddr.objectId);
 
 	/* Create the "view" part of a materialized view. */
 	if (is_matview)
diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c
index 9a199dd9bfb..3b80d331815 100644
--- a/src/backend/commands/repack.c
+++ b/src/backend/commands/repack.c
@@ -1201,20 +1201,7 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod,
 	 */
 	toastid = OldHeap->rd_rel->reltoastrelid;
 	if (OidIsValid(toastid))
-	{
-		/* keep the existing toast table's reloptions, if any */
-		tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(toastid));
-		if (!HeapTupleIsValid(tuple))
-			elog(ERROR, "cache lookup failed for relation %u", toastid);
-		reloptions = SysCacheGetAttr(RELOID, tuple, Anum_pg_class_reloptions,
-									 &isNull);
-		if (isNull)
-			reloptions = (Datum) 0;
-
-		NewHeapCreateToastTable(OIDNewHeap, reloptions, lockmode, toastid);
-
-		ReleaseSysCache(tuple);
-	}
+		NewHeapCreateToastTable(OIDNewHeap, lockmode, toastid);
 
 	table_close(OldHeap, NoLock);
 
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index d8d7969bf30..a254509cbb5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -827,7 +827,6 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 	ListCell   *listptr;
 	AttrNumber	attnum;
 	bool		partitioned;
-	const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
 	Oid			ofTypeId;
 	ObjectAddress address;
 	LOCKMODE	parentLockmode;
@@ -976,7 +975,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 	/*
 	 * Parse and validate reloptions, if any.
 	 */
-	reloptions = transformRelOptions((Datum) 0, stmt->options, NULL, validnsps,
+	reloptions = transformRelOptions((Datum) 0, stmt->options, NULL, NULL,
 									 true, false);
 
 	switch (relkind)
@@ -5433,7 +5432,7 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode,
 			  tab->relkind == RELKIND_PARTITIONED_TABLE) &&
 			 tab->partition_constraint == NULL) ||
 			tab->relkind == RELKIND_MATVIEW)
-			AlterTableCreateToastTable(tab->relid, (Datum) 0, lockmode);
+			AlterTableCreateToastTable(tab->relid, lockmode);
 	}
 }
 
@@ -16927,7 +16926,6 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
 	Datum		repl_val[Natts_pg_class];
 	bool		repl_null[Natts_pg_class];
 	bool		repl_repl[Natts_pg_class];
-	const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
 
 	if (defList == NIL && operation != AT_ReplaceRelOptions)
 		return;					/* nothing to do */
@@ -16960,7 +16958,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
 	}
 
 	/* Generate new proposed reloptions (text array) */
-	newOptions = transformRelOptions(datum, defList, NULL, validnsps, false,
+	newOptions = transformRelOptions(datum, defList, NULL, NULL, false,
 									 operation == AT_ResetRelOptions);
 
 	/* Validate */
@@ -17083,20 +17081,11 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
 				datum = (Datum) 0;
 		}
 
-		newOptions = transformRelOptions(datum, defList, "toast", validnsps,
-										 false, operation == AT_ResetRelOptions);
-
-		(void) heap_reloptions(RELKIND_TOASTVALUE, newOptions, true);
-
 		memset(repl_val, 0, sizeof(repl_val));
 		memset(repl_null, false, sizeof(repl_null));
 		memset(repl_repl, false, sizeof(repl_repl));
 
-		if (newOptions != (Datum) 0)
-			repl_val[Anum_pg_class_reloptions - 1] = newOptions;
-		else
-			repl_null[Anum_pg_class_reloptions - 1] = true;
-
+		repl_null[Anum_pg_class_reloptions - 1] = true;
 		repl_repl[Anum_pg_class_reloptions - 1] = true;
 
 		newtuple = heap_modify_tuple(tuple, RelationGetDescr(pgclass),
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index a4abb29cf64..2b44afdbf25 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -2020,13 +2020,6 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams params,
 	Oid			save_userid;
 	int			save_sec_context;
 	int			save_nestlevel;
-	VacuumParams toast_vacuum_params;
-
-	/*
-	 * This function scribbles on the parameters, so make a copy early to
-	 * avoid affecting the TOAST table (if we do end up recursing to it).
-	 */
-	memcpy(&toast_vacuum_params, &params, sizeof(VacuumParams));
 
 	/* Begin a transaction for vacuuming this relation */
 	StartTransactionCommand();
@@ -2341,11 +2334,10 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams params,
 		 * relation.  NB: This is only safe to do because we hold a session
 		 * lock on the main relation that prevents concurrent deletion.
 		 */
-		toast_vacuum_params.options |= VACOPT_PROCESS_MAIN;
-		toast_vacuum_params.toast_parent = relid;
+		params.options |= VACOPT_PROCESS_MAIN;
+		params.toast_parent = relid;
 
-		vacuum_rel(toast_relid, NULL, toast_vacuum_params, bstrategy,
-				   isTopLevel);
+		vacuum_rel(toast_relid, NULL, params, bstrategy, isTopLevel);
 	}
 
 	/*
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index a5a8db2ff88..c0e7cbf2cb8 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2139,8 +2139,9 @@ do_autovacuum(void)
 	{
 		Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple);
 		Oid			relid;
-		AutoVacOpts *relopts;
-		bool		free_relopts = false;
+		av_relation *hentry;
+		bool		found;
+		AutoVacOpts *relopts = NULL;
 		bool		dovacuum;
 		bool		doanalyze;
 		bool		wraparound;
@@ -2154,22 +2155,10 @@ do_autovacuum(void)
 
 		relid = classForm->oid;
 
-		/*
-		 * fetch reloptions -- if this toast table does not have them, try the
-		 * main rel
-		 */
-		relopts = extract_autovac_opts(tuple, pg_class_desc);
-		if (relopts)
-			free_relopts = true;
-		else
-		{
-			av_relation *hentry;
-			bool		found;
-
-			hentry = hash_search(table_toast_map, &relid, HASH_FIND, &found);
-			if (found && hentry->ar_hasrelopts)
-				relopts = &hentry->ar_reloptions;
-		}
+		/* Use reloptions from main rel. */
+		hentry = hash_search(table_toast_map, &relid, HASH_FIND, &found);
+		if (found && hentry->ar_hasrelopts)
+			relopts = &hentry->ar_reloptions;
 
 		relation_needs_vacanalyze(relid, relopts, classForm,
 								  effective_multixact_freeze_max_age,
@@ -2186,10 +2175,6 @@ do_autovacuum(void)
 			table->score = scores.max;
 			tables_to_process = lappend(tables_to_process, table);
 		}
-
-		/* Release stuff to avoid leakage */
-		if (free_relopts)
-			pfree(relopts);
 	}
 
 	table_endscan(relScan);
@@ -2826,7 +2811,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 	bool		doanalyze;
 	autovac_table *tab = NULL;
 	bool		wraparound;
-	AutoVacOpts *avopts;
+	AutoVacOpts *avopts = NULL;
 	bool		free_avopts = false;
 	AutoVacuumScores scores;
 
@@ -2838,13 +2823,15 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 
 	/*
 	 * Get the applicable reloptions.  If it is a TOAST table, try to get the
-	 * main table reloptions if the toast table itself doesn't have.
+	 * main table reloptions.
 	 */
-	avopts = extract_autovac_opts(classTup, pg_class_desc);
-	if (avopts)
-		free_avopts = true;
-	else if (classForm->relkind == RELKIND_TOASTVALUE &&
-			 table_toast_map != NULL)
+	if (classForm->relkind != RELKIND_TOASTVALUE)
+	{
+		avopts = extract_autovac_opts(classTup, pg_class_desc);
+		if (avopts)
+			free_avopts = true;
+	}
+	else if (table_toast_map)
 	{
 		av_relation *hentry;
 		bool		found;
@@ -3127,8 +3114,7 @@ relation_needs_vacanalyze(Oid relid,
 
 	/*
 	 * Determine vacuum/analyze equation parameters.  We have two possible
-	 * sources: the passed reloptions (which could be a main table or a toast
-	 * table), or the autovacuum GUC variables.
+	 * sources: the passed reloptions or the autovacuum GUC variables.
 	 */
 
 	/* -1 in autovac setting means use plain vacuum_scale_factor */
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 73a56f1df1d..d089e02c216 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1159,8 +1159,6 @@ ProcessUtilitySlow(ParseState *pstate,
 						if (IsA(stmt, CreateStmt))
 						{
 							CreateStmt *cstmt = (CreateStmt *) stmt;
-							Datum		toast_options;
-							const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
 
 							/* Remember transformed RangeVar for LIKE */
 							table_rv = cstmt->relation;
@@ -1180,22 +1178,7 @@ ProcessUtilitySlow(ParseState *pstate,
 							 */
 							CommandCounterIncrement();
 
-							/*
-							 * parse and validate reloptions for the toast
-							 * table
-							 */
-							toast_options = transformRelOptions((Datum) 0,
-																cstmt->options,
-																"toast",
-																validnsps,
-																true,
-																false);
-							(void) heap_reloptions(RELKIND_TOASTVALUE,
-												   toast_options,
-												   true);
-
-							NewRelationCreateToastTable(address.objectId,
-														toast_options);
+							NewRelationCreateToastTable(address.objectId);
 						}
 						else if (IsA(stmt, CreateForeignTableStmt))
 						{
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
index 5a7afe62eab..18d49a6fc17 100644
--- a/src/bin/pg_upgrade/check.c
+++ b/src/bin/pg_upgrade/check.c
@@ -37,6 +37,7 @@ static void check_new_cluster_subscription_configuration(void);
 static void check_old_cluster_for_valid_slots(void);
 static void check_old_cluster_subscription_state(void);
 static void check_old_cluster_global_names(ClusterInfo *cluster);
+static void check_for_toast_reloptions(ClusterInfo *cluster);
 
 /*
  * DataTypesUsageChecks - definitions of data type checks for the old cluster
@@ -634,6 +635,9 @@ check_and_dump_old_cluster(void)
 	check_for_prepared_transactions(&old_cluster);
 	check_for_isn_and_int8_passing_mismatch(&old_cluster);
 
+	if (GET_MAJOR_VERSION(old_cluster.major_version) < 2000)
+		check_for_toast_reloptions(&old_cluster);
+
 	if (GET_MAJOR_VERSION(old_cluster.major_version) >= 1700)
 	{
 		/*
@@ -2644,3 +2648,74 @@ check_old_cluster_global_names(ClusterInfo *cluster)
 	else
 		check_ok();
 }
+
+/*
+ * Callback function for processing results of query for
+ * check_for_toast_reloptions()'s UpgradeTask.  If the query returned any rows
+ * (i.e., the check failed), write the details to the report file.
+ */
+static void
+process_toast_relopts_check(DbInfo *dbinfo, PGresult *res, void *arg)
+{
+	UpgradeTaskReport *report = (UpgradeTaskReport *) arg;
+	int			ntups = PQntuples(res);
+	int			i_nspname = PQfnumber(res, "nspname");
+	int			i_relname = PQfnumber(res, "relname");
+
+	if (ntups == 0)
+		return;
+
+	if (report->file == NULL &&
+		(report->file = fopen_priv(report->path, "w")) == NULL)
+		pg_fatal("could not open file \"%s\": %m", report->path);
+
+	fprintf(report->file, "In database: %s\n", dbinfo->db_name);
+
+	for (int rowno = 0; rowno < ntups; rowno++)
+		fprintf(report->file, "  %s.%s\n",
+				PQgetvalue(res, rowno, i_nspname),
+				PQgetvalue(res, rowno, i_relname));
+}
+
+/*
+ * Verify that no storage parameters (a.k.a. reloptions) are defined for TOAST
+ * tables.
+ */
+static void
+check_for_toast_reloptions(ClusterInfo *cluster)
+{
+	UpgradeTaskReport report;
+	UpgradeTask *task = upgrade_task_create();
+	const char *query = "SELECT n.nspname, c.relname "
+		"FROM  pg_catalog.pg_class c, "
+		"      pg_catalog.pg_class tc, "
+		"      pg_catalog.pg_namespace n "
+		"WHERE c.reltoastrelid = tc.oid AND "
+		"      c.relnamespace = n.oid AND "
+		"      tc.reloptions IS NOT NULL";
+
+	prep_status("Check for tables with TOAST storage parameters");
+
+	report.file = NULL;
+	snprintf(report.path, sizeof(report.path), "%s/%s",
+			 log_opts.basedir,
+			 "tables_with_toast_storage_parameters.txt");
+
+	upgrade_task_add_step(task, query, process_toast_relopts_check,
+						  true, &report);
+	upgrade_task_run(task, cluster);
+	upgrade_task_free(task);
+
+	if (report.file)
+	{
+		fclose(report.file);
+		pg_log(PG_REPORT, "fatal");
+		pg_fatal("Your installation contains tables with TOAST storage parameters set, which is\n"
+				 "not supported anymore.  Consider remove the TOAST storage parameters using\n"
+				 "    ALTER TABLE ... RESET ( ... );\n"
+				 "A list of tables with the problem is in the file:\n"
+				 "    %s", report.path);
+	}
+	else
+		check_ok();
+}
diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h
index e8cb7f7a627..4415c1ca9b5 100644
--- a/src/include/access/reloptions.h
+++ b/src/include/access/reloptions.h
@@ -40,26 +40,22 @@ typedef enum relopt_kind
 {
 	RELOPT_KIND_LOCAL = 0,
 	RELOPT_KIND_HEAP = (1 << 0),
-	RELOPT_KIND_TOAST = (1 << 1),
-	RELOPT_KIND_BTREE = (1 << 2),
-	RELOPT_KIND_HASH = (1 << 3),
-	RELOPT_KIND_GIN = (1 << 4),
-	RELOPT_KIND_GIST = (1 << 5),
-	RELOPT_KIND_ATTRIBUTE = (1 << 6),
-	RELOPT_KIND_TABLESPACE = (1 << 7),
-	RELOPT_KIND_SPGIST = (1 << 8),
-	RELOPT_KIND_VIEW = (1 << 9),
-	RELOPT_KIND_BRIN = (1 << 10),
-	RELOPT_KIND_PARTITIONED = (1 << 11),
+	RELOPT_KIND_BTREE = (1 << 1),
+	RELOPT_KIND_HASH = (1 << 2),
+	RELOPT_KIND_GIN = (1 << 3),
+	RELOPT_KIND_GIST = (1 << 4),
+	RELOPT_KIND_ATTRIBUTE = (1 << 5),
+	RELOPT_KIND_TABLESPACE = (1 << 6),
+	RELOPT_KIND_SPGIST = (1 << 7),
+	RELOPT_KIND_VIEW = (1 << 8),
+	RELOPT_KIND_BRIN = (1 << 9),
+	RELOPT_KIND_PARTITIONED = (1 << 10),
 	/* if you add a new kind, make sure you update "last_default" too */
 	RELOPT_KIND_LAST_DEFAULT = RELOPT_KIND_PARTITIONED,
 	/* some compilers treat enums as signed ints, so we can't use 1 << 31 */
 	RELOPT_KIND_MAX = (1 << 30)
 } relopt_kind;
 
-/* reloption namespaces allowed for heaps -- currently only TOAST */
-#define HEAP_RELOPT_NAMESPACES { "toast", NULL }
-
 /* generic struct to hold shared data */
 typedef struct relopt_gen
 {
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 0bc61a8fee9..13e5a8affcb 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -19,10 +19,10 @@
 /*
  * toasting.c prototypes
  */
-extern void NewRelationCreateToastTable(Oid relOid, Datum reloptions);
-extern void NewHeapCreateToastTable(Oid relOid, Datum reloptions,
+extern void NewRelationCreateToastTable(Oid relOid);
+extern void NewHeapCreateToastTable(Oid relOid,
 									LOCKMODE lockmode, Oid OIDOldToast);
-extern void AlterTableCreateToastTable(Oid relOid, Datum reloptions,
+extern void AlterTableCreateToastTable(Oid relOid,
 									   LOCKMODE lockmode);
 extern void BootstrapToastTable(char *relName,
 								Oid toastOid, Oid toastIndexOid);
diff --git a/src/test/modules/injection_points/expected/vacuum.out b/src/test/modules/injection_points/expected/vacuum.out
index 58df59fa927..dcfa729d05e 100644
--- a/src/test/modules/injection_points/expected/vacuum.out
+++ b/src/test/modules/injection_points/expected/vacuum.out
@@ -43,29 +43,29 @@ SELECT injection_points_attach('vacuum-truncate-enabled', 'notice');
 (1 row)
 
 -- Check state of index_cleanup and truncate in VACUUM.
-CREATE TABLE vac_tab_on_toast_off(i int, j text) WITH
+CREATE TABLE vac_tab_on_toast(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=true, toast.vacuum_index_cleanup=false,
-   vacuum_truncate=true, toast.vacuum_truncate=false);
-CREATE TABLE vac_tab_off_toast_on(i int, j text) WITH
+   vacuum_index_cleanup=true,
+   vacuum_truncate=true);
+CREATE TABLE vac_tab_off_toast(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=false, toast.vacuum_index_cleanup=true,
-   vacuum_truncate=false, toast.vacuum_truncate=true);
+   vacuum_index_cleanup=false,
+   vacuum_truncate=false);
 -- Multiple relations should use their options in isolation.
-VACUUM vac_tab_on_toast_off, vac_tab_off_toast_on;
+VACUUM vac_tab_on_toast, vac_tab_off_toast;
+NOTICE:  notice triggered for injection point vacuum-index-cleanup-enabled
+NOTICE:  notice triggered for injection point vacuum-truncate-enabled
 NOTICE:  notice triggered for injection point vacuum-index-cleanup-enabled
 NOTICE:  notice triggered for injection point vacuum-truncate-enabled
 NOTICE:  notice triggered for injection point vacuum-index-cleanup-disabled
 NOTICE:  notice triggered for injection point vacuum-truncate-disabled
 NOTICE:  notice triggered for injection point vacuum-index-cleanup-disabled
 NOTICE:  notice triggered for injection point vacuum-truncate-disabled
-NOTICE:  notice triggered for injection point vacuum-index-cleanup-enabled
-NOTICE:  notice triggered for injection point vacuum-truncate-enabled
 -- Check "auto" case of index_cleanup and "truncate" controlled by
 -- its GUC.
 CREATE TABLE vac_tab_auto(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=auto, toast.vacuum_index_cleanup=auto);
+   vacuum_index_cleanup=auto);
 SET vacuum_truncate = false;
 VACUUM vac_tab_auto;
 NOTICE:  notice triggered for injection point vacuum-index-cleanup-auto
@@ -80,8 +80,8 @@ NOTICE:  notice triggered for injection point vacuum-index-cleanup-auto
 NOTICE:  notice triggered for injection point vacuum-truncate-enabled
 RESET vacuum_truncate;
 DROP TABLE vac_tab_auto;
-DROP TABLE vac_tab_on_toast_off;
-DROP TABLE vac_tab_off_toast_on;
+DROP TABLE vac_tab_on_toast;
+DROP TABLE vac_tab_off_toast;
 -- Cleanup
 SELECT injection_points_detach('vacuum-index-cleanup-auto');
  injection_points_detach 
diff --git a/src/test/modules/injection_points/sql/vacuum.sql b/src/test/modules/injection_points/sql/vacuum.sql
index 23760dd0f38..ee7a2e0566e 100644
--- a/src/test/modules/injection_points/sql/vacuum.sql
+++ b/src/test/modules/injection_points/sql/vacuum.sql
@@ -11,22 +11,22 @@ SELECT injection_points_attach('vacuum-truncate-disabled', 'notice');
 SELECT injection_points_attach('vacuum-truncate-enabled', 'notice');
 
 -- Check state of index_cleanup and truncate in VACUUM.
-CREATE TABLE vac_tab_on_toast_off(i int, j text) WITH
+CREATE TABLE vac_tab_on_toast(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=true, toast.vacuum_index_cleanup=false,
-   vacuum_truncate=true, toast.vacuum_truncate=false);
-CREATE TABLE vac_tab_off_toast_on(i int, j text) WITH
+   vacuum_index_cleanup=true,
+   vacuum_truncate=true);
+CREATE TABLE vac_tab_off_toast(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=false, toast.vacuum_index_cleanup=true,
-   vacuum_truncate=false, toast.vacuum_truncate=true);
+   vacuum_index_cleanup=false,
+   vacuum_truncate=false);
 -- Multiple relations should use their options in isolation.
-VACUUM vac_tab_on_toast_off, vac_tab_off_toast_on;
+VACUUM vac_tab_on_toast, vac_tab_off_toast;
 
 -- Check "auto" case of index_cleanup and "truncate" controlled by
 -- its GUC.
 CREATE TABLE vac_tab_auto(i int, j text) WITH
   (autovacuum_enabled=false,
-   vacuum_index_cleanup=auto, toast.vacuum_index_cleanup=auto);
+   vacuum_index_cleanup=auto);
 SET vacuum_truncate = false;
 VACUUM vac_tab_auto;
 SET vacuum_truncate = true;
@@ -34,8 +34,8 @@ VACUUM vac_tab_auto;
 RESET vacuum_truncate;
 
 DROP TABLE vac_tab_auto;
-DROP TABLE vac_tab_on_toast_off;
-DROP TABLE vac_tab_off_toast_on;
+DROP TABLE vac_tab_on_toast;
+DROP TABLE vac_tab_off_toast;
 
 -- Cleanup
 SELECT injection_points_detach('vacuum-index-cleanup-auto');
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 6dd22be0e8d..435e6beea0f 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -2860,15 +2860,6 @@ select * from my_locks order by 1;
  pg_toast  | ShareUpdateExclusiveLock
 (2 rows)
 
-commit;
-begin; alter table alterlock set (toast.autovacuum_enabled = off);
-select * from my_locks order by 1;
-  relname  |       max_lockmode       
------------+--------------------------
- alterlock | ShareUpdateExclusiveLock
- pg_toast  | ShareUpdateExclusiveLock
-(2 rows)
-
 commit;
 begin; alter table alterlock set (autovacuum_enabled = off);
 select * from my_locks order by 1;
diff --git a/src/test/regress/expected/reloptions.out b/src/test/regress/expected/reloptions.out
index e3a974f2611..eff5fbece60 100644
--- a/src/test/regress/expected/reloptions.out
+++ b/src/test/regress/expected/reloptions.out
@@ -120,7 +120,6 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 DROP TABLE reloptions_test;
 CREATE TEMP TABLE reloptions_test(i INT NOT NULL, j text)
 	WITH (vacuum_truncate=false,
-	toast.vacuum_truncate=false,
 	autovacuum_enabled=false);
 SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
                     reloptions                    
@@ -142,9 +141,9 @@ SELECT pg_relation_size('reloptions_test') > 0;
 SELECT reloptions FROM pg_class WHERE oid =
 	(SELECT reltoastrelid FROM pg_class
 	WHERE oid = 'reloptions_test'::regclass);
-       reloptions        
--------------------------
- {vacuum_truncate=false}
+ reloptions 
+------------
+ 
 (1 row)
 
 ALTER TABLE reloptions_test RESET (vacuum_truncate);
@@ -165,56 +164,11 @@ SELECT pg_relation_size('reloptions_test') = 0;
  t
 (1 row)
 
--- Test toast.* options
-DROP TABLE reloptions_test;
-CREATE TABLE reloptions_test (s VARCHAR)
-	WITH (toast.autovacuum_vacuum_cost_delay = 23);
-SELECT reltoastrelid as toast_oid
-	FROM pg_class WHERE oid = 'reloptions_test'::regclass \gset
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
-            reloptions             
------------------------------------
- {autovacuum_vacuum_cost_delay=23}
-(1 row)
-
-ALTER TABLE reloptions_test SET (toast.autovacuum_vacuum_cost_delay = 24);
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
-            reloptions             
------------------------------------
- {autovacuum_vacuum_cost_delay=24}
-(1 row)
-
-ALTER TABLE reloptions_test RESET (toast.autovacuum_vacuum_cost_delay);
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
- reloptions 
-------------
- 
-(1 row)
-
--- Fail on non-existent options in toast namespace
-CREATE TABLE reloptions_test2 (i int) WITH (toast.not_existing_option = 42);
-ERROR:  unrecognized parameter "not_existing_option"
--- Mix TOAST & heap
-DROP TABLE reloptions_test;
-CREATE TABLE reloptions_test (s VARCHAR) WITH
-	(toast.autovacuum_vacuum_cost_delay = 23,
-	autovacuum_vacuum_cost_delay = 24, fillfactor = 40);
-SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
-                   reloptions                    
--------------------------------------------------
- {autovacuum_vacuum_cost_delay=24,fillfactor=40}
-(1 row)
-
-SELECT reloptions FROM pg_class WHERE oid = (
-	SELECT reltoastrelid FROM pg_class WHERE oid = 'reloptions_test'::regclass);
-            reloptions             
------------------------------------
- {autovacuum_vacuum_cost_delay=23}
-(1 row)
-
 --
 -- CREATE INDEX, ALTER INDEX for btrees
 --
+DROP TABLE reloptions_test;
+CREATE TABLE reloptions_test (s VARCHAR);
 CREATE INDEX reloptions_test_idx ON reloptions_test (s) WITH (fillfactor=30);
 SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass;
    reloptions    
diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out
index d4696bc3325..d551ef57d50 100644
--- a/src/test/regress/expected/vacuum.out
+++ b/src/test/regress/expected/vacuum.out
@@ -209,14 +209,6 @@ VACUUM no_index_cleanup;
 INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60),
     repeat('1234567890',269));
 DELETE FROM no_index_cleanup WHERE i < 45;
--- Only toast index is cleaned up.
-ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = off,
-    toast.vacuum_index_cleanup = yes);
-VACUUM no_index_cleanup;
--- Only parent is cleaned up.
-ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true,
-    toast.vacuum_index_cleanup = false);
-VACUUM no_index_cleanup;
 -- Test some extra relations.
 VACUUM (INDEX_CLEANUP FALSE) vaccluster;
 VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no indexes
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index f5f13bbd3e7..410465dc022 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -1784,10 +1784,6 @@ begin; alter table alterlock reset (fillfactor);
 select * from my_locks order by 1;
 commit;
 
-begin; alter table alterlock set (toast.autovacuum_enabled = off);
-select * from my_locks order by 1;
-commit;
-
 begin; alter table alterlock set (autovacuum_enabled = off);
 select * from my_locks order by 1;
 commit;
diff --git a/src/test/regress/sql/reloptions.sql b/src/test/regress/sql/reloptions.sql
index 680c8bf8614..0809a2ae0e4 100644
--- a/src/test/regress/sql/reloptions.sql
+++ b/src/test/regress/sql/reloptions.sql
@@ -75,7 +75,6 @@ DROP TABLE reloptions_test;
 
 CREATE TEMP TABLE reloptions_test(i INT NOT NULL, j text)
 	WITH (vacuum_truncate=false,
-	toast.vacuum_truncate=false,
 	autovacuum_enabled=false);
 SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
@@ -94,39 +93,12 @@ INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) reloptions_test;
 SELECT pg_relation_size('reloptions_test') = 0;
 
--- Test toast.* options
-DROP TABLE reloptions_test;
-
-CREATE TABLE reloptions_test (s VARCHAR)
-	WITH (toast.autovacuum_vacuum_cost_delay = 23);
-SELECT reltoastrelid as toast_oid
-	FROM pg_class WHERE oid = 'reloptions_test'::regclass \gset
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
-
-ALTER TABLE reloptions_test SET (toast.autovacuum_vacuum_cost_delay = 24);
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
-
-ALTER TABLE reloptions_test RESET (toast.autovacuum_vacuum_cost_delay);
-SELECT reloptions FROM pg_class WHERE oid = :toast_oid;
-
--- Fail on non-existent options in toast namespace
-CREATE TABLE reloptions_test2 (i int) WITH (toast.not_existing_option = 42);
-
--- Mix TOAST & heap
-DROP TABLE reloptions_test;
-
-CREATE TABLE reloptions_test (s VARCHAR) WITH
-	(toast.autovacuum_vacuum_cost_delay = 23,
-	autovacuum_vacuum_cost_delay = 24, fillfactor = 40);
-
-SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
-SELECT reloptions FROM pg_class WHERE oid = (
-	SELECT reltoastrelid FROM pg_class WHERE oid = 'reloptions_test'::regclass);
-
 --
 -- CREATE INDEX, ALTER INDEX for btrees
 --
+DROP TABLE reloptions_test;
 
+CREATE TABLE reloptions_test (s VARCHAR);
 CREATE INDEX reloptions_test_idx ON reloptions_test (s) WITH (fillfactor=30);
 SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass;
 
diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql
index 247b8e23b23..37a84fd9145 100644
--- a/src/test/regress/sql/vacuum.sql
+++ b/src/test/regress/sql/vacuum.sql
@@ -175,14 +175,6 @@ VACUUM no_index_cleanup;
 INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60),
     repeat('1234567890',269));
 DELETE FROM no_index_cleanup WHERE i < 45;
--- Only toast index is cleaned up.
-ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = off,
-    toast.vacuum_index_cleanup = yes);
-VACUUM no_index_cleanup;
--- Only parent is cleaned up.
-ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true,
-    toast.vacuum_index_cleanup = false);
-VACUUM no_index_cleanup;
 -- Test some extra relations.
 VACUUM (INDEX_CLEANUP FALSE) vaccluster;
 VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no indexes
-- 
2.50.1 (Apple Git-155)


--g1KZ71ry6DNksXN0--





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

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

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

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


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





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

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

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ messages in thread

* [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any
@ 2026-05-25 01:16 Yugo Nagata <nagata@sraoss.co.jp>
  0 siblings, 0 replies; 356+ messages in thread

From: Yugo Nagata @ 2026-05-25 01:16 UTC (permalink / raw)

---
 .../pg_plan_advice/expected/alternatives.out  | 30 +++++++++----------
 contrib/pg_plan_advice/sql/alternatives.sql   |  2 +-
 src/backend/optimizer/plan/subselect.c        |  2 +-
 src/test/regress/expected/partition_prune.out | 10 +++----
 src/test/regress/expected/subselect.out       | 16 +++++-----
 5 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/contrib/pg_plan_advice/expected/alternatives.out b/contrib/pg_plan_advice/expected/alternatives.out
index a6fb296d4b4..94bfcf3d0a2 100644
--- a/contrib/pg_plan_advice/expected/alternatives.out
+++ b/contrib/pg_plan_advice/expected/alternatives.out
@@ -12,15 +12,15 @@ VACUUM ANALYZE alt_t2;
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (8 rows)
 
@@ -31,21 +31,21 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-                            QUERY PLAN                             
--------------------------------------------------------------------
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
  Seq Scan on alt_t1
-   Filter: ((ANY (a = (hashed SubPlan exists_2).col1)) OR (a < 0))
-   SubPlan exists_2
+   Filter: ((ANY (a = (hashed SubPlan exists_to_any_1).col1)) OR (a < 0))
+   SubPlan exists_to_any_1
      ->  Seq Scan on alt_t2
  Supplied Plan Advice:
    DO_NOT_SCAN(alt_t2@exists_1) /* matched */
  Generated Plan Advice:
-   SEQ_SCAN(alt_t1 alt_t2@exists_2)
-   NO_GATHER(alt_t1 alt_t2@exists_2)
+   SEQ_SCAN(alt_t1 alt_t2@exists_to_any_1)
+   NO_GATHER(alt_t1 alt_t2@exists_to_any_1)
    DO_NOT_SCAN(alt_t2@exists_1)
 (10 rows)
 
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
@@ -57,12 +57,12 @@ WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
      ->  Index Only Scan using alt_t2_a_idx on alt_t2
            Index Cond: (a = alt_t1.a)
  Supplied Plan Advice:
-   DO_NOT_SCAN(alt_t2@exists_2) /* matched */
+   DO_NOT_SCAN(alt_t2@exists_to_any_1) /* matched */
  Generated Plan Advice:
    SEQ_SCAN(alt_t1)
    INDEX_ONLY_SCAN(alt_t2@exists_1 public.alt_t2_a_idx)
    NO_GATHER(alt_t1 alt_t2@exists_1)
-   DO_NOT_SCAN(alt_t2@exists_2)
+   DO_NOT_SCAN(alt_t2@exists_to_any_1)
 (12 rows)
 
 COMMIT;
diff --git a/contrib/pg_plan_advice/sql/alternatives.sql b/contrib/pg_plan_advice/sql/alternatives.sql
index 16299edd196..f45f7083882 100644
--- a/contrib/pg_plan_advice/sql/alternatives.sql
+++ b/contrib/pg_plan_advice/sql/alternatives.sql
@@ -22,7 +22,7 @@ SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
-SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_2)';
+SET LOCAL pg_plan_advice.advice = 'DO_NOT_SCAN(alt_t2@exists_to_any_1)';
 EXPLAIN (COSTS OFF, PLAN_ADVICE)
 SELECT * FROM alt_t1
 WHERE EXISTS (SELECT 1 FROM alt_t2 WHERE alt_t2.a = alt_t1.a) OR alt_t1.a < 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index ccec1eaa7fe..cf5bfa04ad5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -272,7 +272,7 @@ make_subplan(PlannerInfo *root, Query *orig_subquery,
 			char	   *plan_name;
 
 			/* Generate Paths for the ANY subquery; we'll need all rows */
-			plan_name = choose_plan_name(root->glob, sublinkstr, true);
+			plan_name = choose_plan_name(root->glob, "exists_to_any", true);
 			subroot = subquery_planner(root->glob, subquery, plan_name,
 									   root, subroot, false, 0.0, NULL);
 
diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out
index 849049f9c51..aac89fd9d9b 100644
--- a/src/test/regress/expected/partition_prune.out
+++ b/src/test/regress/expected/partition_prune.out
@@ -1921,15 +1921,15 @@ where asptab.id > ss.b::int;
    ->  Seq Scan on int4_tbl touter
    ->  Append
          ->  Index Only Scan using asptab0_pkey on asptab0 asptab_1
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-               SubPlan exists_4
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+               SubPlan exists_to_any_2
                  ->  Seq Scan on int4_tbl tinner_2
          ->  Index Only Scan using asptab1_pkey on asptab1 asptab_2
-               Index Cond: (id > (EXISTS(SubPlan exists_3))::integer)
-         SubPlan exists_3
+               Index Cond: (id > (EXISTS(SubPlan exists_2))::integer)
+         SubPlan exists_2
            ->  Seq Scan on int4_tbl tinner_1
                  Filter: (f1 = touter.f1)
-   SubPlan exists_2
+   SubPlan exists_to_any_1
      ->  Seq Scan on int4_tbl tinner
 (14 rows)
 
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index a3778c23c34..af4aa78a406 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -1253,12 +1253,12 @@ rollback;  -- to get rid of the bogus operator
 explain (costs off)
 select count(*) from tenk1 t
 where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0);
-                                   QUERY PLAN                                    
----------------------------------------------------------------------------------
+                                       QUERY PLAN                                       
+----------------------------------------------------------------------------------------
  Aggregate
    ->  Seq Scan on tenk1 t
-         Filter: ((ANY (unique2 = (hashed SubPlan exists_2).col1)) OR (ten < 0))
-         SubPlan exists_2
+         Filter: ((ANY (unique2 = (hashed SubPlan exists_to_any_1).col1)) OR (ten < 0))
+         SubPlan exists_to_any_1
            ->  Index Only Scan using tenk1_unique1 on tenk1 k
 (5 rows)
 
@@ -1303,8 +1303,8 @@ analyze exists_tbl;
 explain (costs off)
 select * from exists_tbl t1
   where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
-                                QUERY PLAN                                 
----------------------------------------------------------------------------
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
  Append
    ->  Seq Scan on exists_tbl_null t1_1
          Filter: (EXISTS(SubPlan exists_1) OR (c3 < 0))
@@ -1315,8 +1315,8 @@ select * from exists_tbl t1
                  ->  Seq Scan on exists_tbl_def t2_2
                        Filter: (t1_1.c1 = c2)
    ->  Seq Scan on exists_tbl_def t1_2
-         Filter: ((ANY (c1 = (hashed SubPlan exists_2).col1)) OR (c3 < 0))
-         SubPlan exists_2
+         Filter: ((ANY (c1 = (hashed SubPlan exists_to_any_1).col1)) OR (c3 < 0))
+         SubPlan exists_to_any_1
            ->  Append
                  ->  Seq Scan on exists_tbl_null t2_4
                  ->  Seq Scan on exists_tbl_def t2_5
-- 
2.43.0


--Multipart=_Fri__5_Jun_2026_16_56_41_+0900_pZl5LblHO6/MauHi--





^ permalink  raw  reply  [nested|flat] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ 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; 356+ 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] 356+ messages in thread


end of thread, other threads:[~2026-08-05 03:00 UTC | newest]

Thread overview: 356+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-04-07 20:30 [PATCH v4 1/1] remove toast reloptions Nathan Bossart <nathan@postgresql.org>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.jp>
2026-05-25 01:16 [PATCH] Rename EXISTS-to-ANY converted subplan to exists_to_any Yugo Nagata <nagata@sraoss.co.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