aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/parser/parse_clause.c14
-rw-r--r--src/backend/parser/parse_expr.c4
-rw-r--r--src/backend/parser/parse_relation.c11
-rw-r--r--src/include/parser/parse_relation.h4
4 files changed, 21 insertions, 12 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 20937ad2b69..7bf9490ed59 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.124 2003/09/26 15:27:35 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.124.2.1 2004/04/18 18:13:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1112,10 +1112,18 @@ findTargetlistEntry(ParseState *pstate, Node *node, List *tlist, int clause)
* is a matching column. If so, fall through to let
* transformExpr() do the rest. NOTE: if name could refer
* ambiguously to more than one column name exposed by FROM,
- * colnameToVar will ereport(ERROR). That's just what we want
+ * colNameToVar will ereport(ERROR). That's just what we want
* here.
+ *
+ * Small tweak for 7.4.3: ignore matches in upper query levels.
+ * This effectively changes the search order for bare names to
+ * (1) local FROM variables, (2) local targetlist aliases,
+ * (3) outer FROM variables, whereas before it was (1) (3) (2).
+ * SQL92 and SQL99 do not allow GROUPing BY an outer reference,
+ * so this breaks no cases that are legal per spec, and it
+ * seems a more self-consistent behavior.
*/
- if (colnameToVar(pstate, name) != NULL)
+ if (colNameToVar(pstate, name, true) != NULL)
name = NULL;
}
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index b5d23fadfeb..b40e8953276 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.163 2003/09/26 15:27:35 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.163.2.1 2004/04/18 18:13:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -990,7 +990,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref)
char *name = strVal(lfirst(cref->fields));
/* Try to identify as an unqualified column */
- node = colnameToVar(pstate, name);
+ node = colNameToVar(pstate, name, false);
if (node == NULL)
{
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 7f8bda311c0..e12367641d5 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.90 2003/09/25 06:58:01 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.90.2.1 2004/04/18 18:13:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -513,13 +513,14 @@ scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, char *colname)
}
/*
- * colnameToVar
+ * colNameToVar
* Search for an unqualified column name.
* If found, return the appropriate Var node (or expression).
* If not found, return NULL. If the name proves ambiguous, raise error.
+ * If localonly is true, only names in the innermost query are considered.
*/
Node *
-colnameToVar(ParseState *pstate, char *colname)
+colNameToVar(ParseState *pstate, char *colname, bool localonly)
{
Node *result = NULL;
ParseState *orig_pstate = pstate;
@@ -576,8 +577,8 @@ colnameToVar(ParseState *pstate, char *colname)
}
}
- if (result != NULL)
- break; /* found */
+ if (result != NULL || localonly)
+ break; /* found, or don't want to look at parent */
pstate = pstate->parentParseState;
levels_up++;
diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h
index 68cadbf76a8..0d344c4c571 100644
--- a/src/include/parser/parse_relation.h
+++ b/src/include/parser/parse_relation.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parse_relation.h,v 1.41 2003/08/04 02:40:14 momjian Exp $
+ * $Id: parse_relation.h,v 1.41.4.1 2004/04/18 18:13:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -27,7 +27,7 @@ extern void checkNameSpaceConflicts(ParseState *pstate, Node *namespace1,
extern int RTERangeTablePosn(ParseState *pstate,
RangeTblEntry *rte,
int *sublevels_up);
-extern Node *colnameToVar(ParseState *pstate, char *colname);
+extern Node *colNameToVar(ParseState *pstate, char *colname, bool localonly);
extern Node *qualifiedNameToVar(ParseState *pstate,
char *schemaname,
char *refname,