mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
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.
This commit is contained in:
@ -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:
|
||||
|
Reference in New Issue
Block a user