Remove code setting wrap_non_vars to true for UNION ALL subqueries
authorRichard Guo <[email protected]>
Thu, 13 Mar 2025 07:34:28 +0000 (16:34 +0900)
committerRichard Guo <[email protected]>
Thu, 13 Mar 2025 07:34:28 +0000 (16:34 +0900)
In pull_up_simple_subquery and pull_up_constant_function, there is
code that sets wrap_non_vars to true when dealing with an appendrel
member.  The goal is to wrap subquery outputs that are not simple Vars
in PlaceHolderVars, ensuring that what we pull up doesn't get merged
into a surrounding expression during later processing, which could
cause it to fail to match the expression actually available from the
appendrel.

However, this is unnecessary.  When pulling up an appendrel child
subquery, the only part of the upper query that could reference the
appendrel child yet is the translated_vars list of the associated
AppendRelInfo that we just made for this child.  Furthermore, we do
not want to force use of PHVs in the AppendRelInfo, as there is no
outer join between.  In fact, perform_pullup_replace_vars always sets
wrap_non_vars to false before performing pullup_replace_vars on the
AppendRelInfo.

This patch simply removes the code that sets wrap_non_vars to true for
UNION ALL subqueries.

Author: Richard Guo <[email protected]>
Reviewed-by: Dean Rasheed <[email protected]>
Discussion: https://postgr.es/m/CAMbWs4-VXDEi1v+hZYLxpOv0riJxHsCkCH1f46tLnhonEAyGCQ@mail.gmail.com

src/backend/optimizer/prep/prepjointree.c

index a9efc0b23a2290f34f85c355da4a764fca06edb5..794b98e560d76542aa47a3564c88e66c579b1d90 100644 (file)
@@ -1440,24 +1440,14 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte,
    rvcontext.rv_cache = palloc0((list_length(subquery->targetList) + 1) *
                                 sizeof(Node *));
 
-   /*
-    * If we are dealing with an appendrel member then anything that's not a
-    * simple Var has to be turned into a PlaceHolderVar.  We force this to
-    * ensure that what we pull up doesn't get merged into a surrounding
-    * expression during later processing and then fail to match the
-    * expression actually available from the appendrel.
-    */
-   if (containing_appendrel != NULL)
-       rvcontext.wrap_non_vars = true;
-
    /*
     * If the parent query uses grouping sets, we need a PlaceHolderVar for
-    * anything that's not a simple Var.  Again, this ensures that expressions
-    * retain their separate identity so that they will match grouping set
-    * columns when appropriate.  (It'd be sufficient to wrap values used in
-    * grouping set columns, and do so only in non-aggregated portions of the
-    * tlist and havingQual, but that would require a lot of infrastructure
-    * that pullup_replace_vars hasn't currently got.)
+    * anything that's not a simple Var.  This ensures that expressions retain
+    * their separate identity so that they will match grouping set columns
+    * when appropriate.  (It'd be sufficient to wrap values used in grouping
+    * set columns, and do so only in non-aggregated portions of the tlist and
+    * havingQual, but that would require a lot of infrastructure that
+    * pullup_replace_vars hasn't currently got.)
     */
    if (parse->groupingSets)
        rvcontext.wrap_non_vars = true;
@@ -2159,17 +2149,10 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode,
    rvcontext.rv_cache = palloc0((list_length(rvcontext.targetlist) + 1) *
                                 sizeof(Node *));
 
-   /*
-    * If we are dealing with an appendrel member then anything that's not a
-    * simple Var has to be turned into a PlaceHolderVar.  (See comments in
-    * pull_up_simple_subquery().)
-    */
-   if (containing_appendrel != NULL)
-       rvcontext.wrap_non_vars = true;
-
    /*
     * If the parent query uses grouping sets, we need a PlaceHolderVar for
-    * anything that's not a simple Var.
+    * anything that's not a simple Var.  (See comments in
+    * pull_up_simple_subquery().)
     */
    if (parse->groupingSets)
        rvcontext.wrap_non_vars = true;