diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-01-13 17:19:10 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-01-13 17:19:10 +0000 |
commit | c06b31dc31e5f6a8ee669449157b39be9987e375 (patch) | |
tree | efe0e2c563e1de018bd703727560ae2dde5239e8 /src/backend/parser/parse_target.c | |
parent | c2eef62c6632df0a9e5a8c6d5dfc378842ce488e (diff) | |
download | postgresql-c06b31dc31e5f6a8ee669449157b39be9987e375.tar.gz postgresql-c06b31dc31e5f6a8ee669449157b39be9987e375.zip |
get_names_for_var didn't do recursion for unnamed JOIN vars quite right;
got it wrong when the JOIN was in an outer query level. Per example from
Laurie Burrow. Also fix same issue in markTargetListOrigin. I think the
latter is only a latent bug since we currently don't apply markTargetListOrigin
except at the outer level ... but should do it right anyway.
Diffstat (limited to 'src/backend/parser/parse_target.c')
-rw-r--r-- | src/backend/parser/parse_target.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index b931b3bb0ce..ebba3e868f1 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.128 2004/12/31 22:00:27 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.129 2005/01/13 17:19:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -29,7 +29,8 @@ #include "utils/typcache.h" -static void markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var); +static void markTargetListOrigin(ParseState *pstate, Resdom *res, + Var *var, int levelsup); static Node *transformAssignmentIndirection(ParseState *pstate, Node *basenode, const char *targetName, @@ -174,7 +175,7 @@ markTargetListOrigins(ParseState *pstate, List *targetlist) { TargetEntry *tle = (TargetEntry *) lfirst(l); - markTargetListOrigin(pstate, tle->resdom, (Var *) tle->expr); + markTargetListOrigin(pstate, tle->resdom, (Var *) tle->expr, 0); } } @@ -182,18 +183,22 @@ markTargetListOrigins(ParseState *pstate, List *targetlist) * markTargetListOrigin() * If 'var' is a Var of a plain relation, mark 'res' with its origin * + * levelsup is an extra offset to interpret the Var's varlevelsup correctly. + * * This is split out so it can recurse for join references. Note that we * do not drill down into views, but report the view as the column owner. */ static void -markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var) +markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var, int levelsup) { + int netlevelsup; RangeTblEntry *rte; AttrNumber attnum; if (var == NULL || !IsA(var, Var)) return; - rte = GetRTEByRangeTablePosn(pstate, var->varno, var->varlevelsup); + netlevelsup = var->varlevelsup + levelsup; + rte = GetRTEByRangeTablePosn(pstate, var->varno, netlevelsup); attnum = var->varattno; switch (rte->rtekind) @@ -223,7 +228,7 @@ markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var) Assert(attnum > 0 && attnum <= list_length(rte->joinaliasvars)); aliasvar = (Var *) list_nth(rte->joinaliasvars, attnum - 1); - markTargetListOrigin(pstate, res, aliasvar); + markTargetListOrigin(pstate, res, aliasvar, netlevelsup); } break; case RTE_SPECIAL: |