Ooops, didn't cut-and-paste quite enough code from ResolveNew;
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Jan 2003 18:26:02 +0000 (18:26 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Jan 2003 18:26:02 +0000 (18:26 +0000)
with result that flatten_join_alias_vars failed to descend into subselects.

src/backend/optimizer/util/var.c

index 11267428d7ae8a9936091e6e48d2e441c04e4686..47db90ad8a05e41913522adb61b3ab4c74e69aaf 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.44 2003/01/15 19:35:44 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.45 2003/01/16 18:26:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -360,6 +360,23 @@ flatten_join_alias_vars_mutator(Node *node,
                /* expand it; recurse in case join input is itself a join */
                return flatten_join_alias_vars_mutator(newvar, context);
        }
+
+       /*
+        * Since expression_tree_mutator won't touch subselects, we have to
+        * handle them specially.
+        */
+       if (IsA(node, SubLink))
+       {
+               SubLink    *sublink = (SubLink *) node;
+               SubLink    *newnode;
+
+               FLATCOPY(newnode, sublink, SubLink);
+               MUTATE(newnode->lefthand, sublink->lefthand, List *,
+                          flatten_join_alias_vars_mutator, context);
+               MUTATE(newnode->subselect, sublink->subselect, Node *,
+                          flatten_join_alias_vars_mutator, context);
+               return (Node *) newnode;
+       }
        if (IsA(node, Query))
        {
                /* Recurse into RTE subquery or not-yet-planned sublink subquery */
@@ -375,6 +392,7 @@ flatten_join_alias_vars_mutator(Node *node,
        }
        /* Already-planned tree not supported */
        Assert(!is_subplan(node));
+
        return expression_tree_mutator(node, flatten_join_alias_vars_mutator,
                                                                   (void *) context);
 }