aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_target.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-01-13 17:19:10 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-01-13 17:19:10 +0000
commitc06b31dc31e5f6a8ee669449157b39be9987e375 (patch)
treeefe0e2c563e1de018bd703727560ae2dde5239e8 /src/backend/parser/parse_target.c
parentc2eef62c6632df0a9e5a8c6d5dfc378842ce488e (diff)
downloadpostgresql-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.c17
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: