Some small polishing of Mark Hollomon's cleanup of DROP command: might
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 22 Oct 2000 23:32:48 +0000 (23:32 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 22 Oct 2000 23:32:48 +0000 (23:32 +0000)
as well allow DROP multiple INDEX, RULE, TYPE as well.  Add missing
CommandCounterIncrement to DROP loop, which could cause trouble otherwise
with multiple DROP of items affecting same catalog entries.  Try to
bring a little consistency to various error messages using 'does not exist',
'nonexistent', etc --- I standardized on 'does not exist' since that's
what the vast majority of the existing uses seem to be.

18 files changed:
doc/src/sgml/ref/drop_index.sgml
doc/src/sgml/ref/drop_rule.sgml
doc/src/sgml/ref/drop_sequence.sgml
doc/src/sgml/ref/drop_table.sgml
doc/src/sgml/ref/drop_type.sgml
doc/src/sgml/ref/drop_view.sgml
src/backend/catalog/heap.c
src/backend/catalog/pg_operator.c
src/backend/commands/indexcmds.c
src/backend/commands/rename.c
src/backend/parser/gram.y
src/backend/tcop/utility.c
src/include/nodes/nodes.h
src/test/regress/expected/errors.out
src/test/regress/expected/foreign_key.out
src/test/regress/expected/inet.out
src/test/regress/expected/plpgsql.out
src/test/regress/sql/plpgsql.sql

index ec5a774ef87aa6424bf9485a9d61df276654215a..8bee44bd0c59ad9d0f41779bf9e3ba5d0d3a54b3 100644 (file)
@@ -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>
index 3f33bb71f279c1ebdb678fb783029a1e6c958ede..4030f23ca7e4f984786a06cd34e954836655d656 100644 (file)
@@ -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>
index 8f375d28e3616bb73651397a2179105a743595a2..bf44453231f82167bed6ed9e8b46215fef834e32 100644 (file)
@@ -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>
index 3c905cca3536b7a6d921de505c6712180e536803..0a4494c7cee35b83ff353f33ca858b507a647487 100644 (file)
@@ -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>
index 03bad7f973fe8ff8603c1e7b6efb5f2efd64744a..070d4594e2184ecddf3ba36ec1ff78d1eb00cd46 100644 (file)
@@ -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">
index 03fd1c5d624f2890605b0dc4f068115408d51f7c..3ae904aa2b3a06f3cdd1bab82c8fb5a3f12470b9 100644 (file)
@@ -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.
index 88552000a23703acdca5521c874845216b425cd5..b1fda00bb7b67dec4068268c7bd106f7ee2166b2 100644 (file)
@@ -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));
        }
 
index 7608b9bb1053374180ab4b53c89a9deb52765ef7..4ddbf4653f8b7f122b11919843ca547650482abc 100644 (file)
@@ -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);
                        }
index ac2081077261bfc2bf2c986a6359f150a274361f..47d5142f59ccfdcb1528ddb12162d8a9ae10343f 100644 (file)
@@ -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();
index d415aed80cd27c170869f4486ef113de8661b17b..d083bbb8a8639ec32246d1148c6a418ca0f3e9fa 100644 (file)
@@ -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);
index ede95ca0b9b646b633a0dd9e71fad19e2f11b13e..ada7884cc4adee35b6fd01d15998b1a0c2dfd7b9 100644 (file)
@@ -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);
index 2e7a26fbad302ac022d6102b9907d89eedec0271..0a366645718e1349700511201ee28481bf220439 100644 (file)
 
 
 /*
- *
+ * 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;
 
index 79351f90bfe40aaaad8385103daf60f29a9f2317..ac3e2ccc1fb8e3ee9ae57339d2096bd80f28165f 100644 (file)
@@ -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,
index 81b905bbae53cb6c2e1f1aee245e618361533edd..c59ba0817c3da8310104101a8c2006096f69c164 100644 (file)
@@ -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
  
index 42ac65a3fe4eb1c4f85d81cab6f4dd9fed25c2e1..412632475566ed6b64084f1f80cb7d613db55b50 100644 (file)
@@ -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;
index 4a91fcc96fde341bfc311f5c8b1e87b0557d1b34..527914a67571443be3e7958fc885b404d07180a9 100644 (file)
@@ -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');
index a735a2ef0bc15d597b054c69b0e4f0adbe587e02..ac6ba3253dafd7fdd8a642ce8d1bd89b446419cb 100644 (file)
@@ -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, '');
index aaa874c81c14d3f4efcd5394372fc0566e9ddd1a..5bfda232981ce7ccc1014926acf71d29b9296bda 100644 (file)
@@ -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;