diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index cb4dfee77e..79a021cabc 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.38 2006/07/27 19:52:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.39 2006/09/25 15:17:34 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -219,8 +219,9 @@ RemoveAggregate(RemoveFuncStmt *stmt) { /* we only get here if stmt->missing_ok is true */ ereport(NOTICE, - (errmsg("aggregate %s does not exist ... skipping", - NameListToString(stmt->name)))); + (errmsg("aggregate %s(%s) does not exist ... skipping", + NameListToString(aggName), + TypeNameListToString(aggArgs)))); return; } diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 7dd46dcff5..fd081d5b1a 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.76 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.77 2006/09/25 15:17:34 tgl Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -686,16 +686,16 @@ RemoveFunction(RemoveFuncStmt *stmt) * Find the function, do permissions and validity checks */ funcOid = LookupFuncNameTypeNames(functionName, argTypes, stmt->missing_ok); - if (stmt->missing_ok &&!OidIsValid(funcOid)) + if (!OidIsValid(funcOid)) { + /* can only get here if stmt->missing_ok */ ereport(NOTICE, (errmsg("function %s(%s) does not exist ... skipping", NameListToString(functionName), - NameListToString(argTypes)))); + TypeNameListToString(argTypes)))); return; } - tup = SearchSysCache(PROCOID, ObjectIdGetDatum(funcOid), 0, 0, 0); @@ -1409,8 +1409,6 @@ DropCast(DropCastStmt *stmt) return; } - - /* Permission check */ if (!pg_type_ownercheck(sourcetypeid, GetUserId()) && !pg_type_ownercheck(targettypeid, GetUserId())) diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index a12aea6c38..45666d8880 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.83 2006/08/02 01:59:47 joe Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.84 2006/09/25 15:17:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -140,6 +140,46 @@ LookupTypeName(ParseState *pstate, const TypeName *typename) return restype; } +/* + * appendTypeNameToBuffer + * Append a string representing the name of a TypeName to a StringInfo. + * This is the shared guts of TypeNameToString and TypeNameListToString. + * + * NB: this must work on TypeNames that do not describe any actual type; + * it is mostly used for reporting lookup errors. + */ +static void +appendTypeNameToBuffer(const TypeName *typename, StringInfo string) +{ + if (typename->names != NIL) + { + /* Emit possibly-qualified name as-is */ + ListCell *l; + + foreach(l, typename->names) + { + if (l != list_head(typename->names)) + appendStringInfoChar(string, '.'); + appendStringInfoString(string, strVal(lfirst(l))); + } + } + else + { + /* Look up internally-specified type */ + appendStringInfoString(string, format_type_be(typename->typeid)); + } + + /* + * Add decoration as needed, but only for fields considered by + * LookupTypeName + */ + if (typename->pct_type) + appendStringInfoString(string, "%TYPE"); + + if (typename->arrayBounds != NIL) + appendStringInfoString(string, "[]"); +} + /* * TypeNameToString * Produce a string representing the name of a TypeName. @@ -153,35 +193,30 @@ TypeNameToString(const TypeName *typename) StringInfoData string; initStringInfo(&string); + appendTypeNameToBuffer(typename, &string); + return string.data; +} - if (typename->names != NIL) +/* + * TypeNameListToString + * Produce a string representing the name(s) of a List of TypeNames + */ +char * +TypeNameListToString(List *typenames) +{ + StringInfoData string; + ListCell *l; + + initStringInfo(&string); + foreach(l, typenames) { - /* Emit possibly-qualified name as-is */ - ListCell *l; + TypeName *typename = (TypeName *) lfirst(l); - foreach(l, typename->names) - { - if (l != list_head(typename->names)) - appendStringInfoChar(&string, '.'); - appendStringInfoString(&string, strVal(lfirst(l))); - } + Assert(IsA(typename, TypeName)); + if (l != list_head(typenames)) + appendStringInfoChar(&string, ','); + appendTypeNameToBuffer(typename, &string); } - else - { - /* Look up internally-specified type */ - appendStringInfoString(&string, format_type_be(typename->typeid)); - } - - /* - * Add decoration as needed, but only for fields considered by - * LookupTypeName - */ - if (typename->pct_type) - appendStringInfoString(&string, "%TYPE"); - - if (typename->arrayBounds != NIL) - appendStringInfoString(&string, "[]"); - return string.data; } diff --git a/src/include/parser/parse_type.h b/src/include/parser/parse_type.h index 62c02370de..0d2cf087d1 100644 --- a/src/include/parser/parse_type.h +++ b/src/include/parser/parse_type.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/parser/parse_type.h,v 1.32 2006/03/14 22:48:22 tgl Exp $ + * $PostgreSQL: pgsql/src/include/parser/parse_type.h,v 1.33 2006/09/25 15:17:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -22,6 +22,7 @@ typedef HeapTuple Type; extern Oid LookupTypeName(ParseState *pstate, const TypeName *typename); extern char *TypeNameToString(const TypeName *typename); +extern char *TypeNameListToString(List *typenames); extern Oid typenameTypeId(ParseState *pstate, const TypeName *typename); extern Type typenameType(ParseState *pstate, const TypeName *typename);