diff --git a/doc/src/sgml/ref/drop_index.sgml b/doc/src/sgml/ref/drop_index.sgml
index 22b7ce2c96947ce30e73b97df52a5283c81e97f1..aaf5f1adfa731c2d9a84c01190ed7b1c8c422f7a 100644
--- a/doc/src/sgml/ref/drop_index.sgml
+++ b/doc/src/sgml/ref/drop_index.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.7 1999/07/22 15:09:10 thomas Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.8 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -15,7 +15,7 @@ Postgres documentation
    DROP INDEX
   </refname>
   <refpurpose>
-   Removes an index from a database
+   Removes existing indexes from a database
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
@@ -23,7 +23,7 @@ Postgres documentation
    <date>1999-07-20</date>
   </refsynopsisdivinfo>
   <synopsis>
-DROP INDEX <replaceable class="PARAMETER">index_name</replaceable>
+DROP INDEX <replaceable class="PARAMETER">index_name</replaceable> [, ...]
   </synopsis>
 
   <refsect2 id="R2-SQL-DROPINDEX-1">
@@ -39,7 +39,7 @@ DROP INDEX <replaceable class="PARAMETER">index_name</replaceable>
       <term><replaceable class="PARAMETER">index_name</replaceable></term>
       <listitem>
        <para>
-	The name of the index to remove.
+	The name of an index to remove.
        </para>
       </listitem>
      </varlistentry>
@@ -62,13 +62,13 @@ DROP
        </computeroutput></term>
       <listitem>
        <para>
-	The message returned if the index is successfully dropped.
+	The message returned if the command completes successfully.
        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-ERROR: index "<replaceable class="PARAMETER">index_name</replaceable>" nonexistent
+ERROR: index "<replaceable class="PARAMETER">index_name</replaceable>" does not exist
        </computeroutput></term>
       <listitem>
        <para>
diff --git a/doc/src/sgml/ref/drop_rule.sgml b/doc/src/sgml/ref/drop_rule.sgml
index 597f7462af3b89dcb308b4460c209c72a0891a74..9942ae6e06a766d9a790c75e727538943505f1df 100644
--- a/doc/src/sgml/ref/drop_rule.sgml
+++ b/doc/src/sgml/ref/drop_rule.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_rule.sgml,v 1.7 2000/10/05 19:48:18 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_rule.sgml,v 1.8 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -15,7 +15,7 @@ Postgres documentation
    DROP RULE
   </refname>
   <refpurpose>
-   Removes an existing rule from the database
+   Removes existing rules from the database
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
@@ -23,7 +23,7 @@ Postgres documentation
    <date>1998-09-22</date>
   </refsynopsisdivinfo>
   <synopsis>
-DROP RULE <replaceable class="PARAMETER">name</replaceable>
+DROP RULE <replaceable class="PARAMETER">name</replaceable> [, ...]
   </synopsis>
   
   <refsect2 id="R2-SQL-DROPRULE-1">
@@ -68,7 +68,7 @@ DROP
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-ERROR:  RewriteGetRuleEventRel: rule "<replaceable class="parameter">name</replaceable>" not found
+ERROR:  Rule or view "<replaceable class="parameter">name</replaceable>" not found
        </computeroutput></term>
       <listitem>
        <para>
diff --git a/doc/src/sgml/ref/drop_sequence.sgml b/doc/src/sgml/ref/drop_sequence.sgml
index 16db5a47c95fa12abc7ec1773fdcf0b87a9fda5e..e2de3fa3c774f343af9cc278cc0f2d8728bbf35d 100644
--- a/doc/src/sgml/ref/drop_sequence.sgml
+++ b/doc/src/sgml/ref/drop_sequence.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.7 2000/05/18 14:24:33 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.8 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -15,7 +15,7 @@ Postgres documentation
    DROP SEQUENCE
   </refname>
   <refpurpose>
-   Removes an existing sequence
+   Removes existing sequences from a database
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
@@ -69,7 +69,7 @@ DROP
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-NOTICE: Relation "<replaceable class="parameter">name</replaceable>" does not exist.
+ERROR: sequence "<replaceable class="parameter">name</replaceable>" does not exist
        </computeroutput></term>
       <listitem>
        <para>
