Skip to content

Commit 37ab088

Browse files
committed
Remove no-longer-necessary restriction against uplevel correlation vars
outside WHERE clause. Fix a couple of places that didn't handle uplevel refs cleanly.
1 parent dadb14f commit 37ab088

File tree

3 files changed

+23
-33
lines changed

3 files changed

+23
-33
lines changed

src/backend/parser/parse_clause.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.57 2000/03/15 23:31:04 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.58 2000/03/23 07:38:30 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -74,10 +74,9 @@ void
7474
setTargetTable(ParseState *pstate, char *relname)
7575
{
7676
RangeTblEntry *rte;
77-
int sublevels_up;
7877

79-
if ((refnameRangeTablePosn(pstate, relname, &sublevels_up) == 0)
80-
|| (sublevels_up != 0))
78+
/* look for relname only at current nesting level... */
79+
if (refnameRangeTablePosn(pstate, relname, NULL) == 0)
8180
rte = addRangeTableEntry(pstate, relname,
8281
makeAttr(relname, NULL),
8382
FALSE, FALSE, FALSE);

src/backend/parser/parse_func.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.76 2000/03/19 00:19:39 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.77 2000/03/23 07:38:30 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -495,6 +495,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
495495
{
496496
RangeTblEntry *rte;
497497
int vnum;
498+
int sublevels_up;
498499

499500
/*
500501
* a relation
@@ -516,7 +517,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
516517

517518
relname = rte->relname;
518519

519-
vnum = refnameRangeTablePosn(pstate, rte->eref->relname, NULL);
520+
vnum = refnameRangeTablePosn(pstate, rte->eref->relname,
521+
&sublevels_up);
520522

521523
/*
522524
* for func(relname), the param to the function is the tuple
@@ -527,7 +529,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
527529
*/
528530
toid = typeTypeId(typenameType(relname));
529531
/* replace it in the arg list */
530-
lfirst(i) = makeVar(vnum, 0, toid, -1, 0);
532+
lfirst(i) = makeVar(vnum, 0, toid, -1, sublevels_up);
531533
}
532534
else if (!attisset)
533535
{

src/backend/parser/parse_relation.c

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.38 2000/03/17 02:36:17 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.39 2000/03/23 07:38:30 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -93,11 +93,7 @@ refnameRangeTableEntries(ParseState *pstate, char *refname)
9393
if (strcmp(rte->eref->relname, refname) == 0)
9494
rteList = lappend(rteList, rte);
9595
}
96-
/* only allow correlated columns in WHERE clause */
97-
if (pstate->p_in_where_clause)
98-
pstate = pstate->parentParseState;
99-
else
100-
break;
96+
pstate = pstate->parentParseState;
10197
}
10298
return rteList;
10399
}
@@ -117,16 +113,15 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
117113
if (strcmp(rte->eref->relname, refname) == 0)
118114
return rte;
119115
}
120-
/* only allow correlated columns in WHERE clause */
121-
if (pstate->p_in_where_clause)
122-
pstate = pstate->parentParseState;
123-
else
124-
break;
116+
pstate = pstate->parentParseState;
125117
}
126118
return NULL;
127119
}
128120

129-
/* given refname, return id of variable; position starts with 1 */
121+
/* given refname, return RT index (starting with 1) of the relation,
122+
* and optionally get its nesting depth (0 = current). If sublevels_up
123+
* is NULL, only consider rels at the current nesting level.
124+
*/
130125
int
131126
refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
132127
{
@@ -147,13 +142,9 @@ refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
147142
return index;
148143
index++;
149144
}
150-
/* only allow correlated columns in WHERE clause */
151-
if (pstate->p_in_where_clause)
152-
{
153-
pstate = pstate->parentParseState;
154-
if (sublevels_up)
155-
(*sublevels_up)++;
156-
}
145+
pstate = pstate->parentParseState;
146+
if (sublevels_up)
147+
(*sublevels_up)++;
157148
else
158149
break;
159150
}
@@ -168,9 +159,8 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
168159
{
169160
List *et;
170161
List *rtable;
171-
RangeTblEntry *rte_result;
162+
RangeTblEntry *rte_result = NULL;
172163

173-
rte_result = NULL;
174164
while (pstate != NULL)
175165
{
176166
if (pstate->p_is_rule)
@@ -226,11 +216,10 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
226216
rte_result = rte;
227217
}
228218

229-
/* only allow correlated columns in WHERE clause */
230-
if (pstate->p_in_where_clause && rte_result == NULL)
231-
pstate = pstate->parentParseState;
232-
else
233-
break;
219+
if (rte_result != NULL)
220+
break; /* found */
221+
222+
pstate = pstate->parentParseState;
234223
}
235224
return rte_result;
236225
}

0 commit comments

Comments
 (0)