*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.127 2004/01/23 02:13:12 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.128 2004/04/18 18:12:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* 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;
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.168 2004/04/02 19:06:58 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.169 2004/04/18 18:12:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
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)
{
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.93 2004/04/02 19:06:58 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.94 2004/04/18 18:12:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
}
/*
- * 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;
}
}
- if (result != NULL)
- break; /* found */
+ if (result != NULL || localonly)
+ break; /* found, or don't want to look at parent */
pstate = pstate->parentParseState;
levels_up++;
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/parser/parse_relation.h,v 1.43 2004/04/02 19:07:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/parser/parse_relation.h,v 1.44 2004/04/18 18:12:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
int sublevels_up);
extern Node *scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte,
char *colname);
-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,