diff options
Diffstat (limited to 'src/backend/parser/parse_func.c')
| -rw-r--r-- | src/backend/parser/parse_func.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 677acf9d1a3..edd0e810957 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.133 2002/08/02 18:15:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.134 2002/08/08 01:44:30 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -51,6 +51,8 @@ static int match_argtypes(int nargs, static FieldSelect *setup_field_select(Node *input, char *attname, Oid relid); static FuncCandidateList func_select_candidate(int nargs, Oid *input_typeids, FuncCandidateList candidates); +static void unknown_attribute(const char *schemaname, const char *relname, + const char *attname); /* @@ -80,7 +82,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Oid funcid; List *i; Node *first_arg = NULL; - char *refname; int nargs = length(fargs); int argn; Oid oid_array[FUNC_MAX_ARGS]; @@ -121,10 +122,11 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, if (IsA(first_arg, RangeVar)) { /* First arg is a relation. This could be a projection. */ - refname = ((RangeVar *) first_arg)->relname; - - /* XXX WRONG: ignores possible qualification of argument */ - retval = qualifiedNameToVar(pstate, refname, cname, true); + retval = qualifiedNameToVar(pstate, + ((RangeVar *) first_arg)->schemaname, + ((RangeVar *) first_arg)->relname, + cname, + true); if (retval) return retval; } @@ -156,16 +158,19 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, if (IsA(arg, RangeVar)) { + char *schemaname; + char *relname; RangeTblEntry *rte; int vnum; int sublevels_up; /* - * a relation + * a relation: look it up in the range table, or add if needed */ - refname = ((RangeVar *) arg)->relname; + schemaname = ((RangeVar *) arg)->schemaname; + relname = ((RangeVar *) arg)->relname; - rte = refnameRangeTblEntry(pstate, refname, + rte = refnameRangeTblEntry(pstate, schemaname, relname, &sublevels_up); if (rte == NULL) @@ -199,11 +204,11 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, * named tuple type */ if (is_column) - elog(ERROR, "No such attribute %s.%s", - refname, strVal(lfirst(funcname))); + unknown_attribute(schemaname, relname, + strVal(lfirst(funcname))); else elog(ERROR, "Cannot pass result of sub-select or join %s to a function", - refname); + relname); toid = InvalidOid; /* keep compiler quiet */ break; } @@ -268,8 +273,9 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Assert(nargs == 1); if (IsA(first_arg, RangeVar)) - elog(ERROR, "No such attribute %s.%s", - ((RangeVar *) first_arg)->relname, colname); + unknown_attribute(((RangeVar *) first_arg)->schemaname, + ((RangeVar *) first_arg)->relname, + colname); relTypeId = exprType(first_arg); if (!ISCOMPLEX(relTypeId)) elog(ERROR, "Attribute notation .%s applied to type %s, which is not a complex type", @@ -1226,6 +1232,21 @@ ParseComplexProjection(ParseState *pstate, } /* + * Simple helper routine for delivering "No such attribute" error message + */ +static void +unknown_attribute(const char *schemaname, const char *relname, + const char *attname) +{ + if (schemaname) + elog(ERROR, "No such attribute %s.%s.%s", + schemaname, relname, attname); + else + elog(ERROR, "No such attribute %s.%s", + relname, attname); +} + +/* * Error message when function lookup fails that gives details of the * argument types */ |