diff --git a/doc/src/sgml/ref/drop_table.sgml b/doc/src/sgml/ref/drop_table.sgml
index 5f5a7aa821b87ff278fe76d17daf6212ed6fc97a..f855b57de769ca1e867c1472cb5b29b710c97648 100644
--- a/doc/src/sgml/ref/drop_table.sgml
+++ b/doc/src/sgml/ref/drop_table.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.8 2000/10/18 16:16:03 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.9 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -68,7 +68,7 @@ DROP
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-ERROR: table "<replaceable class="parameter">name</replaceable>" is nonexistent
+ERROR: table "<replaceable class="parameter">name</replaceable>" does not exist
        </computeroutput></term>
       <listitem>
        <para>
diff --git a/doc/src/sgml/ref/drop_type.sgml b/doc/src/sgml/ref/drop_type.sgml
index 789d8b37989b64b9036959016b05d6ab0343e222..abd7582a8078d14c2afc4f009d506cda096e396c 100644
--- a/doc/src/sgml/ref/drop_type.sgml
+++ b/doc/src/sgml/ref/drop_type.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.7 2000/07/22 04:30:27 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.8 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -15,7 +15,7 @@ Postgres documentation
    DROP TYPE
   </refname>
   <refpurpose>
-   Removes a user-defined type from the system catalogs
+   Removes user-defined types from the system catalogs
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
@@ -23,7 +23,7 @@ Postgres documentation
    <date>1999-07-20</date>
   </refsynopsisdivinfo>
   <synopsis>
-DROP TYPE <replaceable class="PARAMETER">typename</replaceable>
+DROP TYPE <replaceable class="PARAMETER">typename</replaceable> [, ...]
   </synopsis>
   
   <refsect2 id="R2-SQL-DROPTYPE-1">
diff --git a/doc/src/sgml/ref/drop_view.sgml b/doc/src/sgml/ref/drop_view.sgml
index 636d18151d54cf13fc3c1923eec55b9c3ba274ef..721dcddaca36d321463d42abcbb0650a0d7ab7df 100644
--- a/doc/src/sgml/ref/drop_view.sgml
+++ b/doc/src/sgml/ref/drop_view.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.7 2000/10/18 16:16:03 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.8 2000/10/22 23:32:38 tgl Exp $
 Postgres documentation
 -->
 
@@ -15,7 +15,7 @@ Postgres documentation
    DROP VIEW
   </refname>
   <refpurpose>
-   Removes an existing view from a database
+   Removes existing views from a database
   </refpurpose>
  </refnamediv>
  <refsynopsisdiv>
@@ -70,7 +70,7 @@ DROP
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-ERROR: view <replaceable class="parameter">name</replaceable> is nonexistent
+ERROR: view <replaceable class="parameter">name</replaceable> does not exist
        </computeroutput></term>
       <listitem>
        <para>
@@ -104,10 +104,6 @@ ERROR: view <replaceable class="parameter">name</replaceable> is nonexistent
    <title>
     Notes
    </title>
