diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 951e45c5ff..4c7dbba128 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.44 2002/04/11 19:59:57 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.45 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -24,7 +24,6 @@ #include "optimizer/cost.h" #include "parser/parse_coerce.h" #include "parser/parse_func.h" -#include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/syscache.h" @@ -83,7 +82,7 @@ AggregateCreate(const char *aggName, proc = (Form_pg_proc) GETSTRUCT(tup); if (proc->prorettype != aggTransType) elog(ERROR, "return type of transition function %s is not %s", - NameListToString(aggtransfnName), typeidTypeName(aggTransType)); + NameListToString(aggtransfnName), format_type_be(aggTransType)); /* * If the transfn is strict and the initval is NULL, make sure input diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index e9fcdc5d8e..50ea475f85 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.70 2002/04/11 19:59:57 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.71 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -140,7 +140,7 @@ ProcedureCreate(const char *procedureName, (relid = typeidTypeRelid(typev[0])) != 0 && get_attnum(relid, (char *) procedureName) != InvalidAttrNumber) elog(ERROR, "method %s already an attribute of type %s", - procedureName, typeidTypeName(typev[0])); + procedureName, format_type_be(typev[0])); /* * If this is a postquel procedure, we parse it here in order to be diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 885b760a51..864ad65eab 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.13 2002/05/12 23:43:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.14 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -548,7 +548,7 @@ MergeAttributes(List *schema, List *supers, bool istemp, elog(ERROR, "CREATE TABLE: inherited attribute \"%s\" type conflict (%s and %s)", attributeName, TypeNameToString(def->typename), - typeidTypeName(attribute->atttypid)); + format_type_be(attribute->atttypid)); /* Merge of NOT NULL constraints = OR 'em together */ def->is_not_null |= attribute->attnotnull; /* Default and other constraints are handled below */ diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 6017454681..b45376013f 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -46,7 +46,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeAgg.c,v 1.83 2002/04/29 22:28:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeAgg.c,v 1.84 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -63,7 +63,6 @@ #include "parser/parse_coerce.h" #include "parser/parse_expr.h" #include "parser/parse_oper.h" -#include "parser/parse_type.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -938,8 +937,8 @@ ExecInitAgg(Agg *node, EState *estate, Plan *parent) inputType, inputType, true); if (!OidIsValid(eq_function)) - elog(ERROR, "Unable to identify an equality operator for type '%s'", - typeidTypeName(inputType)); + elog(ERROR, "Unable to identify an equality operator for type %s", + format_type_be(inputType)); fmgr_info(eq_function, &(peraggstate->equalfn)); peraggstate->sortOperator = any_ordering_op(inputType); peraggstate->sortstate = NULL; diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index 881dfa4f1b..0ba4d679ed 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -15,7 +15,7 @@ * locate group boundaries. * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.45 2002/04/16 23:08:10 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.46 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,7 @@ #include "executor/executor.h" #include "executor/nodeGroup.h" #include "parser/parse_oper.h" -#include "parser/parse_type.h" +#include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -493,8 +493,8 @@ execTuplesMatchPrepare(TupleDesc tupdesc, eq_function = compatible_oper_funcid(makeList1(makeString("=")), typid, typid, true); if (!OidIsValid(eq_function)) - elog(ERROR, "Unable to identify an equality operator for type '%s'", - typeidTypeName(typid)); + elog(ERROR, "Unable to identify an equality operator for type %s", + format_type_be(typid)); fmgr_info(eq_function, &eqfunctions[i]); } diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 5d35d1b230..fdd375acd8 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.70 2002/05/12 23:43:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.71 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -30,7 +30,7 @@ #include "parser/parsetree.h" #include "parser/parse_expr.h" #include "parser/parse_oper.h" -#include "parser/parse_type.h" +#include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -748,7 +748,7 @@ process_implied_equality(Query *root, Node *item1, Node *item2, * datatypes? NO, because sortkey selection may screw up anyway. */ elog(ERROR, "Unable to identify an equality operator for types '%s' and '%s'", - typeidTypeName(ltype), typeidTypeName(rtype)); + format_type_be(ltype), format_type_be(rtype)); } pgopform = (Form_pg_operator) GETSTRUCT(eq_operator); @@ -759,7 +759,7 @@ process_implied_equality(Query *root, Node *item1, Node *item2, pgopform->oprrsortop != sortop2 || pgopform->oprresult != BOOLOID) elog(ERROR, "Equality operator for types '%s' and '%s' should be mergejoinable, but isn't", - typeidTypeName(ltype), typeidTypeName(rtype)); + format_type_be(ltype), format_type_be(rtype)); clause = makeNode(Expr); clause->typeOid = BOOLOID; diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 716cbcbb75..dbbaf033ac 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.72 2002/05/12 23:43:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.73 2002/05/17 22:35:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -133,7 +133,7 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, InvalidOid, isExplicit); if (!OidIsValid(funcId)) - elog(ERROR, "coerce_type: no conversion function from %s to %s", + elog(ERROR, "coerce_type: no conversion function from '%s' to '%s'", format_type_be(inputTypeId), format_type_be(targetTypeId)); result = build_func_call(funcId, baseTypeId, makeList1(node)); @@ -392,8 +392,8 @@ select_common_type(List *typeids, const char *context) * both types in different categories? then not much * hope... */ - elog(ERROR, "%s types \"%s\" and \"%s\" not matched", - context, typeidTypeName(ptype), typeidTypeName(ntype)); + elog(ERROR, "%s types '%s' and '%s' not matched", + context, format_type_be(ptype), format_type_be(ntype)); } else if (IsPreferredType(pcategory, ntype) && !IsPreferredType(pcategory, ptype) @@ -448,8 +448,8 @@ coerce_to_common_type(ParseState *pstate, Node *node, false); else { - elog(ERROR, "%s unable to convert to type \"%s\"", - context, typeidTypeName(targetTypeId)); + elog(ERROR, "%s unable to convert to type %s", + context, format_type_be(targetTypeId)); } return node; } diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index e29d5ca4b5..9a11074ed9 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.117 2002/05/12 23:43:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.118 2002/05/17 22:35:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -366,7 +366,7 @@ transformExpr(ParseState *pstate, Node *expr) /* Combining operators other than =/<> is dubious... */ if (length(left_list) != 1 && strcmp(opname, "=") != 0 && strcmp(opname, "<>") != 0) - elog(ERROR, "Row comparison cannot use '%s'", + elog(ERROR, "Row comparison cannot use operator %s", opname); /* @@ -405,13 +405,13 @@ transformExpr(ParseState *pstate, Node *expr) opform = (Form_pg_operator) GETSTRUCT(optup); if (opform->oprresult != BOOLOID) - elog(ERROR, "'%s' result type of '%s' must return '%s'" + elog(ERROR, "%s has result type of %s, but must return %s" " to be used with quantified predicate subquery", - opname, typeidTypeName(opform->oprresult), - typeidTypeName(BOOLOID)); + opname, format_type_be(opform->oprresult), + format_type_be(BOOLOID)); if (get_func_retset(opform->oprcode)) - elog(ERROR, "'%s' must not return a set" + elog(ERROR, "%s must not return a set" " to be used with quantified predicate subquery", opname); diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 1912ab4e07..ec54bae387 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.129 2002/05/12 23:43:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.130 2002/05/17 22:35:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -19,6 +19,7 @@ #include "catalog/namespace.h" #include "catalog/pg_inherits.h" #include "catalog/pg_proc.h" +#include "lib/stringinfo.h" #include "nodes/makefuncs.h" #include "parser/parse_coerce.h" #include "parser/parse_expr.h" @@ -261,9 +262,25 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, * give an error message that is appropriate for that case. */ if (is_column) - elog(ERROR, "Attribute \"%s\" not found", - strVal(lfirst(funcname))); - /* Else generate a detailed complaint */ + { + char *colname = strVal(lfirst(funcname)); + Oid relTypeId; + + Assert(nargs == 1); + if (IsA(first_arg, RangeVar)) + elog(ERROR, "No such attribute %s.%s", + ((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", + colname, format_type_be(relTypeId)); + else + elog(ERROR, "Attribute \"%s\" not found in datatype %s", + colname, format_type_be(relTypeId)); + } + /* + * Else generate a detailed complaint for a function + */ func_error(NULL, funcname, nargs, oid_array, "Unable to identify a function that satisfies the " "given argument types" @@ -1214,39 +1231,31 @@ func_error(const char *caller, List *funcname, int nargs, const Oid *argtypes, const char *msg) { - char p[(NAMEDATALEN + 2) * FUNC_MAX_ARGS], - *ptr; + StringInfoData argbuf; int i; - ptr = p; - *ptr = '\0'; + initStringInfo(&argbuf); + for (i = 0; i < nargs; i++) { if (i) - { - *ptr++ = ','; - *ptr++ = ' '; - } + appendStringInfo(&argbuf, ", "); if (OidIsValid(argtypes[i])) - { - strncpy(ptr, typeidTypeName(argtypes[i]), NAMEDATALEN); - *(ptr + NAMEDATALEN) = '\0'; - } + appendStringInfo(&argbuf, format_type_be(argtypes[i])); else - strcpy(ptr, "opaque"); - ptr += strlen(ptr); + appendStringInfo(&argbuf, "opaque"); } if (caller == NULL) { - elog(ERROR, "Function '%s(%s)' does not exist%s%s", - NameListToString(funcname), p, + elog(ERROR, "Function %s(%s) does not exist%s%s", + NameListToString(funcname), argbuf.data, ((msg != NULL) ? "\n\t" : ""), ((msg != NULL) ? msg : "")); } else { - elog(ERROR, "%s: function '%s(%s)' does not exist%s%s", - caller, NameListToString(funcname), p, + elog(ERROR, "%s: function %s(%s) does not exist%s%s", + caller, NameListToString(funcname), argbuf.data, ((msg != NULL) ? "\n\t" : ""), ((msg != NULL) ? msg : "")); } } @@ -1271,10 +1280,10 @@ find_aggregate_func(const char *caller, List *aggname, Oid basetype) if (!OidIsValid(oid)) { if (basetype == InvalidOid) - elog(ERROR, "%s: aggregate '%s' for all types does not exist", + elog(ERROR, "%s: aggregate %s(*) does not exist", caller, NameListToString(aggname)); else - elog(ERROR, "%s: aggregate '%s' for type %s does not exist", + elog(ERROR, "%s: aggregate %s(%s) does not exist", caller, NameListToString(aggname), format_type_be(basetype)); } diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index a8a466ac3b..60ccd61156 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.41 2002/05/12 20:10:04 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.42 2002/05/17 22:35:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,6 +23,7 @@ #include "parser/parser.h" #include "parser/parse_expr.h" #include "parser/parse_type.h" +#include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -93,7 +94,7 @@ LookupTypeName(const TypeName *typename) /* emit nuisance warning */ elog(NOTICE, "%s converted to %s", - TypeNameToString(typename), typeidTypeName(restype)); + TypeNameToString(typename), format_type_be(restype)); } else { @@ -187,7 +188,7 @@ TypeNameToString(const TypeName *typename) else { /* Look up internally-specified type */ - appendStringInfo(&string, "%s", typeidTypeName(typename->typeid)); + appendStringInfo(&string, "%s", format_type_be(typename->typeid)); } /* @@ -252,12 +253,7 @@ typenameType(const TypeName *typename) return (Type) tup; } -/* check to see if a type id is valid, - * returns true if it is. By using this call before calling - * typeidType or typeidTypeName, more meaningful error messages - * can be produced because the caller typically has more context of - * what's going on - jolly - */ +/* check to see if a type id is valid, returns true if it is */ bool typeidIsValid(Oid id) { @@ -418,32 +414,6 @@ typeidOutfunc(Oid type_id) } #endif -/* return a type name, given a typeid */ -/* nb: type name is NOT unique; use this only for error messages */ -char * -typeidTypeName(Oid id) -{ - HeapTuple tup; - Form_pg_type typetuple; - char *result; - - tup = SearchSysCache(TYPEOID, - ObjectIdGetDatum(id), - 0, 0, 0); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "Unable to locate type oid %u in catalog", id); - typetuple = (Form_pg_type) GETSTRUCT(tup); - - /* - * pstrdup here because result may need to outlive the syscache entry - * (eg, it might end up as part of a parse tree that will outlive the - * current transaction...) - */ - result = pstrdup(NameStr(typetuple->typname)); - ReleaseSysCache(tup); - return result; -} - /* given a typeid, return the type's typrelid (associated relation, if any) */ Oid typeidTypeRelid(Oid type_id) diff --git a/src/include/parser/parse_type.h b/src/include/parser/parse_type.h index d883a2b331..6a4eaa010a 100644 --- a/src/include/parser/parse_type.h +++ b/src/include/parser/parse_type.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parse_type.h,v 1.21 2002/03/29 19:06:25 tgl Exp $ + * $Id: parse_type.h,v 1.22 2002/05/17 22:35:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -36,7 +36,6 @@ extern char typeTypeFlag(Type t); extern Oid typeTypeRelid(Type typ); extern Datum stringTypeDatum(Type tp, char *string, int32 atttypmod); -extern char *typeidTypeName(Oid id); extern Oid typeidTypeRelid(Oid type_id); extern void parseTypeString(const char *str, Oid *type_id, int32 *typmod); diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out index 2d90066fc7..4eabfd129b 100644 --- a/src/test/regress/expected/errors.out +++ b/src/test/regress/expected/errors.out @@ -102,7 +102,7 @@ create aggregate newavg2 (sfunc = int4pl, stype = int4, finalfunc = int2um, initcond = '0'); -ERROR: AggregateCreate: function 'int2um(int4)' does not exist +ERROR: AggregateCreate: function int2um(integer) does not exist -- left out basetype create aggregate newcnt1 (sfunc = int4inc, stype = int4, @@ -137,10 +137,10 @@ drop aggregate newcnt (nonesuch); ERROR: Type "nonesuch" does not exist -- no such aggregate drop aggregate nonesuch (int4); -ERROR: RemoveAggregate: aggregate 'nonesuch' for type integer does not exist +ERROR: RemoveAggregate: aggregate nonesuch(integer) does not exist -- no such aggregate for type drop aggregate newcnt (float4); -ERROR: RemoveAggregate: aggregate 'newcnt' for type real does not exist +ERROR: RemoveAggregate: aggregate newcnt(real) does not exist -- -- REMOVE FUNCTION @@ -152,7 +152,7 @@ drop function 314159(); ERROR: parser: parse error at or near "314159" -- no such function drop function nonesuch(); -ERROR: RemoveFunction: function 'nonesuch()' does not exist +ERROR: RemoveFunction: function nonesuch() does not exist -- -- REMOVE TYPE diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index c9c013e758..1ab013469f 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -205,7 +205,7 @@ GRANT USAGE ON FUNCTION testfunc1(int) TO regressuser3; -- semantic error ERROR: invalid privilege type USAGE for function object GRANT ALL PRIVILEGES ON FUNCTION testfunc1(int) TO regressuser4; GRANT ALL PRIVILEGES ON FUNCTION testfunc_nosuch(int) TO regressuser4; -ERROR: GRANT: function 'testfunc_nosuch(int4)' does not exist +ERROR: GRANT: function testfunc_nosuch(integer) does not exist SET SESSION AUTHORIZATION regressuser2; SELECT testfunc1(5), testfunc2(5); -- ok testfunc1 | testfunc2