aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/util/var.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c
index 729ded51323..4fad46889fd 100644
--- a/src/backend/optimizer/util/var.c
+++ b/src/backend/optimizer/util/var.c
@@ -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))