OSDN Git Service

Make flatten_join_alias_vars() do the right thing when expanding an alias
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Feb 2003 22:21:11 +0000 (22:21 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Feb 2003 22:21:11 +0000 (22:21 +0000)
referenced from a subquery.  Per example from Stefanos Harhalakis.

src/backend/optimizer/util/var.c

index 729ded5..4fad468 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.47 2003/01/20 18:54:58 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.48 2003/02/06 22:21:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,6 +19,7 @@
 #include "optimizer/prep.h"
 #include "optimizer/var.h"
 #include "parser/parsetree.h"
+#include "rewrite/rewriteManip.h"
 
 
 typedef struct
@@ -400,14 +401,25 @@ flatten_join_alias_vars_mutator(Node *node,
                RangeTblEntry *rte;
                Node       *newvar;
 
+               /* No change unless Var belongs to a JOIN of the target level */
                if (var->varlevelsup != context->sublevels_up)
                        return node;            /* no need to copy, really */
                rte = rt_fetch(var->varno, context->root->rtable);
                if (rte->rtekind != RTE_JOIN)
                        return node;
                Assert(var->varattno > 0);
+               /* Okay, must expand it */
                newvar = (Node *) nth(var->varattno - 1, rte->joinaliasvars);
-               /* expand it; recurse in case join input is itself a join */
+               /*
+                * If we are expanding an alias carried down from an upper query,
+                * must adjust its varlevelsup fields.
+                */
+               if (context->sublevels_up != 0)
+               {
+                       newvar = copyObject(newvar);
+                       IncrementVarSublevelsUp(newvar, context->sublevels_up, 0);
+               }
+               /* Recurse in case join input is itself a join */
                return flatten_join_alias_vars_mutator(newvar, context);
        }
        if (IsA(node, InClauseInfo))