diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/util/var.c | 16 |
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)) |