-   <para>
-    The <productname>Postgres</productname>
-    <command>DROP TABLE</command> statement also drops views.
-   </para>
    <para>
     Refer to <command>CREATE VIEW</command>
     for information on how to create views.
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index fbdd1ae0cf9fe663794c6b0a4b1ba079c867de86..f2df9c3c07ca39325fcdd7e810693966e2cf5381 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.149 2000/10/16 14:52:02 vadim Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.150 2000/10/22 23:32:38 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1091,7 +1091,7 @@ DeleteRelationTuple(Relation rel)
 	if (!HeapTupleIsValid(tup))
 	{
 		heap_close(pg_class_desc, RowExclusiveLock);
-		elog(ERROR, "Relation '%s' does not exist",
+		elog(ERROR, "Relation \"%s\" does not exist",
 			 RelationGetRelationName(rel));
 	}
 
@@ -1342,7 +1342,7 @@ DeleteTypeTuple(Relation rel)
 	{
 		heap_endscan(pg_type_scan);
 		heap_close(pg_type_desc, RowExclusiveLock);
-		elog(ERROR, "DeleteTypeTuple: %s type nonexistent",
+		elog(ERROR, "DeleteTypeTuple: type \"%s\" does not exist",
 			 RelationGetRelationName(rel));
 	}
 
diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c
index a0c6dd70a385d0e095c043b7c58f00fdae3c4ac0..388bad8a583977e3a1ed5b97d0a3362fa3c536eb 100644
--- a/src/backend/catalog/pg_operator.c
+++ b/src/backend/catalog/pg_operator.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.51 2000/08/21 17:22:35 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.52 2000/10/22 23:32:38 tgl Exp $
  *
  * NOTES
  *	  these routines moved here from commands/define.c and somewhat cleaned up.
@@ -181,7 +181,7 @@ OperatorGet(char *operatorName,
 		leftObjectId = TypeGet(leftTypeName, &leftDefined);
 
 		if (!OidIsValid(leftObjectId) || !leftDefined)
-			elog(ERROR, "OperatorGet: left type '%s' nonexistent",
+			elog(ERROR, "OperatorGet: left type \"%s\" does not exist",
 				 leftTypeName);
 	}
 
@@ -190,7 +190,7 @@ OperatorGet(char *operatorName,
 		rightObjectId = TypeGet(rightTypeName, &rightDefined);
 
 		if (!OidIsValid(rightObjectId) || !rightDefined)
-			elog(ERROR, "OperatorGet: right type '%s' nonexistent",
+			elog(ERROR, "OperatorGet: right type \"%s\" does not exist",
 				 rightTypeName);
 	}
 
@@ -527,7 +527,7 @@ OperatorDef(char *operatorName,
 		leftTypeId = TypeGet(leftTypeName, &leftDefined);
 
 		if (!OidIsValid(leftTypeId) || !leftDefined)
-			elog(ERROR, "OperatorDef: left type '%s' nonexistent",
+			elog(ERROR, "OperatorDef: left type \"%s\" does not exist",
 				 leftTypeName);
 	}
 
@@ -536,7 +536,7 @@ OperatorDef(char *operatorName,
 		rightTypeId = TypeGet(rightTypeName, &rightDefined);
 
 		if (!OidIsValid(rightTypeId) || !rightDefined)
-			elog(ERROR, "OperatorDef: right type '%s' nonexistent",
+			elog(ERROR, "OperatorDef: right type \"%s\" does not exist",
 				 rightTypeName);
 	}
 
@@ -739,7 +739,7 @@ OperatorDef(char *operatorName,
 											  otherRightTypeName);
 				if (!OidIsValid(other_oid))
 					elog(ERROR,
-						 "OperatorDef: can't create operator shell '%s'",
+						 "OperatorDef: can't create operator shell \"%s\"",
 						 name[j]);
 				values[i++] = ObjectIdGetDatum(other_oid);
 			}
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 64cdf840f06b699d7a53627909a66737cb70f8be..f9d1a92c75818fe6ca40f4935fd14fbaa500255a 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.38 2000/09/06 14:15:16 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.39 2000/10/22 23:32:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -610,7 +610,7 @@ RemoveIndex(char *name)
 								0, 0, 0);
 
 	if (!HeapTupleIsValid(tuple))
-		elog(ERROR, "index \"%s\" nonexistent", name);
+		elog(ERROR, "index \"%s\" does not exist", name);
 
 	if (((Form_pg_class) GETSTRUCT(tuple))->relkind != RELKIND_INDEX)
 	{
@@ -640,7 +640,7 @@ ReindexIndex(const char *name, bool force /* currently unused */ )
 								0, 0, 0);
 
 	if (!HeapTupleIsValid(tuple))
-		elog(ERROR, "index \"%s\" nonexistent", name);
+		elog(ERROR, "index \"%s\" does not exist", name);
 
 	if (((Form_pg_class) GETSTRUCT(tuple))->relkind != RELKIND_INDEX)
 	{
@@ -650,7 +650,7 @@ ReindexIndex(const char *name, bool force /* currently unused */ )
 	}
 
 	if (!reindex_index(tuple->t_data->t_oid, force))
-		elog(NOTICE, "index '%s' wasn't reindexed", name);
+		elog(NOTICE, "index \"%s\" wasn't reindexed", name);
 }
 
 /*
@@ -671,7 +671,7 @@ ReindexTable(const char *name, bool force)
 								0, 0, 0);
 
 	if (!HeapTupleIsValid(tuple))
-		elog(ERROR, "table \"%s\" nonexistent", name);
+		elog(ERROR, "table \"%s\" does not exist", name);
 
 	if (((Form_pg_class) GETSTRUCT(tuple))->relkind != RELKIND_RELATION)
 	{
@@ -681,7 +681,7 @@ ReindexTable(const char *name, bool force)
 	}
 
 	if (!reindex_relation(tuple->t_data->t_oid, force))
-		elog(NOTICE, "table '%s' wasn't reindexed", name);
+		elog(NOTICE, "table \"%s\" wasn't reindexed", name);
 }
 
 /*
@@ -719,7 +719,7 @@ ReindexDatabase(const char *dbname, bool force, bool all)
 	scan = heap_beginscan(relation, 0, SnapshotNow, 1, &scankey);
 	dbtuple = heap_getnext(scan, 0);
 	if (!HeapTupleIsValid(dbtuple))
-		elog(ERROR, "Database \"%s\" doesn't exist", dbname);
+		elog(ERROR, "Database \"%s\" does not exist", dbname);
 	db_id = dbtuple->t_data->t_oid;
 	db_owner = ((Form_pg_database) GETSTRUCT(dbtuple))->datdba;
 	heap_endscan(scan);
@@ -789,7 +789,7 @@ ReindexDatabase(const char *dbname, bool force, bool all)
 	{
 		StartTransactionCommand();
 		if (reindex_relation(relids[i], force))
-			elog(NOTICE, "relation %d was reindexed", relids[i]);
+			elog(NOTICE, "relation %u was reindexed", relids[i]);
 		CommitTransactionCommand();
 	}
 	StartTransactionCommand();
diff --git a/src/backend/commands/rename.c b/src/backend/commands/rename.c
index ad7f25bbfd8b34b8a4d61f1124b3358579e5b82e..0f41cac1dc7a20903f99dcd5c2cbdc14340cde75 100644
--- a/src/backend/commands/rename.c
+++ b/src/backend/commands/rename.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.50 2000/10/20 02:53:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.51 2000/10/22 23:32:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -137,7 +137,7 @@ renameatt(char *relname,
 										PointerGetDatum(oldattname),
 										0, 0);
 	if (!HeapTupleIsValid(oldatttup))
-		elog(ERROR, "renameatt: attribute \"%s\" nonexistent", oldattname);
+		elog(ERROR, "renameatt: attribute \"%s\" does not exist", oldattname);
 
 	if (((Form_pg_attribute) GETSTRUCT(oldatttup))->attnum < 0)
 		elog(ERROR, "renameatt: system attribute \"%s\" not renamed", oldattname);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index fbda2758035a5a6dbb757ea4bfe7cc5564a035e0..11f55a2f97e2df00b5ad1bf0549a343b1db8c72a 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.196 2000/10/18 16:16:05 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.197 2000/10/22 23:32:48 tgl Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -125,7 +125,7 @@ static void doNegateFloat(Value *v);
 		DropUserStmt, DropdbStmt, ExplainStmt, ExtendStmt, FetchStmt,
 		GrantStmt, IndexStmt, InsertStmt, ListenStmt, LoadStmt, LockStmt,
 		NotifyStmt, OptimizableStmt, ProcedureStmt, ReindexStmt,
-		RemoveAggrStmt, RemoveFuncStmt, RemoveOperStmt, RemoveStmt,
+		RemoveAggrStmt, RemoveFuncStmt, RemoveOperStmt,
 		RenameStmt, RevokeStmt, RuleActionStmt, RuleActionStmtOrEmpty,
 		RuleStmt, SelectStmt, SetSessionStmt, TransactionStmt, TruncateStmt,
 		UnlistenStmt, UpdateStmt, VacuumStmt, VariableResetStmt,
@@ -202,7 +202,7 @@ static void doNegateFloat(Value *v);
 				opt_with_copy, index_opt_unique, opt_verbose, opt_analyze
 %type <boolean> opt_cursor
 
-%type <ival>	copy_dirn, def_type, direction, reindex_type, remove_type,
+%type <ival>	copy_dirn, def_type, direction, reindex_type, drop_type,
 		opt_column, event, comment_type, comment_cl,
 		comment_ag, comment_fn, comment_op, comment_tg
 
@@ -447,7 +447,6 @@ stmt :	AlterSchemaStmt
 		| RemoveAggrStmt
 		| RemoveOperStmt
 		| RemoveFuncStmt
-		| RemoveStmt
 		| RenameStmt
 		| RevokeStmt
 		| OptimizableStmt
@@ -1935,33 +1934,28 @@ def_arg:  func_return  					{  $$ = (Node *)$1; }
 /*****************************************************************************
  *
  *		QUERY:
- *				drop <relname1> [, <relname2> .. <relnameN> ]
+ *
+ *		DROP itemtype itemname [, itemname ...]
  *
  *****************************************************************************/
 
-DropStmt:  DROP TABLE relation_name_list
-				{
-					DropStmt *n = makeNode(DropStmt);
-					n->names = $3;
-					n->removeType = DROP_TABLE;
-					$$ = (Node *)n;
-				}
-		| DROP SEQUENCE relation_name_list
-				{
-					DropStmt *n = makeNode(DropStmt);
-					n->names = $3;
-					n->removeType = DROP_SEQUENCE;
-					$$ = (Node *)n;
-				}
-		| DROP VIEW relation_name_list
+DropStmt:  DROP drop_type name_list
 				{
 					DropStmt *n = makeNode(DropStmt);
+					n->removeType = $2;
 					n->names = $3;
-					n->removeType = DROP_VIEW;
 					$$ = (Node *)n;
 				}
 		;
 
+drop_type: TABLE								{ $$ = DROP_TABLE; }
+		| SEQUENCE								{ $$ = DROP_SEQUENCE; }
+		| VIEW									{ $$ = DROP_VIEW; }
+		| INDEX									{ $$ = DROP_INDEX; }
+		| RULE									{ $$ = DROP_RULE; }
+		| TYPE_P								{ $$ = DROP_TYPE_P; }
+		;
+
 /*****************************************************************************
  *
  *		QUERY:
@@ -2550,34 +2544,21 @@ func_return:  Typename
  *
  *		QUERY:
  *
- *		remove function <funcname>
- *				(REMOVE FUNCTION "funcname" (arg1, arg2, ...))
- *		remove aggregate <aggname>
- *				(REMOVE AGGREGATE "aggname" "aggtype")
- *		remove operator <opname>
- *				(REMOVE OPERATOR "opname" (leftoperand_typ rightoperand_typ))
- *		remove type <typename>
- *				(REMOVE TYPE "typename")
- *		remove rule <rulename>
- *				(REMOVE RULE "rulename")
+ *		DROP FUNCTION funcname (arg1, arg2, ...)
+ *		DROP AGGREGATE aggname aggtype
+ *		DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
  *
  *****************************************************************************/
 
-RemoveStmt:  DROP remove_type name
+RemoveFuncStmt:  DROP FUNCTION func_name func_args
 				{
-					DropStmt *n = makeNode(DropStmt);
-					n->removeType = $2;
-					n->names =  makeList1(makeString($3));
+					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
+					n->funcname = $3;
+					n->args = $4;
 					$$ = (Node *)n;
 				}
 		;
 
-remove_type:  TYPE_P							{  $$ = DROP_TYPE_P; }
-		| INDEX									{  $$ = DROP_INDEX; }
-		| RULE									{  $$ = DROP_RULE; }
-		;
-
-
 RemoveAggrStmt:  DROP AGGREGATE name aggr_argtype
 				{
 						RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
@@ -2591,17 +2572,6 @@ aggr_argtype:  Typename							{ $$ = $1; }
 		| '*'									{ $$ = NULL; }
 		;
 
-
-RemoveFuncStmt:  DROP FUNCTION func_name func_args
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->funcname = $3;
-					n->args = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-
 RemoveOperStmt:  DROP OPERATOR all_Op '(' oper_argtypes ')'
 				{
 					RemoveOperStmt *n = makeNode(RemoveOperStmt);
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index d63a5c6b7e288b3de571fe701fa93784369ba5c1..3c4c40c84ccf96873b12f4317a476881e0dd6a68 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.97 2000/10/18 16:16:06 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.98 2000/10/22 23:32:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,21 +47,22 @@
 
 
 /*
- *
+ * Error-checking support for DROP commands
  */
 
 struct kindstrings {
 	char kind;
+	char *indef_article;
 	char *name;
 	char *command;
 };
 
 static struct kindstrings kindstringarray[] = {
-	{ RELKIND_RELATION, "table", "TABLE" },
-	{ RELKIND_SEQUENCE, "sequence", "SEQUENCE" },
-	{ RELKIND_VIEW, "view", "VIEW" },
-	{ RELKIND_INDEX, "index", "INDEX" },
-	{ '\0', "", "" }
+	{ RELKIND_RELATION, "a", "table", "TABLE" },
+	{ RELKIND_SEQUENCE, "a", "sequence", "SEQUENCE" },
+	{ RELKIND_VIEW, "a", "view", "VIEW" },
+	{ RELKIND_INDEX, "an", "index", "INDEX" },
+	{ '\0', "a", "???", "???" }
 };
 
 
@@ -81,36 +82,44 @@ DropErrorMsg(char* relname, char wrongkind, char rightkind)
 			break;
 	Assert(wentry->kind != '\0');
 	
-	elog(ERROR, "%s is not a %s. Use 'DROP %s' to remove a %s",
-			relname, rentry->name, wentry->command, wentry->name);
+	elog(ERROR, "\"%s\" is not %s %s. Use DROP %s to remove %s %s",
+		 relname, rentry->indef_article, rentry->name,
+		 wentry->command, wentry->indef_article, wentry->name);
 }
 
 static void
-CheckClassKind(char *name, char rightkind)
+CheckDropPermissions(char *name, char rightkind)
 {
-	HeapTuple	tuple;
 	struct kindstrings *rentry;
+	HeapTuple	tuple;
 	Form_pg_class classform;
 
+	for (rentry = kindstringarray; rentry->kind != '\0'; rentry++)
+		if (rentry->kind == rightkind)
+			break;
+	Assert(rentry->kind != '\0');
+
 	tuple = SearchSysCacheTuple(RELNAME,
 								PointerGetDatum(name),
 								0, 0, 0);
-
 	if (!HeapTupleIsValid(tuple))
-	{
-		for (rentry = kindstringarray; rentry->kind != '\0'; rentry++)
-			if (rentry->kind == rightkind)
-				break;
-		Assert(rentry->kind != '\0');
-		elog(ERROR, "%s \"%s\" is nonexistent", rentry->name, name);
-	}
+		elog(ERROR, "%s \"%s\" does not exist", rentry->name, name);
 
 	classform = (Form_pg_class) GETSTRUCT(tuple);
 
 	if (classform->relkind != rightkind)
 		DropErrorMsg(name, classform->relkind, rightkind);
+
+	if (!pg_ownercheck(GetUserId(), name, RELNAME))
+		elog(ERROR, "you do not own %s \"%s\"",
+			 rentry->name, name);
+
+	if (!allowSystemTableMods && IsSystemRelationName(name))
+		elog(ERROR, "%s \"%s\" is a system %s",
+			 rentry->name, name, rentry->name);
 }
 
+
 /* ----------------
  *		general utility function invoker
  * ----------------
@@ -204,7 +213,6 @@ ProcessUtility(Node *parsetree,
 			/*
 			 * Let AlterTableCreateToastTable decide if this
 			 * one needs a secondary relation too.
-			 *
 			 */
 			CommandCounterIncrement();
 			AlterTableCreateToastTable(((CreateStmt *)parsetree)->relname,
@@ -217,51 +225,32 @@ ProcessUtility(Node *parsetree,
 				List	   *args = stmt->names;
 				List	   *arg;
 
-				foreach(arg, args) {
+				set_ps_display(commandTag = "DROP");
 
+				foreach(arg, args)
+				{
 					relname = strVal(lfirst(arg));
-					if (!allowSystemTableMods && IsSystemRelationName(relname))
-						elog(ERROR, "class \"%s\" is a system catalog",
-							 relname);
-
-					set_ps_display(commandTag = "DROP");
 
 					switch(stmt->removeType)
 					{
 						case DROP_TABLE:
-							CheckClassKind(relname, RELKIND_RELATION);
-							if (!pg_ownercheck(GetUserId(), relname, RELNAME))
-								elog(ERROR, "you do not own table \"%s\"",
-									 relname);
+							CheckDropPermissions(relname, RELKIND_RELATION);
 							RemoveRelation(relname);
-
 							break;
 
 						case DROP_SEQUENCE:
-							CheckClassKind(relname, RELKIND_SEQUENCE);
-							if (!pg_ownercheck(GetUserId(), relname, RELNAME))
-								elog(ERROR, "you do not own sequence \"%s\"",
-									 relname);
+							CheckDropPermissions(relname, RELKIND_SEQUENCE);
 							RemoveRelation(relname);
-
 							break;
 
 						case DROP_VIEW:
-							CheckClassKind(relname, RELKIND_VIEW);
-							if (!pg_ownercheck(GetUserId(), relname, RELNAME))
-								elog(ERROR, "you do not own view \"%s\"",
-									 relname);
+							CheckDropPermissions(relname, RELKIND_VIEW);
 							RemoveView(relname);
-
 							break;
 
 						case DROP_INDEX:
-							CheckClassKind(relname, RELKIND_INDEX);
-							if (!pg_ownercheck(GetUserId(), relname, RELNAME))
-								elog(ERROR, "%s: %s", relname, 
-										aclcheck_error_strings[ACLCHECK_NOT_OWNER]);
+							CheckDropPermissions(relname, RELKIND_INDEX);
 							RemoveIndex(relname);
-
 							break;
 
 						case DROP_RULE:
@@ -279,11 +268,18 @@ ProcessUtility(Node *parsetree,
 							break;
 
 						case DROP_TYPE_P:
+							/* RemoveType does its own permissions checks */
 							RemoveType(relname);
 							break;
 					}
-				}
 
+					/*
+					 * Make sure subsequent loop iterations will see results
+					 * of this one; needed if removing multiple rules for
+					 * same table, for example.
+					 */
+					CommandCounterIncrement();
+				}
 			}
 			break;
 
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index fe798492c787aa627118338bb9b2e44f05cd6dbf..43bb8b733ee3800a76d425d516914adfbfa955af 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: nodes.h,v 1.78 2000/10/05 19:11:36 tgl Exp $
+ * $Id: nodes.h,v 1.79 2000/10/22 23:32:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -169,7 +169,7 @@ typedef enum NodeTag
 	T_RemoveAggrStmt,
 	T_RemoveFuncStmt,
 	T_RemoveOperStmt,
-	T_RemoveStmt,
+	T_RemoveStmt_XXX,			/* not used anymore; this tag# is available */
 	T_RenameStmt,
 	T_RuleStmt,
 	T_NotifyStmt,
diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out
index 81b905bbae53cb6c2e1f1aee245e618361533edd..c59ba0817c3da8310104101a8c2006096f69c164 100644
--- a/src/test/regress/expected/errors.out
+++ b/src/test/regress/expected/errors.out
@@ -52,7 +52,7 @@ drop table;
 ERROR:  parser: parse error at or near ";"
 -- no such relation 
 drop table nonesuch;
-ERROR:  table "nonesuch" is nonexistent
+ERROR:  table "nonesuch" does not exist
 --
 -- RENAME
  
@@ -81,7 +81,7 @@ alter table nonesuchrel rename column nonesuchatt to newnonesuchatt;
 ERROR:  Relation 'nonesuchrel' does not exist
 -- no such attribute 
 alter table emp rename column nonesuchatt to newnonesuchatt;
-ERROR:  renameatt: attribute "nonesuchatt" nonexistent
+ERROR:  renameatt: attribute "nonesuchatt" does not exist
 -- conflict 
 alter table emp rename column salary to manager;
 ERROR:  renameatt: attribute "manager" exists
@@ -122,7 +122,7 @@ drop index 314159;
 ERROR:  parser: parse error at or near "314159"
 -- no such index 
 drop index nonesuch;
-ERROR:  index "nonesuch" is nonexistent
+ERROR:  index "nonesuch" does not exist
 --
 -- REMOVE AGGREGATE
  
diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out
index 42ac65a3fe4eb1c4f85d81cab6f4dd9fed25c2e1..412632475566ed6b64084f1f80cb7d613db55b50 100644
--- a/src/test/regress/expected/foreign_key.out
+++ b/src/test/regress/expected/foreign_key.out
@@ -699,7 +699,7 @@ CREATE TABLE FKTABLE_FAIL2 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest1)
 NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)
 ERROR:  UNIQUE constraint matching given keys for referenced table "pktable" not found
 DROP TABLE FKTABLE_FAIL1;
-ERROR:  table "fktable_fail1" is nonexistent
+ERROR:  table "fktable_fail1" does not exist
 DROP TABLE FKTABLE_FAIL2;
-ERROR:  table "fktable_fail2" is nonexistent
+ERROR:  table "fktable_fail2" does not exist
 DROP TABLE PKTABLE;
diff --git a/src/test/regress/expected/inet.out b/src/test/regress/expected/inet.out
index 4a91fcc96fde341bfc311f5c8b1e87b0557d1b34..527914a67571443be3e7958fc885b404d07180a9 100644
--- a/src/test/regress/expected/inet.out
+++ b/src/test/regress/expected/inet.out
@@ -3,7 +3,7 @@
 --
 -- prepare the table...
 DROP TABLE INET_TBL;
-ERROR:  table "inet_tbl" is nonexistent
+ERROR:  table "inet_tbl" does not exist
 CREATE TABLE INET_TBL (c cidr, i inet);
 INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.226/24');
 INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.2/24', '192.168.1.226');
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out
index a735a2ef0bc15d597b054c69b0e4f0adbe587e02..ac6ba3253dafd7fdd8a642ce8d1bd89b446419cb 100644
--- a/src/test/regress/expected/plpgsql.out
+++ b/src/test/regress/expected/plpgsql.out
@@ -587,7 +587,7 @@ begin
     if mytype = ''PS'' then
         select into rec * from PSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update PSlot set backlink = blname where slotname = myname;
@@ -597,7 +597,7 @@ begin
     if mytype = ''WS'' then
         select into rec * from WSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update WSlot set backlink = blname where slotname = myname;
@@ -607,7 +607,7 @@ begin
     if mytype = ''PL'' then
         select into rec * from PLine where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update PLine set backlink = blname where slotname = myname;
@@ -743,7 +743,7 @@ begin
     if mytype = ''PS'' then
         select into rec * from PSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update PSlot set slotlink = blname where slotname = myname;
@@ -753,7 +753,7 @@ begin
     if mytype = ''WS'' then
         select into rec * from WSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update WSlot set slotlink = blname where slotname = myname;
@@ -763,7 +763,7 @@ begin
     if mytype = ''IF'' then
         select into rec * from IFace where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update IFace set slotlink = blname where slotname = myname;
@@ -773,7 +773,7 @@ begin
     if mytype = ''HS'' then
         select into rec * from HSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update HSlot set slotlink = blname where slotname = myname;
@@ -783,7 +783,7 @@ begin
     if mytype = ''PH'' then
         select into rec * from PHone where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update PHone set slotlink = blname where slotname = myname;
@@ -1498,11 +1498,11 @@ select * from PField_v1 where pfname = 'PF0_2' order by slotname;
 insert into PField values ('PF1_1', 'should fail due to unique index');
 ERROR:  Cannot insert a duplicate key into unique index pfield_name
 update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
-ERROR:  WS.not.there         does not exists
+ERROR:  WS.not.there         does not exist
 update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
 ERROR:  illegal backlink beginning with XX
 update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
-ERROR:  PS.not.there         does not exists
+ERROR:  PS.not.there         does not exist
 update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
 ERROR:  illegal slotlink beginning with XX
 insert into HSlot values ('HS', 'base.hub1', 1, '');
diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql
index aaa874c81c14d3f4efcd5394372fc0566e9ddd1a..5bfda232981ce7ccc1014926acf71d29b9296bda 100644
--- a/src/test/regress/sql/plpgsql.sql
+++ b/src/test/regress/sql/plpgsql.sql
@@ -698,7 +698,7 @@ begin
     if mytype = ''PS'' then
         select into rec * from PSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update PSlot set backlink = blname where slotname = myname;
@@ -708,7 +708,7 @@ begin
     if mytype = ''WS'' then
         select into rec * from WSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update WSlot set backlink = blname where slotname = myname;
@@ -718,7 +718,7 @@ begin
     if mytype = ''PL'' then
         select into rec * from PLine where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.backlink != blname then
 	    update PLine set backlink = blname where slotname = myname;
@@ -866,7 +866,7 @@ begin
     if mytype = ''PS'' then
         select into rec * from PSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update PSlot set slotlink = blname where slotname = myname;
@@ -876,7 +876,7 @@ begin
     if mytype = ''WS'' then
         select into rec * from WSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update WSlot set slotlink = blname where slotname = myname;
@@ -886,7 +886,7 @@ begin
     if mytype = ''IF'' then
         select into rec * from IFace where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update IFace set slotlink = blname where slotname = myname;
@@ -896,7 +896,7 @@ begin
     if mytype = ''HS'' then
         select into rec * from HSlot where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update HSlot set slotlink = blname where slotname = myname;
@@ -906,7 +906,7 @@ begin
     if mytype = ''PH'' then
         select into rec * from PHone where slotname = myname;
 	if not found then
-	    raise exception ''% does not exists'', myname;
+	    raise exception ''% does not exist'', myname;
 	end if;
 	if rec.slotlink != blname then
 	    update PHone set slotlink = blname where slotname = myname;