Remove no-longer-necessary restriction against uplevel correlation vars

outside WHERE clause.  Fix a couple of places that didn't handle uplevel
refs cleanly.
This commit is contained in:
Tom Lane 2000-03-23 07:38:30 +00:00
parent dadb14fa60
commit 37ab088770
3 changed files with 23 additions and 33 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.57 2000/03/15 23:31:04 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.58 2000/03/23 07:38:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -74,10 +74,9 @@ void
setTargetTable(ParseState *pstate, char *relname) setTargetTable(ParseState *pstate, char *relname)
{ {
RangeTblEntry *rte; RangeTblEntry *rte;
int sublevels_up;
if ((refnameRangeTablePosn(pstate, relname, &sublevels_up) == 0) /* look for relname only at current nesting level... */
|| (sublevels_up != 0)) if (refnameRangeTablePosn(pstate, relname, NULL) == 0)
rte = addRangeTableEntry(pstate, relname, rte = addRangeTableEntry(pstate, relname,
makeAttr(relname, NULL), makeAttr(relname, NULL),
FALSE, FALSE, FALSE); FALSE, FALSE, FALSE);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.76 2000/03/19 00:19:39 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.77 2000/03/23 07:38:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -495,6 +495,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
{ {
RangeTblEntry *rte; RangeTblEntry *rte;
int vnum; int vnum;
int sublevels_up;
/* /*
* a relation * a relation
@ -516,7 +517,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
relname = rte->relname; relname = rte->relname;
vnum = refnameRangeTablePosn(pstate, rte->eref->relname, NULL); vnum = refnameRangeTablePosn(pstate, rte->eref->relname,
&sublevels_up);
/* /*
* for func(relname), the param to the function is the tuple * for func(relname), the param to the function is the tuple
@ -527,7 +529,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
*/ */
toid = typeTypeId(typenameType(relname)); toid = typeTypeId(typenameType(relname));
/* replace it in the arg list */ /* replace it in the arg list */
lfirst(i) = makeVar(vnum, 0, toid, -1, 0); lfirst(i) = makeVar(vnum, 0, toid, -1, sublevels_up);
} }
else if (!attisset) else if (!attisset)
{ {

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.38 2000/03/17 02:36:17 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.39 2000/03/23 07:38:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -93,11 +93,7 @@ refnameRangeTableEntries(ParseState *pstate, char *refname)
if (strcmp(rte->eref->relname, refname) == 0) if (strcmp(rte->eref->relname, refname) == 0)
rteList = lappend(rteList, rte); rteList = lappend(rteList, rte);
} }
/* only allow correlated columns in WHERE clause */
if (pstate->p_in_where_clause)
pstate = pstate->parentParseState; pstate = pstate->parentParseState;
else
break;
} }
return rteList; return rteList;
} }
@ -117,16 +113,15 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
if (strcmp(rte->eref->relname, refname) == 0) if (strcmp(rte->eref->relname, refname) == 0)
return rte; return rte;
} }
/* only allow correlated columns in WHERE clause */
if (pstate->p_in_where_clause)
pstate = pstate->parentParseState; pstate = pstate->parentParseState;
else
break;
} }
return NULL; return NULL;
} }
/* given refname, return id of variable; position starts with 1 */ /* given refname, return RT index (starting with 1) of the relation,
* and optionally get its nesting depth (0 = current). If sublevels_up
* is NULL, only consider rels at the current nesting level.
*/
int int
refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up) refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
{ {
@ -147,13 +142,9 @@ refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
return index; return index;
index++; index++;
} }
/* only allow correlated columns in WHERE clause */
if (pstate->p_in_where_clause)
{
pstate = pstate->parentParseState; pstate = pstate->parentParseState;
if (sublevels_up) if (sublevels_up)
(*sublevels_up)++; (*sublevels_up)++;
}
else else
break; break;
} }
@ -168,9 +159,8 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
{ {
List *et; List *et;
List *rtable; List *rtable;
RangeTblEntry *rte_result; RangeTblEntry *rte_result = NULL;
rte_result = NULL;
while (pstate != NULL) while (pstate != NULL)
{ {
if (pstate->p_is_rule) if (pstate->p_is_rule)
@ -226,11 +216,10 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
rte_result = rte; rte_result = rte;
} }
/* only allow correlated columns in WHERE clause */ if (rte_result != NULL)
if (pstate->p_in_where_clause && rte_result == NULL) break; /* found */
pstate = pstate->parentParseState; pstate = pstate->parentParseState;
else
break;
} }
return rte_result; return rte_result;
} }