Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit37ab088

Browse files
committed
Remove no-longer-necessary restriction against uplevel correlation vars
outside WHERE clause. Fix a couple of places that didn't handle uplevelrefs cleanly.
1 parentdadb14f commit37ab088

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-
intsublevels_up;
7877

79-
if ((refnameRangeTablePosn(pstate,relname,&sublevels_up)==0)
80-
|| (sublevels_up!=0))
78+
/* look forrelname 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
intvnum;
498+
intsublevels_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
elseif (!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
returnrteList;
10399
}
@@ -117,16 +113,15 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
117113
if (strcmp(rte->eref->relname,refname)==0)
118114
returnrte;
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
returnNULL;
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
returnindex;
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
returnrte_result;
236225
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp