aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/parse_clause.c7
-rw-r--r--src/backend/parser/parse_func.c8
-rw-r--r--src/backend/parser/parse_relation.c41
3 files changed, 23 insertions, 33 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 96a005ff0d9..d2ceac82732 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -8,7 +8,7 @@
*
*
* 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)
{
RangeTblEntry *rte;
- int sublevels_up;
- if ((refnameRangeTablePosn(pstate, relname, &sublevels_up) == 0)
- || (sublevels_up != 0))
+ /* look for relname only at current nesting level... */
+ if (refnameRangeTablePosn(pstate, relname, NULL) == 0)
rte = addRangeTableEntry(pstate, relname,
makeAttr(relname, NULL),
FALSE, FALSE, FALSE);
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 7134d5e7811..67d5aea77ad 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -8,7 +8,7 @@
*
*
* 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;
int vnum;
+ int sublevels_up;
/*
* a relation
@@ -516,7 +517,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
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
@@ -527,7 +529,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
*/
toid = typeTypeId(typenameType(relname));
/* 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)
{
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 085cd5366bb..76c79de6c6d 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -8,7 +8,7 @@
*
*
* 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)
rteList = lappend(rteList, rte);
}
- /* only allow correlated columns in WHERE clause */
- if (pstate->p_in_where_clause)
- pstate = pstate->parentParseState;
- else
- break;
+ pstate = pstate->parentParseState;
}
return rteList;
}
@@ -117,16 +113,15 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
if (strcmp(rte->eref->relname, refname) == 0)
return rte;
}
- /* only allow correlated columns in WHERE clause */
- if (pstate->p_in_where_clause)
- pstate = pstate->parentParseState;
- else
- break;
+ pstate = pstate->parentParseState;
}
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
refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
{
@@ -147,13 +142,9 @@ refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
return index;
index++;
}
- /* only allow correlated columns in WHERE clause */
- if (pstate->p_in_where_clause)
- {
- pstate = pstate->parentParseState;
- if (sublevels_up)
- (*sublevels_up)++;
- }
+ pstate = pstate->parentParseState;
+ if (sublevels_up)
+ (*sublevels_up)++;
else
break;
}
@@ -168,9 +159,8 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
{
List *et;
List *rtable;
- RangeTblEntry *rte_result;
+ RangeTblEntry *rte_result = NULL;
- rte_result = NULL;
while (pstate != NULL)
{
if (pstate->p_is_rule)
@@ -226,11 +216,10 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
rte_result = rte;
}
- /* only allow correlated columns in WHERE clause */
- if (pstate->p_in_where_clause && rte_result == NULL)
- pstate = pstate->parentParseState;
- else
- break;
+ if (rte_result != NULL)
+ break; /* found */
+
+ pstate = pstate->parentParseState;
}
return rte_result;
}