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);