]> granicus.if.org Git - postgresql/commitdiff
Further consolidation of DROP statement handling.
authorRobert Haas <rhaas@postgresql.org>
Fri, 18 Nov 2011 02:31:29 +0000 (21:31 -0500)
committerRobert Haas <rhaas@postgresql.org>
Fri, 18 Nov 2011 02:32:34 +0000 (21:32 -0500)
This gets rid of an impressive amount of duplicative code, with only
minimal behavior changes.  DROP FOREIGN DATA WRAPPER now requires object
ownership rather than superuser privileges, matching the documentation
we already have.  We also eliminate the historical warning about dropping
a built-in function as unuseful.  All operations are now performed in the
same order for all object types handled by dropcmds.c.

KaiGai Kohei, with minor revisions by me

21 files changed:
src/backend/commands/aggregatecmds.c
src/backend/commands/dropcmds.c
src/backend/commands/foreigncmds.c
src/backend/commands/functioncmds.c
src/backend/commands/opclasscmds.c
src/backend/commands/operatorcmds.c
src/backend/commands/proclang.c
src/backend/commands/trigger.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/parser/gram.y
src/backend/rewrite/rewriteRemove.c
src/backend/tcop/utility.c
src/include/commands/defrem.h
src/include/commands/proclang.h
src/include/commands/trigger.h
src/include/nodes/nodes.h
src/include/nodes/parsenodes.h
src/include/rewrite/rewriteRemove.h
src/test/regress/expected/foreign_data.out
src/test/regress/sql/foreign_data.sql

index a2122c1d8b6dab36647d898667ddc4665e740947..085a205919917b7e36cd47c5f4c5b5d42afcad38 100644 (file)
@@ -208,58 +208,9 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
 
 
 /*
- * RemoveAggregate
- *             Deletes an aggregate.
+ * RenameAggregate
+ *             Rename an aggregate.
  */
-void
-RemoveAggregate(RemoveFuncStmt *stmt)
-{
-       List       *aggName = stmt->name;
-       List       *aggArgs = stmt->args;
-       Oid                     procOid;
-       HeapTuple       tup;
-       ObjectAddress object;
-
-       /* Look up function and make sure it's an aggregate */
-       procOid = LookupAggNameTypeNames(aggName, aggArgs, stmt->missing_ok);
-
-       if (!OidIsValid(procOid))
-       {
-               /* we only get here if stmt->missing_ok is true */
-               ereport(NOTICE,
-                               (errmsg("aggregate %s(%s) does not exist, skipping",
-                                               NameListToString(aggName),
-                                               TypeNameListToString(aggArgs))));
-               return;
-       }
-
-       /*
-        * Find the function tuple, do permissions and validity checks
-        */
-       tup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procOid));
-       if (!HeapTupleIsValid(tup)) /* should not happen */
-               elog(ERROR, "cache lookup failed for function %u", procOid);
-
-       /* Permission check: must own agg or its namespace */
-       if (!pg_proc_ownercheck(procOid, GetUserId()) &&
-         !pg_namespace_ownercheck(((Form_pg_proc) GETSTRUCT(tup))->pronamespace,
-                                                          GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
-                                          NameListToString(aggName));
-
-       ReleaseSysCache(tup);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = ProcedureRelationId;
-       object.objectId = procOid;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
-
 void
 RenameAggregate(List *name, List *args, const char *newname)
 {
index 8297730e3cf320b8453024cf41e158d3881144ee..c9f9ea921dc9824d0e4ccc6eebc880c1577cbb75 100644 (file)
 #include "catalog/namespace.h"
 #include "catalog/objectaddress.h"
 #include "catalog/pg_class.h"
+#include "catalog/pg_proc.h"
 #include "commands/defrem.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "parser/parse_type.h"
 #include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/syscache.h"
 
-static void does_not_exist_skipping(ObjectType objtype, List *objname);
+static void does_not_exist_skipping(ObjectType objtype,
+                                                                       List *objname, List *objargs);
 
 /*
  * Drop one or more objects.
@@ -44,6 +48,7 @@ RemoveObjects(DropStmt *stmt)
 {
        ObjectAddresses *objects;
        ListCell   *cell1;
+       ListCell   *cell2 = NULL;
 
        objects = new_object_addresses();
 
@@ -51,12 +56,19 @@ RemoveObjects(DropStmt *stmt)
        {
                ObjectAddress   address;
                List       *objname = lfirst(cell1);
+               List       *objargs = NIL;
                Relation        relation = NULL;
                Oid                     namespaceId;
 
+               if (stmt->arguments)
+               {
+                       cell2 = (!cell2 ? list_head(stmt->arguments) : lnext(cell2));
+                       objargs = lfirst(cell2);
+               }
+
                /* Get an ObjectAddress for the object. */
                address = get_object_address(stmt->removeType,
-                                                                        objname, NIL,
+                                                                        objname, objargs,
                                                                         &relation,
                                                                         AccessExclusiveLock,
                                                                         stmt->missing_ok);
@@ -64,16 +76,40 @@ RemoveObjects(DropStmt *stmt)
                /* Issue NOTICE if supplied object was not found. */
                if (!OidIsValid(address.objectId))
                {
-                       does_not_exist_skipping(stmt->removeType, objname);
+                       does_not_exist_skipping(stmt->removeType, objname, objargs);
                        continue;
                }
 
+               /*
+                * Although COMMENT ON FUNCTION, SECURITY LABEL ON FUNCTION, etc. are
+                * happy to operate on an aggregate as on any other function, we have
+                * historically not allowed this for DROP FUNCTION.
+                */
+               if (stmt->removeType == OBJECT_FUNCTION)
+               {
+                       Oid                     funcOid = address.objectId;
+                       HeapTuple       tup;
+
+                       tup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcOid));
+                       if (!HeapTupleIsValid(tup)) /* should not happen */
+                               elog(ERROR, "cache lookup failed for function %u", funcOid);
+
+                       if (((Form_pg_proc) GETSTRUCT(tup))->proisagg)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                                                errmsg("\"%s\" is an aggregate function",
+                                                                       NameListToString(objname)),
+                               errhint("Use DROP AGGREGATE to drop aggregate functions.")));
+
+                       ReleaseSysCache(tup);
+               }
+
                /* Check permissions. */
                namespaceId = get_object_namespace(&address);
                if (!OidIsValid(namespaceId) ||
                        !pg_namespace_ownercheck(namespaceId, GetUserId()))
                        check_object_ownership(GetUserId(), stmt->removeType, address,
-                                                                  objname, NIL, relation);
+                                                                  objname, objargs, relation);
 
                /* Release any relcache reference count, but keep lock until commit. */
                if (relation)
@@ -94,10 +130,11 @@ RemoveObjects(DropStmt *stmt)
  * get_object_address() will throw an ERROR.
  */
 static void
-does_not_exist_skipping(ObjectType objtype, List *objname)
+does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
 {
        const char *msg = NULL;
        char       *name = NULL;
+       char       *args = NULL;
 
        switch (objtype)
        {
@@ -138,10 +175,68 @@ does_not_exist_skipping(ObjectType objtype, List *objname)
                        msg = gettext_noop("extension \"%s\" does not exist, skipping");
                        name = NameListToString(objname);
                        break;
+               case OBJECT_FUNCTION:
+                       msg = gettext_noop("function %s(%s) does not exist, skipping");
+                       name = NameListToString(objname);
+                       args = TypeNameListToString(objargs);
+                       break;
+               case OBJECT_AGGREGATE:
+                       msg = gettext_noop("aggregate %s(%s) does not exist, skipping");
+                       name = NameListToString(objname);
+                       args = TypeNameListToString(objargs);
+                       break;
+               case OBJECT_OPERATOR:
+                       msg = gettext_noop("operator %s does not exist, skipping");
+                       name = NameListToString(objname);
+                       break;
+               case OBJECT_LANGUAGE:
+                       msg = gettext_noop("language \"%s\" does not exist, skipping");
+                       name = NameListToString(objname);
+                       break;
+               case OBJECT_CAST:
+                       msg = gettext_noop("cast from type %s to type %s does not exist, skipping");
+                       name = format_type_be(typenameTypeId(NULL,
+                                                                 (TypeName *) linitial(objname)));
+                       args = format_type_be(typenameTypeId(NULL,
+                                                                 (TypeName *) linitial(objargs)));
+                       break;
+               case OBJECT_TRIGGER:
+                       msg = gettext_noop("trigger \"%s\" for table \"%s\" does not exist, skipping");
+                       name = strVal(llast(objname));
+                       args = NameListToString(list_truncate(objname,
+                                                                                                 list_length(objname) - 1));
+                       break;
+               case OBJECT_RULE:
+                       msg = gettext_noop("rule \"%s\" for relation \"%s\" does not exist, skipping");
+                       name = strVal(llast(objname));
+                       args = NameListToString(list_truncate(objname,
+                                                                                                 list_length(objname) - 1));
+                       break;
+               case OBJECT_FDW:
+                       msg = gettext_noop("foreign-data wrapper \"%s\" does not exist, skipping");
+                       name = NameListToString(objname);
+                       break;
+               case OBJECT_FOREIGN_SERVER:
+                       msg = gettext_noop("server \"%s\" does not exist, skipping");
+                       name = NameListToString(objname);
+                       break;
+               case OBJECT_OPCLASS:
+                       msg = gettext_noop("operator class \"%s\" does not exist for access method \"%s\", skipping");
+                       name = NameListToString(objname);
+                       args = strVal(linitial(objargs));
+                       break;
+               case OBJECT_OPFAMILY:
+                       msg = gettext_noop("operator family \"%s\" does not exist for access method \"%s\", skipping");
+                       name = NameListToString(objname);
+                       args = strVal(linitial(objargs));
+                       break;
                default:
                        elog(ERROR, "unexpected object type (%d)", (int)objtype);
                        break;
        }
 
-       ereport(NOTICE, (errmsg(msg, name)));
+       if (!args)
+               ereport(NOTICE, (errmsg(msg, name)));
+       else
+               ereport(NOTICE, (errmsg(msg, name, args)));
 }
index d9c27d187a7e03463045afce9a46213b85847462..b30ff4092356317ae1bef6847414602d346f87b0 100644 (file)
@@ -685,50 +685,6 @@ AlterForeignDataWrapper(AlterFdwStmt *stmt)
 }
 
 
-/*
- * Drop foreign-data wrapper
- */
-void
-RemoveForeignDataWrapper(DropFdwStmt *stmt)
-{
-       Oid                     fdwId;
-       ObjectAddress object;
-
-       fdwId = get_foreign_data_wrapper_oid(stmt->fdwname, true);
-
-       if (!superuser())
-               ereport(ERROR,
-                               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                         errmsg("permission denied to drop foreign-data wrapper \"%s\"",
-                                        stmt->fdwname),
-                         errhint("Must be superuser to drop a foreign-data wrapper.")));
-
-       if (!OidIsValid(fdwId))
-       {
-               if (!stmt->missing_ok)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_UNDEFINED_OBJECT),
-                                        errmsg("foreign-data wrapper \"%s\" does not exist",
-                                                       stmt->fdwname)));
-
-               /* IF EXISTS specified, just note it */
-               ereport(NOTICE,
-                         (errmsg("foreign-data wrapper \"%s\" does not exist, skipping",
-                                         stmt->fdwname)));
-               return;
-       }
-
-       /*
-        * Do the deletion
-        */
-       object.classId = ForeignDataWrapperRelationId;
-       object.objectId = fdwId;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
-
 /*
  * Drop foreign-data wrapper by OID
  */
@@ -957,45 +913,6 @@ AlterForeignServer(AlterForeignServerStmt *stmt)
 }
 
 
-/*
- * Drop foreign server
- */
-void
-RemoveForeignServer(DropForeignServerStmt *stmt)
-{
-       Oid                     srvId;
-       ObjectAddress object;
-
-       srvId = get_foreign_server_oid(stmt->servername, true);
-
-       if (!OidIsValid(srvId))
-       {
-               /* Server not found, complain or notice */
-               if (!stmt->missing_ok)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_UNDEFINED_OBJECT),
-                                 errmsg("server \"%s\" does not exist", stmt->servername)));
-
-               /* IF EXISTS specified, just note it */
-               ereport(NOTICE,
-                               (errmsg("server \"%s\" does not exist, skipping",
-                                               stmt->servername)));
-               return;
-       }
-
-       /* Only allow DROP if the server is owned by the user. */
-       if (!pg_foreign_server_ownercheck(srvId, GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_FOREIGN_SERVER,
-                                          stmt->servername);
-
-       object.classId = ForeignServerRelationId;
-       object.objectId = srvId;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
-
 /*
  * Drop foreign server by OID
  */
index c4746618ae5525318717675283d0a1942fa329d9..45fdfee2175a0339c9e605715d02500379ae63e8 100644 (file)
@@ -960,72 +960,6 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
 }
 
 
-/*
- * RemoveFunction
- *             Deletes a function.
- */
-void
-RemoveFunction(RemoveFuncStmt *stmt)
-{
-       List       *functionName = stmt->name;
-       List       *argTypes = stmt->args;      /* list of TypeName nodes */
-       Oid                     funcOid;
-       HeapTuple       tup;
-       ObjectAddress object;
-
-       /*
-        * Find the function, do permissions and validity checks
-        */
-       funcOid = LookupFuncNameTypeNames(functionName, argTypes, stmt->missing_ok);
-       if (!OidIsValid(funcOid))
-       {
-               /* can only get here if stmt->missing_ok */
-               ereport(NOTICE,
-                               (errmsg("function %s(%s) does not exist, skipping",
-                                               NameListToString(functionName),
-                                               TypeNameListToString(argTypes))));
-               return;
-       }
-
-       tup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcOid));
-       if (!HeapTupleIsValid(tup)) /* should not happen */
-               elog(ERROR, "cache lookup failed for function %u", funcOid);
-
-       /* Permission check: must own func or its namespace */
-       if (!pg_proc_ownercheck(funcOid, GetUserId()) &&
-         !pg_namespace_ownercheck(((Form_pg_proc) GETSTRUCT(tup))->pronamespace,
-                                                          GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
-                                          NameListToString(functionName));
-
-       if (((Form_pg_proc) GETSTRUCT(tup))->proisagg)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is an aggregate function",
-                                               NameListToString(functionName)),
-                                errhint("Use DROP AGGREGATE to drop aggregate functions.")));
-
-       if (((Form_pg_proc) GETSTRUCT(tup))->prolang == INTERNALlanguageId)
-       {
-               /* "Helpful" NOTICE when removing a builtin function ... */
-               ereport(NOTICE,
-                               (errcode(ERRCODE_WARNING),
-                                errmsg("removing built-in function \"%s\"",
-                                               NameListToString(functionName))));
-       }
-
-       ReleaseSysCache(tup);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = ProcedureRelationId;
-       object.objectId = funcOid;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
 /*
  * Guts of function deletion.
  *
@@ -1772,51 +1706,6 @@ CreateCast(CreateCastStmt *stmt)
        heap_close(relation, RowExclusiveLock);
 }
 
-
-
-/*
- * DROP CAST
- */
-void
-DropCast(DropCastStmt *stmt)
-{
-       Oid                     sourcetypeid;
-       Oid                     targettypeid;
-       ObjectAddress object;
-
-       /* when dropping a cast, the types must exist even if you use IF EXISTS */
-       sourcetypeid = typenameTypeId(NULL, stmt->sourcetype);
-       targettypeid = typenameTypeId(NULL, stmt->targettype);
-
-       object.classId = CastRelationId;
-       object.objectId = get_cast_oid(sourcetypeid, targettypeid,
-                                                                  stmt->missing_ok);
-       object.objectSubId = 0;
-
-       if (!OidIsValid(object.objectId))
-       {
-               ereport(NOTICE,
-                        (errmsg("cast from type %s to type %s does not exist, skipping",
-                                        format_type_be(sourcetypeid),
-                                        format_type_be(targettypeid))));
-               return;
-       }
-
-       /* Permission check */
-       if (!pg_type_ownercheck(sourcetypeid, GetUserId())
-               && !pg_type_ownercheck(targettypeid, GetUserId()))
-               ereport(ERROR,
-                               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                                errmsg("must be owner of type %s or type %s",
-                                               format_type_be(sourcetypeid),
-                                               format_type_be(targettypeid))));
-
-       /*
-        * Do the deletion
-        */
-       performDeletion(&object, stmt->behavior);
-}
-
 /*
  * get_cast_oid - given two type OIDs, look up a cast OID
  *
index af0de05a0320645610886cde5ac4fdcd4af058ea..0ef3584bb2fd1d59c05a524fd0be3d58caef961c 100644 (file)
@@ -1543,104 +1543,6 @@ dropProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid,
        }
 }
 
-
-/*
- * RemoveOpClass
- *             Deletes an opclass.
- */
-void
-RemoveOpClass(RemoveOpClassStmt *stmt)
-{
-       Oid                     amID,
-                               opcID;
-       HeapTuple       tuple;
-       ObjectAddress object;
-
-       /* Get the access method's OID. */
-       amID = get_am_oid(stmt->amname, false);
-
-       /* Look up the opclass. */
-       tuple = OpClassCacheLookup(amID, stmt->opclassname, stmt->missing_ok);
-       if (!HeapTupleIsValid(tuple))
-       {
-               ereport(NOTICE,
-                               (errmsg("operator class \"%s\" does not exist for access method \"%s\", skipping",
-                                               NameListToString(stmt->opclassname), stmt->amname)));
-               return;
-       }
-
-       opcID = HeapTupleGetOid(tuple);
-
-       /* Permission check: must own opclass or its namespace */
-       if (!pg_opclass_ownercheck(opcID, GetUserId()) &&
-               !pg_namespace_ownercheck(((Form_pg_opclass) GETSTRUCT(tuple))->opcnamespace,
-                                                                GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPCLASS,
-                                          NameListToString(stmt->opclassname));
-
-       ReleaseSysCache(tuple);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = OperatorClassRelationId;
-       object.objectId = opcID;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
-/*
- * RemoveOpFamily
- *             Deletes an opfamily.
- */
-void
-RemoveOpFamily(RemoveOpFamilyStmt *stmt)
-{
-       Oid                     amID,
-                               opfID;
-       HeapTuple       tuple;
-       ObjectAddress object;
-
-       /*
-        * Get the access method's OID.
-        */
-       amID = get_am_oid(stmt->amname, false);
-
-       /*
-        * Look up the opfamily.
-        */
-       tuple = OpFamilyCacheLookup(amID, stmt->opfamilyname, stmt->missing_ok);
-       if (!HeapTupleIsValid(tuple))
-       {
-               ereport(NOTICE,
-                               (errmsg("operator family \"%s\" does not exist for access method \"%s\", skipping",
-                                  NameListToString(stmt->opfamilyname), stmt->amname)));
-               return;
-       }
-
-       opfID = HeapTupleGetOid(tuple);
-
-       /* Permission check: must own opfamily or its namespace */
-       if (!pg_opfamily_ownercheck(opfID, GetUserId()) &&
-               !pg_namespace_ownercheck(((Form_pg_opfamily) GETSTRUCT(tuple))->opfnamespace,
-                                                                GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPFAMILY,
-                                          NameListToString(stmt->opfamilyname));
-
-       ReleaseSysCache(tuple);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = OperatorFamilyRelationId;
-       object.objectId = opfID;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
-
 /*
  * Deletion subroutines for use by dependency.c.
  */
index c5c18ee4fcc6a66b7ae1f18c0572843f84a9b5e5..1e6c5ce2ad7c0ce6464a3917df02d587d8138862 100644 (file)
@@ -290,56 +290,6 @@ DefineOperator(List *names, List *parameters)
 }
 
 
-/*
- * RemoveOperator
- *             Deletes an operator.
- */
-void
-RemoveOperator(RemoveFuncStmt *stmt)
-{
-       List       *operatorName = stmt->name;
-       TypeName   *typeName1 = (TypeName *) linitial(stmt->args);
-       TypeName   *typeName2 = (TypeName *) lsecond(stmt->args);
-       Oid                     operOid;
-       HeapTuple       tup;
-       ObjectAddress object;
-
-       Assert(list_length(stmt->args) == 2);
-       operOid = LookupOperNameTypeNames(NULL, operatorName,
-                                                                         typeName1, typeName2,
-                                                                         stmt->missing_ok, -1);
-
-       if (stmt->missing_ok && !OidIsValid(operOid))
-       {
-               ereport(NOTICE,
-                               (errmsg("operator %s does not exist, skipping",
-                                               NameListToString(operatorName))));
-               return;
-       }
-
-       tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
-       if (!HeapTupleIsValid(tup)) /* should not happen */
-               elog(ERROR, "cache lookup failed for operator %u", operOid);
-
-       /* Permission check: must own operator or its namespace */
-       if (!pg_oper_ownercheck(operOid, GetUserId()) &&
-               !pg_namespace_ownercheck(((Form_pg_operator) GETSTRUCT(tup))->oprnamespace,
-                                                                GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPER,
-                                          NameListToString(operatorName));
-
-       ReleaseSysCache(tup);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = OperatorRelationId;
-       object.objectId = operOid;
-       object.objectSubId = 0;
-
-       performDeletion(&object, stmt->behavior);
-}
-
 /*
  * Guts of operator deletion.
  */
index 7a37e96c402cce64091e00e241a14840027a00b4..e4cd2ab33d127a645bf1f571e0473ca322440cc4 100644 (file)
@@ -507,43 +507,6 @@ PLTemplateExists(const char *languageName)
        return (find_language_template(languageName) != NULL);
 }
 
-
-/* ---------------------------------------------------------------------
- * DROP PROCEDURAL LANGUAGE
- * ---------------------------------------------------------------------
- */
-void
-DropProceduralLanguage(DropPLangStmt *stmt)
-{
-       Oid                     oid;
-       ObjectAddress object;
-
-       oid = get_language_oid(stmt->plname, stmt->missing_ok);
-       if (!OidIsValid(oid))
-       {
-               ereport(NOTICE,
-                               (errmsg("language \"%s\" does not exist, skipping",
-                                               stmt->plname)));
-               return;
-       }
-
-       /*
-        * Check permission
-        */
-       if (!pg_language_ownercheck(oid, GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_LANGUAGE,
-                                          stmt->plname);
-
-       object.classId = LanguageRelationId;
-       object.objectId = oid;
-       object.objectSubId = 0;
-
-       /*
-        * Do the deletion
-        */
-       performDeletion(&object, stmt->behavior);
-}
-
 /*
  * Guts of language dropping.
  */
index a6e7268aa78e8204acbe69b5642fc09fca8b4367..5589528e5ca3d63083c3f21fe157b5ddda75cd40 100644 (file)
@@ -1026,42 +1026,6 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
        }
 }
 
-
-/*
- * DropTrigger - drop an individual trigger by name
- */
-void
-DropTrigger(RangeVar *relation, const char *trigname, DropBehavior behavior,
-                       bool missing_ok)
-{
-       Oid                     relid;
-       ObjectAddress object;
-
-       /* lock level should match RemoveTriggerById */
-       relid = RangeVarGetRelid(relation, AccessExclusiveLock, false, false);
-
-       object.classId = TriggerRelationId;
-       object.objectId = get_trigger_oid(relid, trigname, missing_ok);
-       object.objectSubId = 0;
-
-       if (!OidIsValid(object.objectId))
-       {
-               ereport(NOTICE,
-                 (errmsg("trigger \"%s\" for table \"%s\" does not exist, skipping",
-                                 trigname, get_rel_name(relid))));
-               return;
-       }
-
-       if (!pg_class_ownercheck(relid, GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
-                                          get_rel_name(relid));
-
-       /*
-        * Do the deletion
-        */
-       performDeletion(&object, behavior);
-}
-
 /*
  * Guts of trigger deletion.
  */
index 63958c3afc6a6a0638ce62aa076254d0816fe8a7..b8f047a9a58bc7db0ffb38b5fa4c9f3a5183071a 100644 (file)
@@ -2755,6 +2755,7 @@ _copyDropStmt(DropStmt *from)
        DropStmt   *newnode = makeNode(DropStmt);
 
        COPY_NODE_FIELD(objects);
+       COPY_NODE_FIELD(arguments);
        COPY_SCALAR_FIELD(removeType);
        COPY_SCALAR_FIELD(behavior);
        COPY_SCALAR_FIELD(missing_ok);
@@ -2878,20 +2879,6 @@ _copyAlterFunctionStmt(AlterFunctionStmt *from)
        return newnode;
 }
 
-static RemoveFuncStmt *
-_copyRemoveFuncStmt(RemoveFuncStmt *from)
-{
-       RemoveFuncStmt *newnode = makeNode(RemoveFuncStmt);
-
-       COPY_SCALAR_FIELD(kind);
-       COPY_NODE_FIELD(name);
-       COPY_NODE_FIELD(args);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
 static DoStmt *
 _copyDoStmt(DoStmt *from)
 {
@@ -2902,32 +2889,6 @@ _copyDoStmt(DoStmt *from)
        return newnode;
 }
 
-static RemoveOpClassStmt *
-_copyRemoveOpClassStmt(RemoveOpClassStmt *from)
-{
-       RemoveOpClassStmt *newnode = makeNode(RemoveOpClassStmt);
-
-       COPY_NODE_FIELD(opclassname);
-       COPY_STRING_FIELD(amname);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
-static RemoveOpFamilyStmt *
-_copyRemoveOpFamilyStmt(RemoveOpFamilyStmt *from)
-{
-       RemoveOpFamilyStmt *newnode = makeNode(RemoveOpFamilyStmt);
-
-       COPY_NODE_FIELD(opfamilyname);
-       COPY_STRING_FIELD(amname);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
 static RenameStmt *
 _copyRenameStmt(RenameStmt *from)
 {
@@ -3391,18 +3352,6 @@ _copyAlterFdwStmt(AlterFdwStmt *from)
        return newnode;
 }
 
-static DropFdwStmt *
-_copyDropFdwStmt(DropFdwStmt *from)
-{
-       DropFdwStmt *newnode = makeNode(DropFdwStmt);
-
-       COPY_STRING_FIELD(fdwname);
-       COPY_SCALAR_FIELD(missing_ok);
-       COPY_SCALAR_FIELD(behavior);
-
-       return newnode;
-}
-
 static CreateForeignServerStmt *
 _copyCreateForeignServerStmt(CreateForeignServerStmt *from)
 {
@@ -3430,18 +3379,6 @@ _copyAlterForeignServerStmt(AlterForeignServerStmt *from)
        return newnode;
 }
 
-static DropForeignServerStmt *
-_copyDropForeignServerStmt(DropForeignServerStmt *from)
-{
-       DropForeignServerStmt *newnode = makeNode(DropForeignServerStmt);
-
-       COPY_STRING_FIELD(servername);
-       COPY_SCALAR_FIELD(missing_ok);
-       COPY_SCALAR_FIELD(behavior);
-
-       return newnode;
-}
-
 static CreateUserMappingStmt *
 _copyCreateUserMappingStmt(CreateUserMappingStmt *from)
 {
@@ -3513,20 +3450,6 @@ _copyCreateTrigStmt(CreateTrigStmt *from)
        return newnode;
 }
 
-static DropPropertyStmt *
-_copyDropPropertyStmt(DropPropertyStmt *from)
-{
-       DropPropertyStmt *newnode = makeNode(DropPropertyStmt);
-
-       COPY_NODE_FIELD(relation);
-       COPY_STRING_FIELD(property);
-       COPY_SCALAR_FIELD(removeType);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
 static CreatePLangStmt *
 _copyCreatePLangStmt(CreatePLangStmt *from)
 {
@@ -3542,18 +3465,6 @@ _copyCreatePLangStmt(CreatePLangStmt *from)
        return newnode;
 }
 
-static DropPLangStmt *
-_copyDropPLangStmt(DropPLangStmt *from)
-{
-       DropPLangStmt *newnode = makeNode(DropPLangStmt);
-
-       COPY_STRING_FIELD(plname);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
 static CreateRoleStmt *
 _copyCreateRoleStmt(CreateRoleStmt *from)
 {
@@ -3678,19 +3589,6 @@ _copyCreateCastStmt(CreateCastStmt *from)
        return newnode;
 }
 
-static DropCastStmt *
-_copyDropCastStmt(DropCastStmt *from)
-{
-       DropCastStmt *newnode = makeNode(DropCastStmt);
-
-       COPY_NODE_FIELD(sourcetype);
-       COPY_NODE_FIELD(targettype);
-       COPY_SCALAR_FIELD(behavior);
-       COPY_SCALAR_FIELD(missing_ok);
-
-       return newnode;
-}
-
 static PrepareStmt *
 _copyPrepareStmt(PrepareStmt *from)
 {
@@ -4266,18 +4164,9 @@ copyObject(void *from)
                case T_AlterFunctionStmt:
                        retval = _copyAlterFunctionStmt(from);
                        break;
-               case T_RemoveFuncStmt:
-                       retval = _copyRemoveFuncStmt(from);
-                       break;
                case T_DoStmt:
                        retval = _copyDoStmt(from);
                        break;
-               case T_RemoveOpClassStmt:
-                       retval = _copyRemoveOpClassStmt(from);
-                       break;
-               case T_RemoveOpFamilyStmt:
-                       retval = _copyRemoveOpFamilyStmt(from);
-                       break;
                case T_RenameStmt:
                        retval = _copyRenameStmt(from);
                        break;
@@ -4392,18 +4281,12 @@ copyObject(void *from)
                case T_AlterFdwStmt:
                        retval = _copyAlterFdwStmt(from);
                        break;
-               case T_DropFdwStmt:
-                       retval = _copyDropFdwStmt(from);
-                       break;
                case T_CreateForeignServerStmt:
                        retval = _copyCreateForeignServerStmt(from);
                        break;
                case T_AlterForeignServerStmt:
                        retval = _copyAlterForeignServerStmt(from);
                        break;
-               case T_DropForeignServerStmt:
-                       retval = _copyDropForeignServerStmt(from);
-                       break;
                case T_CreateUserMappingStmt:
                        retval = _copyCreateUserMappingStmt(from);
                        break;
@@ -4419,15 +4302,9 @@ copyObject(void *from)
                case T_CreateTrigStmt:
                        retval = _copyCreateTrigStmt(from);
                        break;
-               case T_DropPropertyStmt:
-                       retval = _copyDropPropertyStmt(from);
-                       break;
                case T_CreatePLangStmt:
                        retval = _copyCreatePLangStmt(from);
                        break;
-               case T_DropPLangStmt:
-                       retval = _copyDropPLangStmt(from);
-                       break;
                case T_CreateRoleStmt:
                        retval = _copyCreateRoleStmt(from);
                        break;
@@ -4461,9 +4338,6 @@ copyObject(void *from)
                case T_CreateCastStmt:
                        retval = _copyCreateCastStmt(from);
                        break;
-               case T_DropCastStmt:
-                       retval = _copyDropCastStmt(from);
-                       break;
                case T_PrepareStmt:
                        retval = _copyPrepareStmt(from);
                        break;
index f3a34a12e20e88d906568d6eb36683a1c0adc713..d1af48a30da7e892fc994f8a785728ad774e89ee 100644 (file)
@@ -1182,6 +1182,7 @@ static bool
 _equalDropStmt(DropStmt *a, DropStmt *b)
 {
        COMPARE_NODE_FIELD(objects);
+       COMPARE_NODE_FIELD(arguments);
        COMPARE_SCALAR_FIELD(removeType);
        COMPARE_SCALAR_FIELD(behavior);
        COMPARE_SCALAR_FIELD(missing_ok);
@@ -1289,18 +1290,6 @@ _equalAlterFunctionStmt(AlterFunctionStmt *a, AlterFunctionStmt *b)
        return true;
 }
 
-static bool
-_equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
-{
-       COMPARE_SCALAR_FIELD(kind);
-       COMPARE_NODE_FIELD(name);
-       COMPARE_NODE_FIELD(args);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
 static bool
 _equalDoStmt(DoStmt *a, DoStmt *b)
 {
@@ -1309,28 +1298,6 @@ _equalDoStmt(DoStmt *a, DoStmt *b)
        return true;
 }
 
-static bool
-_equalRemoveOpClassStmt(RemoveOpClassStmt *a, RemoveOpClassStmt *b)
-{
-       COMPARE_NODE_FIELD(opclassname);
-       COMPARE_STRING_FIELD(amname);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
-static bool
-_equalRemoveOpFamilyStmt(RemoveOpFamilyStmt *a, RemoveOpFamilyStmt *b)
-{
-       COMPARE_NODE_FIELD(opfamilyname);
-       COMPARE_STRING_FIELD(amname);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
 static bool
 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
 {
@@ -1719,16 +1686,6 @@ _equalAlterFdwStmt(AlterFdwStmt *a, AlterFdwStmt *b)
        return true;
 }
 
-static bool
-_equalDropFdwStmt(DropFdwStmt *a, DropFdwStmt *b)
-{
-       COMPARE_STRING_FIELD(fdwname);
-       COMPARE_SCALAR_FIELD(missing_ok);
-       COMPARE_SCALAR_FIELD(behavior);
-
-       return true;
-}
-
 static bool
 _equalCreateForeignServerStmt(CreateForeignServerStmt *a, CreateForeignServerStmt *b)
 {
@@ -1752,16 +1709,6 @@ _equalAlterForeignServerStmt(AlterForeignServerStmt *a, AlterForeignServerStmt *
        return true;
 }
 
-static bool
-_equalDropForeignServerStmt(DropForeignServerStmt *a, DropForeignServerStmt *b)
-{
-       COMPARE_STRING_FIELD(servername);
-       COMPARE_SCALAR_FIELD(missing_ok);
-       COMPARE_SCALAR_FIELD(behavior);
-
-       return true;
-}
-
 static bool
 _equalCreateUserMappingStmt(CreateUserMappingStmt *a, CreateUserMappingStmt *b)
 {
@@ -1824,18 +1771,6 @@ _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
        return true;
 }
 
-static bool
-_equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
-{
-       COMPARE_NODE_FIELD(relation);
-       COMPARE_STRING_FIELD(property);
-       COMPARE_SCALAR_FIELD(removeType);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
 static bool
 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
 {
@@ -1849,16 +1784,6 @@ _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
        return true;
 }
 
-static bool
-_equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
-{
-       COMPARE_STRING_FIELD(plname);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
 static bool
 _equalCreateRoleStmt(CreateRoleStmt *a, CreateRoleStmt *b)
 {
@@ -1963,17 +1888,6 @@ _equalCreateCastStmt(CreateCastStmt *a, CreateCastStmt *b)
        return true;
 }
 
-static bool
-_equalDropCastStmt(DropCastStmt *a, DropCastStmt *b)
-{
-       COMPARE_NODE_FIELD(sourcetype);
-       COMPARE_NODE_FIELD(targettype);
-       COMPARE_SCALAR_FIELD(behavior);
-       COMPARE_SCALAR_FIELD(missing_ok);
-
-       return true;
-}
-
 static bool
 _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
 {
@@ -2793,18 +2707,9 @@ equal(void *a, void *b)
                case T_AlterFunctionStmt:
                        retval = _equalAlterFunctionStmt(a, b);
                        break;
-               case T_RemoveFuncStmt:
-                       retval = _equalRemoveFuncStmt(a, b);
-                       break;
                case T_DoStmt:
                        retval = _equalDoStmt(a, b);
                        break;
-               case T_RemoveOpClassStmt:
-                       retval = _equalRemoveOpClassStmt(a, b);
-                       break;
-               case T_RemoveOpFamilyStmt:
-                       retval = _equalRemoveOpFamilyStmt(a, b);
-                       break;
                case T_RenameStmt:
                        retval = _equalRenameStmt(a, b);
                        break;
@@ -2919,18 +2824,12 @@ equal(void *a, void *b)
                case T_AlterFdwStmt:
                        retval = _equalAlterFdwStmt(a, b);
                        break;
-               case T_DropFdwStmt:
-                       retval = _equalDropFdwStmt(a, b);
-                       break;
                case T_CreateForeignServerStmt:
                        retval = _equalCreateForeignServerStmt(a, b);
                        break;
                case T_AlterForeignServerStmt:
                        retval = _equalAlterForeignServerStmt(a, b);
                        break;
-               case T_DropForeignServerStmt:
-                       retval = _equalDropForeignServerStmt(a, b);
-                       break;
                case T_CreateUserMappingStmt:
                        retval = _equalCreateUserMappingStmt(a, b);
                        break;
@@ -2946,15 +2845,9 @@ equal(void *a, void *b)
                case T_CreateTrigStmt:
                        retval = _equalCreateTrigStmt(a, b);
                        break;
-               case T_DropPropertyStmt:
-                       retval = _equalDropPropertyStmt(a, b);
-                       break;
                case T_CreatePLangStmt:
                        retval = _equalCreatePLangStmt(a, b);
                        break;
-               case T_DropPLangStmt:
-                       retval = _equalDropPLangStmt(a, b);
-                       break;
                case T_CreateRoleStmt:
                        retval = _equalCreateRoleStmt(a, b);
                        break;
@@ -2988,9 +2881,6 @@ equal(void *a, void *b)
                case T_CreateCastStmt:
                        retval = _equalCreateCastStmt(a, b);
                        break;
-               case T_DropCastStmt:
-                       retval = _equalDropCastStmt(a, b);
-                       break;
                case T_PrepareStmt:
                        retval = _equalPrepareStmt(a, b);
                        break;
index c135465fbd38cc67301ee137b083f8c5ea8baf14..7ea38e4663e850e9831a4d08df644c29848ae6d6 100644 (file)
@@ -3255,16 +3255,19 @@ opt_validator:
 DropPLangStmt:
                        DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
                                {
-                                       DropPLangStmt *n = makeNode(DropPLangStmt);
-                                       n->plname = $4;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_LANGUAGE;
+                                       n->objects = list_make1(list_make1(makeString($4)));
+                                       n->arguments = NIL;
                                        n->behavior = $5;
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
                        | DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
                                {
-                                       DropPLangStmt *n = makeNode(DropPLangStmt);
-                                       n->plname = $6;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_LANGUAGE;
+                                       n->objects = list_make1(list_make1(makeString($6)));
                                        n->behavior = $7;
                                        n->missing_ok = true;
                                        $$ = (Node *)n;
@@ -3656,16 +3659,20 @@ opt_fdw_options:
 
 DropFdwStmt: DROP FOREIGN DATA_P WRAPPER name opt_drop_behavior
                                {
-                                       DropFdwStmt *n = makeNode(DropFdwStmt);
-                                       n->fdwname = $5;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FDW;
+                                       n->objects = list_make1(list_make1(makeString($5)));
+                                       n->arguments = NIL;
                                        n->missing_ok = false;
                                        n->behavior = $6;
                                        $$ = (Node *) n;
                                }
                                |  DROP FOREIGN DATA_P WRAPPER IF_P EXISTS name opt_drop_behavior
-                               {
-                                       DropFdwStmt *n = makeNode(DropFdwStmt);
-                                       n->fdwname = $7;
+                {
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FDW;
+                                       n->objects = list_make1(list_make1(makeString($7)));
+                                       n->arguments = NIL;
                                        n->missing_ok = true;
                                        n->behavior = $8;
                                        $$ = (Node *) n;
@@ -3812,16 +3819,20 @@ opt_foreign_server_version:
 
 DropForeignServerStmt: DROP SERVER name opt_drop_behavior
                                {
-                                       DropForeignServerStmt *n = makeNode(DropForeignServerStmt);
-                                       n->servername = $3;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FOREIGN_SERVER;
+                                       n->objects = list_make1(list_make1(makeString($3)));
+                                       n->arguments = NIL;
                                        n->missing_ok = false;
                                        n->behavior = $4;
                                        $$ = (Node *) n;
                                }
                                |  DROP SERVER IF_P EXISTS name opt_drop_behavior
-                               {
-                                       DropForeignServerStmt *n = makeNode(DropForeignServerStmt);
-                                       n->servername = $5;
+                {
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FOREIGN_SERVER;
+                                       n->objects = list_make1(list_make1(makeString($5)));
+                                       n->arguments = NIL;
                                        n->missing_ok = true;
                                        n->behavior = $6;
                                        $$ = (Node *) n;
@@ -4193,23 +4204,23 @@ ConstraintAttributeElem:
 
 
 DropTrigStmt:
-                       DROP TRIGGER name ON qualified_name opt_drop_behavior
+                       DROP TRIGGER name ON any_name opt_drop_behavior
                                {
-                                       DropPropertyStmt *n = makeNode(DropPropertyStmt);
-                                       n->relation = $5;
-                                       n->property = $3;
-                                       n->behavior = $6;
+                                       DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_TRIGGER;
+                                       n->objects = list_make1(lappend($5, makeString($3)));
+                                       n->arguments = NIL;
+                                       n->behavior = $6;
                                        n->missing_ok = false;
                                        $$ = (Node *) n;
                                }
-                       | DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
+                       | DROP TRIGGER IF_P EXISTS name ON any_name opt_drop_behavior
                                {
-                                       DropPropertyStmt *n = makeNode(DropPropertyStmt);
-                                       n->relation = $7;
-                                       n->property = $5;
-                                       n->behavior = $8;
+                                       DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_TRIGGER;
+                                       n->objects = list_make1(lappend($7, makeString($5)));
+                                       n->arguments = NIL;
+                                       n->behavior = $8;
                                        n->missing_ok = true;
                                        $$ = (Node *) n;
                                }
@@ -4247,9 +4258,9 @@ CreateAssertStmt:
 DropAssertStmt:
                        DROP ASSERTION name opt_drop_behavior
                                {
-                                       DropPropertyStmt *n = makeNode(DropPropertyStmt);
-                                       n->relation = NULL;
-                                       n->property = $3;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->objects = NIL;
+                                       n->arguments = NIL;
                                        n->behavior = $4;
                                        n->removeType = OBJECT_TRIGGER; /* XXX */
                                        ereport(ERROR,
@@ -4665,18 +4676,20 @@ opclass_drop:
 DropOpClassStmt:
                        DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
                                {
-                                       RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
-                                       n->opclassname = $4;
-                                       n->amname = $6;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->objects = list_make1($4);
+                                       n->arguments = list_make1(list_make1(makeString($6)));
+                                       n->removeType = OBJECT_OPCLASS;
                                        n->behavior = $7;
                                        n->missing_ok = false;
                                        $$ = (Node *) n;
                                }
                        | DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
                                {
-                                       RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
-                                       n->opclassname = $6;
-                                       n->amname = $8;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->objects = list_make1($6);
+                                       n->arguments = list_make1(list_make1(makeString($8)));
+                                       n->removeType = OBJECT_OPCLASS;
                                        n->behavior = $9;
                                        n->missing_ok = true;
                                        $$ = (Node *) n;
@@ -4686,18 +4699,20 @@ DropOpClassStmt:
 DropOpFamilyStmt:
                        DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
                                {
-                                       RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
-                                       n->opfamilyname = $4;
-                                       n->amname = $6;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->objects = list_make1($4);
+                                       n->arguments = list_make1(list_make1(makeString($6)));
+                                       n->removeType = OBJECT_OPFAMILY;
                                        n->behavior = $7;
                                        n->missing_ok = false;
                                        $$ = (Node *) n;
                                }
                        | DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
                                {
-                                       RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
-                                       n->opfamilyname = $6;
-                                       n->amname = $8;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->objects = list_make1($6);
+                                       n->arguments = list_make1(list_make1(makeString($8)));
+                                       n->removeType = OBJECT_OPFAMILY;
                                        n->behavior = $9;
                                        n->missing_ok = true;
                                        $$ = (Node *) n;
@@ -4748,6 +4763,7 @@ DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
                                        n->removeType = $2;
                                        n->missing_ok = TRUE;
                                        n->objects = $5;
+                                       n->arguments = NIL;
                                        n->behavior = $6;
                                        $$ = (Node *)n;
                                }
@@ -4757,6 +4773,7 @@ DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
                                        n->removeType = $2;
                                        n->missing_ok = FALSE;
                                        n->objects = $3;
+                                       n->arguments = NIL;
                                        n->behavior = $4;
                                        $$ = (Node *)n;
                                }
@@ -6173,20 +6190,20 @@ opt_restrict:
 RemoveFuncStmt:
                        DROP FUNCTION func_name func_args opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_FUNCTION;
-                                       n->name = $3;
-                                       n->args = extractArgTypes($4);
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FUNCTION;
+                                       n->objects = list_make1($3);
+                                       n->arguments = list_make1(extractArgTypes($4));
                                        n->behavior = $5;
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
                        | DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_FUNCTION;
-                                       n->name = $5;
-                                       n->args = extractArgTypes($6);
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_FUNCTION;
+                                       n->objects = list_make1($5);
+                                       n->arguments = list_make1(extractArgTypes($6));
                                        n->behavior = $7;
                                        n->missing_ok = true;
                                        $$ = (Node *)n;
@@ -6196,20 +6213,20 @@ RemoveFuncStmt:
 RemoveAggrStmt:
                        DROP AGGREGATE func_name aggr_args opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_AGGREGATE;
-                                       n->name = $3;
-                                       n->args = $4;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_AGGREGATE;
+                                       n->objects = list_make1($3);
+                                       n->arguments = list_make1($4);
                                        n->behavior = $5;
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
                        | DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_AGGREGATE;
-                                       n->name = $5;
-                                       n->args = $6;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_AGGREGATE;
+                                       n->objects = list_make1($5);
+                                       n->arguments = list_make1($6);
                                        n->behavior = $7;
                                        n->missing_ok = true;
                                        $$ = (Node *)n;
@@ -6219,20 +6236,20 @@ RemoveAggrStmt:
 RemoveOperStmt:
                        DROP OPERATOR any_operator oper_argtypes opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_OPERATOR;
-                                       n->name = $3;
-                                       n->args = $4;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_OPERATOR;
+                                       n->objects = list_make1($3);
+                                       n->arguments = list_make1($4);
                                        n->behavior = $5;
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
                        | DROP OPERATOR IF_P EXISTS any_operator oper_argtypes opt_drop_behavior
                                {
-                                       RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-                                       n->kind = OBJECT_OPERATOR;
-                                       n->name = $5;
-                                       n->args = $6;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_OPERATOR;
+                                       n->objects = list_make1($5);
+                                       n->arguments = list_make1($6);
                                        n->behavior = $7;
                                        n->missing_ok = true;
                                        $$ = (Node *)n;
@@ -6345,9 +6362,10 @@ cast_context:  AS IMPLICIT_P                                     { $$ = COERCION_IMPLICIT; }
 
 DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
                                {
-                                       DropCastStmt *n = makeNode(DropCastStmt);
-                                       n->sourcetype = $5;
-                                       n->targettype = $7;
+                                       DropStmt *n = makeNode(DropStmt);
+                                       n->removeType = OBJECT_CAST;
+                                       n->objects = list_make1(list_make1($5));
+                                       n->arguments = list_make1(list_make1($7));
                                        n->behavior = $9;
                                        n->missing_ok = $3;
                                        $$ = (Node *)n;
@@ -7063,23 +7081,23 @@ opt_instead:
 
 
 DropRuleStmt:
-                       DROP RULE name ON qualified_name opt_drop_behavior
+                       DROP RULE name ON any_name opt_drop_behavior
                                {
-                                       DropPropertyStmt *n = makeNode(DropPropertyStmt);
-                                       n->relation = $5;
-                                       n->property = $3;
-                                       n->behavior = $6;
+                                       DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_RULE;
+                                       n->objects = list_make1(lappend($5, makeString($3)));
+                                       n->arguments = NIL;
+                                       n->behavior = $6;
                                        n->missing_ok = false;
                                        $$ = (Node *) n;
                                }
-                       | DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
+                       | DROP RULE IF_P EXISTS name ON any_name opt_drop_behavior
                                {
-                                       DropPropertyStmt *n = makeNode(DropPropertyStmt);
-                                       n->relation = $7;
-                                       n->property = $5;
-                                       n->behavior = $8;
+                                       DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_RULE;
+                                       n->objects = list_make1(lappend($7, makeString($5)));
+                                       n->arguments = NIL;
+                                       n->behavior = $8;
                                        n->missing_ok = true;
                                        $$ = (Node *) n;
                                }
index b9b693cee1d6773991bf01325c5e556f44f602b7..3cc159ae5f16097b0f510cf3f28dffc8f18e83f0 100644 (file)
 #include "utils/syscache.h"
 #include "utils/tqual.h"
 
-
-/*
- * RemoveRewriteRule
- *
- * Delete a rule given its name.
- */
-void
-RemoveRewriteRule(RangeVar *relation, const char *ruleName,
-                                 DropBehavior behavior, bool missing_ok)
-{
-       HeapTuple       tuple;
-       Oid                     eventRelationOid;
-       Oid                     owningRel;
-       ObjectAddress object;
-
-       /* lock level should match RemoveRewriteRuleById */
-       owningRel = RangeVarGetRelid(relation, AccessExclusiveLock,
-                                                                false, false);
-
-       /*
-        * Find the tuple for the target rule.
-        */
-       tuple = SearchSysCache2(RULERELNAME,
-                                                       ObjectIdGetDatum(owningRel),
-                                                       PointerGetDatum(ruleName));
-
-       /*
-        * complain if no rule with such name exists
-        */
-       if (!HeapTupleIsValid(tuple))
-       {
-               if (!missing_ok)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_UNDEFINED_OBJECT),
-                                        errmsg("rule \"%s\" for relation \"%s\" does not exist",
-                                                       ruleName, get_rel_name(owningRel))));
-               else
-                       ereport(NOTICE,
-                                       (errmsg("rule \"%s\" for relation \"%s\" does not exist, skipping",
-                                                       ruleName, get_rel_name(owningRel))));
-               return;
-       }
-
-       /*
-        * Verify user has appropriate permissions.
-        */
-       eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
-       Assert(eventRelationOid == owningRel);
-       if (!pg_class_ownercheck(eventRelationOid, GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
-                                          get_rel_name(eventRelationOid));
-
-       /*
-        * Do the deletion
-        */
-       object.classId = RewriteRelationId;
-       object.objectId = HeapTupleGetOid(tuple);
-       object.objectSubId = 0;
-
-       ReleaseSysCache(tuple);
-
-       performDeletion(&object, behavior);
-}
-
-
 /*
  * Guts of rule deletion.
  */
index 5b0633398cf631e3cd33bce1ae5432d76d04e8ee..cc8f32d4cea132745f8faf340da9b79a2c6048b6 100644 (file)
@@ -205,16 +205,10 @@ check_xact_readonly(Node *parsetree)
                case T_CreateRangeStmt:
                case T_AlterEnumStmt:
                case T_ViewStmt:
-               case T_DropCastStmt:
                case T_DropStmt:
                case T_DropdbStmt:
                case T_DropTableSpaceStmt:
-               case T_RemoveFuncStmt:
                case T_DropRoleStmt:
-               case T_DropPLangStmt:
-               case T_RemoveOpClassStmt:
-               case T_RemoveOpFamilyStmt:
-               case T_DropPropertyStmt:
                case T_GrantStmt:
                case T_GrantRoleStmt:
                case T_AlterDefaultPrivilegesStmt:
@@ -228,10 +222,8 @@ check_xact_readonly(Node *parsetree)
                case T_AlterExtensionContentsStmt:
                case T_CreateFdwStmt:
                case T_AlterFdwStmt:
-               case T_DropFdwStmt:
                case T_CreateForeignServerStmt:
                case T_AlterForeignServerStmt:
-               case T_DropForeignServerStmt:
                case T_CreateUserMappingStmt:
                case T_AlterUserMappingStmt:
                case T_DropUserMappingStmt:
@@ -616,10 +608,6 @@ standard_ProcessUtility(Node *parsetree,
                        AlterForeignDataWrapper((AlterFdwStmt *) parsetree);
                        break;
 
-               case T_DropFdwStmt:
-                       RemoveForeignDataWrapper((DropFdwStmt *) parsetree);
-                       break;
-
                case T_CreateForeignServerStmt:
                        CreateForeignServer((CreateForeignServerStmt *) parsetree);
                        break;
@@ -628,10 +616,6 @@ standard_ProcessUtility(Node *parsetree,
                        AlterForeignServer((AlterForeignServerStmt *) parsetree);
                        break;
 
-               case T_DropForeignServerStmt:
-                       RemoveForeignServer((DropForeignServerStmt *) parsetree);
-                       break;
-
                case T_CreateUserMappingStmt:
                        CreateUserMapping((CreateUserMappingStmt *) parsetree);
                        break;
@@ -947,29 +931,6 @@ standard_ProcessUtility(Node *parsetree,
                        AlterSequence((AlterSeqStmt *) parsetree);
                        break;
 
-               case T_RemoveFuncStmt:
-                       {
-                               RemoveFuncStmt *stmt = (RemoveFuncStmt *) parsetree;
-
-                               switch (stmt->kind)
-                               {
-                                       case OBJECT_FUNCTION:
-                                               RemoveFunction(stmt);
-                                               break;
-                                       case OBJECT_AGGREGATE:
-                                               RemoveAggregate(stmt);
-                                               break;
-                                       case OBJECT_OPERATOR:
-                                               RemoveOperator(stmt);
-                                               break;
-                                       default:
-                                               elog(ERROR, "unrecognized object type: %d",
-                                                        (int) stmt->kind);
-                                               break;
-                               }
-                       }
-                       break;
-
                case T_DoStmt:
                        ExecuteDoStmt((DoStmt *) parsetree);
                        break;
@@ -1079,38 +1040,10 @@ standard_ProcessUtility(Node *parsetree,
                                                                 InvalidOid, InvalidOid, false);
                        break;
 
-               case T_DropPropertyStmt:
-                       {
-                               DropPropertyStmt *stmt = (DropPropertyStmt *) parsetree;
-
-                               switch (stmt->removeType)
-                               {
-                                       case OBJECT_RULE:
-                                               /* RemoveRewriteRule checks permissions */
-                                               RemoveRewriteRule(stmt->relation, stmt->property,
-                                                                                 stmt->behavior, stmt->missing_ok);
-                                               break;
-                                       case OBJECT_TRIGGER:
-                                               /* DropTrigger checks permissions */
-                                               DropTrigger(stmt->relation, stmt->property,
-                                                                       stmt->behavior, stmt->missing_ok);
-                                               break;
-                                       default:
-                                               elog(ERROR, "unrecognized object type: %d",
-                                                        (int) stmt->removeType);
-                                               break;
-                               }
-                       }
-                       break;
-
                case T_CreatePLangStmt:
                        CreateProceduralLanguage((CreatePLangStmt *) parsetree);
                        break;
 
-               case T_DropPLangStmt:
-                       DropProceduralLanguage((DropPLangStmt *) parsetree);
-                       break;
-
                        /*
                         * ******************************** DOMAIN statements ****
                         */
@@ -1220,10 +1153,6 @@ standard_ProcessUtility(Node *parsetree,
                        CreateCast((CreateCastStmt *) parsetree);
                        break;
 
-               case T_DropCastStmt:
-                       DropCast((DropCastStmt *) parsetree);
-                       break;
-
                case T_CreateOpClassStmt:
                        DefineOpClass((CreateOpClassStmt *) parsetree);
                        break;
@@ -1236,14 +1165,6 @@ standard_ProcessUtility(Node *parsetree,
                        AlterOpFamily((AlterOpFamilyStmt *) parsetree);
                        break;
 
-               case T_RemoveOpClassStmt:
-                       RemoveOpClass((RemoveOpClassStmt *) parsetree);
-                       break;
-
-               case T_RemoveOpFamilyStmt:
-                       RemoveOpFamily((RemoveOpFamilyStmt *) parsetree);
-                       break;
-
                case T_AlterTSDictionaryStmt:
                        AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
                        break;
@@ -1674,10 +1595,6 @@ CreateCommandTag(Node *parsetree)
                        tag = "ALTER FOREIGN DATA WRAPPER";
                        break;
 
-               case T_DropFdwStmt:
-                       tag = "DROP FOREIGN DATA WRAPPER";
-                       break;
-
                case T_CreateForeignServerStmt:
                        tag = "CREATE SERVER";
                        break;
@@ -1686,10 +1603,6 @@ CreateCommandTag(Node *parsetree)
                        tag = "ALTER SERVER";
                        break;
 
-               case T_DropForeignServerStmt:
-                       tag = "DROP SERVER";
-                       break;
-
                case T_CreateUserMappingStmt:
                        tag = "CREATE USER MAPPING";
                        break;
@@ -1754,6 +1667,39 @@ CreateCommandTag(Node *parsetree)
                                case OBJECT_EXTENSION:
                                        tag = "DROP EXTENSION";
                                        break;
+                               case OBJECT_FUNCTION:
+                                       tag = "DROP FUNCTION";
+                                       break;
+                               case OBJECT_AGGREGATE:
+                                       tag = "DROP AGGREGATE";
+                                       break;
+                               case OBJECT_OPERATOR:
+                                       tag = "DROP OPERATOR";
+                                       break;
+                               case OBJECT_LANGUAGE:
+                                       tag = "DROP LANGUAGE";
+                                       break;
+                               case OBJECT_CAST:
+                                       tag = "DROP CAST";
+                                       break;
+                               case OBJECT_TRIGGER:
+                                       tag = "DROP TRIGGER";
+                                       break;
+                               case OBJECT_RULE:
+                                       tag = "DROP RULE";
+                                       break;
+                               case OBJECT_FDW:
+                                       tag = "DROP FOREIGN DATA WRAPPER";
+                                       break;
+                               case OBJECT_FOREIGN_SERVER:
+                                       tag = "DROP SERVER";
+                                       break;
+                               case OBJECT_OPCLASS:
+                                       tag = "DROP OPERATOR CLASS";
+                                       break;
+                               case OBJECT_OPFAMILY:
+                                       tag = "DROP OPERATOR FAMILY";
+                                       break;
                                default:
                                        tag = "???";
                        }
@@ -1891,23 +1837,6 @@ CreateCommandTag(Node *parsetree)
                        tag = "ALTER SEQUENCE";
                        break;
 
-               case T_RemoveFuncStmt:
-                       switch (((RemoveFuncStmt *) parsetree)->kind)
-                       {
-                               case OBJECT_FUNCTION:
-                                       tag = "DROP FUNCTION";
-                                       break;
-                               case OBJECT_AGGREGATE:
-                                       tag = "DROP AGGREGATE";
-                                       break;
-                               case OBJECT_OPERATOR:
-                                       tag = "DROP OPERATOR";
-                                       break;
-                               default:
-                                       tag = "???";
-                       }
-                       break;
-
                case T_DoStmt:
                        tag = "DO";
                        break;
@@ -2002,28 +1931,10 @@ CreateCommandTag(Node *parsetree)
                        tag = "CREATE TRIGGER";
                        break;
 
-               case T_DropPropertyStmt:
-                       switch (((DropPropertyStmt *) parsetree)->removeType)
-                       {
-                               case OBJECT_TRIGGER:
-                                       tag = "DROP TRIGGER";
-                                       break;
-                               case OBJECT_RULE:
-                                       tag = "DROP RULE";
-                                       break;
-                               default:
-                                       tag = "???";
-                       }
-                       break;
-
                case T_CreatePLangStmt:
                        tag = "CREATE LANGUAGE";
                        break;
 
-               case T_DropPLangStmt:
-                       tag = "DROP LANGUAGE";
-                       break;
-
                case T_CreateRoleStmt:
                        tag = "CREATE ROLE";
                        break;
@@ -2072,10 +1983,6 @@ CreateCommandTag(Node *parsetree)
                        tag = "CREATE CAST";
                        break;
 
-               case T_DropCastStmt:
-                       tag = "DROP CAST";
-                       break;
-
                case T_CreateOpClassStmt:
                        tag = "CREATE OPERATOR CLASS";
                        break;
@@ -2088,14 +1995,6 @@ CreateCommandTag(Node *parsetree)
                        tag = "ALTER OPERATOR FAMILY";
                        break;
 
-               case T_RemoveOpClassStmt:
-                       tag = "DROP OPERATOR CLASS";
-                       break;
-
-               case T_RemoveOpFamilyStmt:
-                       tag = "DROP OPERATOR FAMILY";
-                       break;
-
                case T_AlterTSDictionaryStmt:
                        tag = "ALTER TEXT SEARCH DICTIONARY";
                        break;
@@ -2306,10 +2205,8 @@ GetCommandLogLevel(Node *parsetree)
 
                case T_CreateFdwStmt:
                case T_AlterFdwStmt:
-               case T_DropFdwStmt:
                case T_CreateForeignServerStmt:
                case T_AlterForeignServerStmt:
-               case T_DropForeignServerStmt:
                case T_CreateUserMappingStmt:
                case T_AlterUserMappingStmt:
                case T_DropUserMappingStmt:
@@ -2446,10 +2343,6 @@ GetCommandLogLevel(Node *parsetree)
                        lev = LOGSTMT_DDL;
                        break;
 
-               case T_RemoveFuncStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
                case T_DoStmt:
                        lev = LOGSTMT_ALL;
                        break;
@@ -2533,18 +2426,10 @@ GetCommandLogLevel(Node *parsetree)
                        lev = LOGSTMT_DDL;
                        break;
 
-               case T_DropPropertyStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
                case T_CreatePLangStmt:
                        lev = LOGSTMT_DDL;
                        break;
 
-               case T_DropPLangStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
                case T_CreateDomainStmt:
                        lev = LOGSTMT_DDL;
                        break;
@@ -2597,10 +2482,6 @@ GetCommandLogLevel(Node *parsetree)
                        lev = LOGSTMT_DDL;
                        break;
 
-               case T_DropCastStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
                case T_CreateOpClassStmt:
                        lev = LOGSTMT_DDL;
                        break;
@@ -2613,14 +2494,6 @@ GetCommandLogLevel(Node *parsetree)
                        lev = LOGSTMT_DDL;
                        break;
 
-               case T_RemoveOpClassStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
-               case T_RemoveOpFamilyStmt:
-                       lev = LOGSTMT_DDL;
-                       break;
-
                case T_AlterTSDictionaryStmt:
                        lev = LOGSTMT_DDL;
                        break;
index a466e2edb05493f7b175490a2a0a48229644ac6b..70d3a8fe021cef6e84627ef24c0466617e537231 100644 (file)
@@ -61,7 +61,6 @@ extern Oid    GetDefaultOpClass(Oid type_id, Oid am_id);
 
 /* commands/functioncmds.c */
 extern void CreateFunction(CreateFunctionStmt *stmt, const char *queryString);
-extern void RemoveFunction(RemoveFuncStmt *stmt);
 extern void RemoveFunctionById(Oid funcOid);
 extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);
 extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);
@@ -70,7 +69,6 @@ extern void AlterFunctionOwner(List *name, List *argtypes, Oid newOwnerId);
 extern void AlterFunctionOwner_oid(Oid procOid, Oid newOwnerId);
 extern void AlterFunction(AlterFunctionStmt *stmt);
 extern void CreateCast(CreateCastStmt *stmt);
-extern void DropCast(DropCastStmt *stmt);
 extern void DropCastById(Oid castOid);
 extern void AlterFunctionNamespace(List *name, List *argtypes, bool isagg,
                                           const char *newschema);
@@ -80,7 +78,6 @@ extern Oid    get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);
 
 /* commands/operatorcmds.c */
 extern void DefineOperator(List *names, List *parameters);
-extern void RemoveOperator(RemoveFuncStmt *stmt);
 extern void RemoveOperatorById(Oid operOid);
 extern void AlterOperatorOwner(List *name, TypeName *typeName1,
                                   TypeName *typename2, Oid newOwnerId);
@@ -91,7 +88,6 @@ extern Oid    AlterOperatorNamespace_oid(Oid operOid, Oid newNspOid);
 /* commands/aggregatecmds.c */
 extern void DefineAggregate(List *name, List *args, bool oldstyle,
                                List *parameters);
-extern void RemoveAggregate(RemoveFuncStmt *stmt);
 extern void RenameAggregate(List *name, List *args, const char *newname);
 extern void AlterAggregateOwner(List *name, List *args, Oid newOwnerId);
 
@@ -99,8 +95,6 @@ extern void AlterAggregateOwner(List *name, List *args, Oid newOwnerId);
 extern void DefineOpClass(CreateOpClassStmt *stmt);
 extern void DefineOpFamily(CreateOpFamilyStmt *stmt);
 extern void AlterOpFamily(AlterOpFamilyStmt *stmt);
-extern void RemoveOpClass(RemoveOpClassStmt *stmt);
-extern void RemoveOpFamily(RemoveOpFamilyStmt *stmt);
 extern void RemoveOpClassById(Oid opclassOid);
 extern void RemoveOpFamilyById(Oid opfamilyOid);
 extern void RemoveAmOpEntryById(Oid entryOid);
@@ -156,11 +150,9 @@ extern void AlterForeignServerOwner(const char *name, Oid newOwnerId);
 extern void AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId);
 extern void CreateForeignDataWrapper(CreateFdwStmt *stmt);
 extern void AlterForeignDataWrapper(AlterFdwStmt *stmt);
-extern void RemoveForeignDataWrapper(DropFdwStmt *stmt);
 extern void RemoveForeignDataWrapperById(Oid fdwId);
 extern void CreateForeignServer(CreateForeignServerStmt *stmt);
 extern void AlterForeignServer(AlterForeignServerStmt *stmt);
-extern void RemoveForeignServer(DropForeignServerStmt *stmt);
 extern void RemoveForeignServerById(Oid srvId);
 extern void CreateUserMapping(CreateUserMappingStmt *stmt);
 extern void AlterUserMapping(AlterUserMappingStmt *stmt);
index 644c371dcc0d428e5a9a70b8909627e82fded1de..17d0972419974d4c0b15d00ec0569dab009a71a4 100644 (file)
@@ -15,7 +15,6 @@
 #include "nodes/parsenodes.h"
 
 extern void CreateProceduralLanguage(CreatePLangStmt *stmt);
-extern void DropProceduralLanguage(DropPLangStmt *stmt);
 extern void DropProceduralLanguageById(Oid langOid);
 extern void RenameLanguage(const char *oldname, const char *newname);
 extern void AlterLanguageOwner(const char *name, Oid newOwnerId);
index fe21298b6488d6460a5776108089101489060d52..e7d28f7cdd2f5b2c35f46f044cc21d47f6c06dff 100644 (file)
@@ -112,8 +112,6 @@ extern Oid CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
                          Oid constraintOid, Oid indexOid,
                          bool isInternal);
 
-extern void DropTrigger(RangeVar *relation, const char *trigname,
-                       DropBehavior behavior, bool missing_ok);
 extern void RemoveTriggerById(Oid trigOid);
 extern Oid     get_trigger_oid(Oid relid, const char *name, bool missing_ok);
 
index 824d8b5dc9a24146fe520806a37b20edff02d262..3a240897985a31f96bd0a8bd091225981ea76481 100644 (file)
@@ -291,7 +291,6 @@ typedef enum NodeTag
        T_IndexStmt,
        T_CreateFunctionStmt,
        T_AlterFunctionStmt,
-       T_RemoveFuncStmt,
        T_DoStmt,
        T_RenameStmt,
        T_RuleStmt,
@@ -312,9 +311,7 @@ typedef enum NodeTag
        T_VariableShowStmt,
        T_DiscardStmt,
        T_CreateTrigStmt,
-       T_DropPropertyStmt,
        T_CreatePLangStmt,
-       T_DropPLangStmt,
        T_CreateRoleStmt,
        T_AlterRoleStmt,
        T_DropRoleStmt,
@@ -328,12 +325,9 @@ typedef enum NodeTag
        T_AlterRoleSetStmt,
        T_CreateConversionStmt,
        T_CreateCastStmt,
-       T_DropCastStmt,
        T_CreateOpClassStmt,
        T_CreateOpFamilyStmt,
        T_AlterOpFamilyStmt,
-       T_RemoveOpClassStmt,
-       T_RemoveOpFamilyStmt,
        T_PrepareStmt,
        T_ExecuteStmt,
        T_DeallocateStmt,
@@ -352,10 +346,8 @@ typedef enum NodeTag
        T_AlterTSConfigurationStmt,
        T_CreateFdwStmt,
        T_AlterFdwStmt,
-       T_DropFdwStmt,
        T_CreateForeignServerStmt,
        T_AlterForeignServerStmt,
-       T_DropForeignServerStmt,
        T_CreateUserMappingStmt,
        T_AlterUserMappingStmt,
        T_DropUserMappingStmt,
index af6565e7e4a805857ff18d6da2e46e210aad4c09..6449eca52d9ebb305c2a399f26c85908d1e415c0 100644 (file)
@@ -1612,7 +1612,7 @@ typedef struct AlterExtensionContentsStmt
 } AlterExtensionContentsStmt;
 
 /* ----------------------
- *             Create/Drop FOREIGN DATA WRAPPER Statements
+ *             Create/Alter FOREIGN DATA WRAPPER Statements
  * ----------------------
  */
 
@@ -1632,16 +1632,8 @@ typedef struct AlterFdwStmt
        List       *options;            /* generic options to FDW */
 } AlterFdwStmt;
 
-typedef struct DropFdwStmt
-{
-       NodeTag         type;
-       char       *fdwname;            /* foreign-data wrapper name */
-       bool            missing_ok;             /* don't complain if missing */
-       DropBehavior behavior;          /* drop behavior - cascade/restrict */
-} DropFdwStmt;
-
 /* ----------------------
- *             Create/Drop FOREIGN SERVER Statements
+ *             Create/Alter FOREIGN SERVER Statements
  * ----------------------
  */
 
@@ -1664,14 +1656,6 @@ typedef struct AlterForeignServerStmt
        bool            has_version;    /* version specified */
 } AlterForeignServerStmt;
 
-typedef struct DropForeignServerStmt
-{
-       NodeTag         type;
-       char       *servername;         /* server name */
-       bool            missing_ok;             /* ignore missing servers */
-       DropBehavior behavior;          /* drop behavior - cascade/restrict */
-} DropForeignServerStmt;
-
 /* ----------------------
  *             Create FOREIGN TABLE Statements
  * ----------------------
@@ -1739,7 +1723,7 @@ typedef struct CreateTrigStmt
 } CreateTrigStmt;
 
 /* ----------------------
- *             Create/Drop PROCEDURAL LANGUAGE Statements
+ *             Create PROCEDURAL LANGUAGE Statements
  * ----------------------
  */
 typedef struct CreatePLangStmt
@@ -1753,14 +1737,6 @@ typedef struct CreatePLangStmt
        bool            pltrusted;              /* PL is trusted */
 } CreatePLangStmt;
 
-typedef struct DropPLangStmt
-{
-       NodeTag         type;
-       char       *plname;                     /* PL name */
-       DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
-       bool            missing_ok;             /* skip error if missing? */
-} DropPLangStmt;
-
 /* ----------------------
  *     Create/Alter/Drop Role Statements
  *
@@ -1921,29 +1897,12 @@ typedef struct DropStmt
 {
        NodeTag         type;
        List       *objects;            /* list of sublists of names (as Values) */
+       List       *arguments;          /* list of sublists of arguments (as Values) */
        ObjectType      removeType;             /* object type */
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
        bool            missing_ok;             /* skip error if object is missing? */
 } DropStmt;
 
-/* ----------------------
- *             Drop Rule|Trigger Statement
- *
- * In general this may be used for dropping any property of a relation;
- * for example, someday soon we may have DROP ATTRIBUTE.
- * ----------------------
- */
-
-typedef struct DropPropertyStmt
-{
-       NodeTag         type;
-       RangeVar   *relation;           /* owning relation */
-       char       *property;           /* name of rule, trigger, etc */
-       ObjectType      removeType;             /* OBJECT_RULE or OBJECT_TRIGGER */
-       DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
-       bool            missing_ok;             /* skip error if missing? */
-} DropPropertyStmt;
-
 /* ----------------------
  *                             Truncate Table Statement
  * ----------------------
@@ -2117,20 +2076,6 @@ typedef struct AlterFunctionStmt
        List       *actions;            /* list of DefElem */
 } AlterFunctionStmt;
 
-/* ----------------------
- *             Drop {Function|Aggregate|Operator} Statement
- * ----------------------
- */
-typedef struct RemoveFuncStmt
-{
-       NodeTag         type;
-       ObjectType      kind;                   /* function, aggregate, operator */
-       List       *name;                       /* qualified name of object to drop */
-       List       *args;                       /* types of the arguments */
-       DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
-       bool            missing_ok;             /* skip error if missing? */
-} RemoveFuncStmt;
-
 /* ----------------------
  *             DO Statement
  *
@@ -2151,32 +2096,6 @@ typedef struct InlineCodeBlock
        bool            langIsTrusted;  /* trusted property of the language */
 } InlineCodeBlock;
 
-/* ----------------------
- *             Drop Operator Class Statement
- * ----------------------
- */
-typedef struct RemoveOpClassStmt
-{
-       NodeTag         type;
-       List       *opclassname;        /* qualified name (list of Value strings) */
-       char       *amname;                     /* name of index AM opclass is for */
-       DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
-       bool            missing_ok;             /* skip error if missing? */
-} RemoveOpClassStmt;
-
-/* ----------------------
- *             Drop Operator Family Statement
- * ----------------------
- */
-typedef struct RemoveOpFamilyStmt
-{
-       NodeTag         type;
-       List       *opfamilyname;       /* qualified name (list of Value strings) */
-       char       *amname;                     /* name of index AM opfamily is for */
-       DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
-       bool            missing_ok;             /* skip error if missing? */
-} RemoveOpFamilyStmt;
-
 /* ----------------------
  *             Alter Object Rename Statement
  * ----------------------
@@ -2557,20 +2476,6 @@ typedef struct CreateCastStmt
        bool            inout;
 } CreateCastStmt;
 
-/* ----------------------
- *     DROP CAST Statement
- * ----------------------
- */
-typedef struct DropCastStmt
-{
-       NodeTag         type;
-       TypeName   *sourcetype;
-       TypeName   *targettype;
-       DropBehavior behavior;
-       bool            missing_ok;             /* skip error if missing? */
-} DropCastStmt;
-
-
 /* ----------------------
  *             PREPARE Statement
  * ----------------------
index b9a63bad7b4871997e15f603f930604180b0447f..14f3c1dfddb820584de1e0032ad1abfa24a511e3 100644 (file)
@@ -16,9 +16,6 @@
 
 #include "nodes/parsenodes.h"
 
-
-extern void RemoveRewriteRule(RangeVar *relation, const char *ruleName,
-                                 DropBehavior behavior, bool missing_ok);
 extern void RemoveRewriteRuleById(Oid ruleOid);
 
 #endif   /* REWRITEREMOVE_H */
index 2687d51f77bdce79d14c2465f03202ec29a4701a..314748c6d4478d9ceb76775841edbe3237f34232 100644 (file)
@@ -195,13 +195,8 @@ DROP ROLE regress_test_role_super;                          -- ERROR
 ERROR:  role "regress_test_role_super" cannot be dropped because some objects depend on it
 DETAIL:  owner of foreign-data wrapper foo
 SET ROLE regress_test_role_super;
-DROP FOREIGN DATA WRAPPER foo;                              -- ERROR
-ERROR:  permission denied to drop foreign-data wrapper "foo"
-HINT:  Must be superuser to drop a foreign-data wrapper.
-RESET ROLE;
-ALTER ROLE regress_test_role_super SUPERUSER;
 DROP FOREIGN DATA WRAPPER foo;
-DROP ROLE regress_test_role_super;
+RESET ROLE;
 \dew+
                                             List of foreign-data wrappers
     Name    |       Owner       | Handler |        Validator         | Access privileges | FDW Options | Description 
@@ -244,8 +239,7 @@ user mapping for foreign_data_user depends on server s1
 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
 SET ROLE regress_test_role;
 DROP FOREIGN DATA WRAPPER foo CASCADE;                      -- ERROR
-ERROR:  permission denied to drop foreign-data wrapper "foo"
-HINT:  Must be superuser to drop a foreign-data wrapper.
+ERROR:  must be owner of foreign-data wrapper foo
 RESET ROLE;
 DROP FOREIGN DATA WRAPPER foo CASCADE;
 NOTICE:  drop cascades to 2 other objects
@@ -1009,8 +1003,7 @@ ALTER FOREIGN DATA WRAPPER foo OWNER TO unprivileged_role;      -- ERROR
 ERROR:  permission denied to change owner of foreign-data wrapper "foo"
 HINT:  Must be superuser to change owner of a foreign-data wrapper.
 DROP FOREIGN DATA WRAPPER foo;                                  -- ERROR
-ERROR:  permission denied to drop foreign-data wrapper "foo"
-HINT:  Must be superuser to drop a foreign-data wrapper.
+ERROR:  must be owner of foreign-data wrapper foo
 GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role;   -- ERROR
 ERROR:  permission denied for foreign-data wrapper foo
 CREATE SERVER s9 FOREIGN DATA WRAPPER foo;                      -- ERROR
@@ -1040,8 +1033,7 @@ ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true');         -- ERROR
 ERROR:  permission denied to alter foreign-data wrapper "foo"
 HINT:  Must be superuser to alter a foreign-data wrapper.
 DROP FOREIGN DATA WRAPPER foo;                                  -- ERROR
-ERROR:  permission denied to drop foreign-data wrapper "foo"
-HINT:  Must be superuser to drop a foreign-data wrapper.
+ERROR:  must be owner of foreign-data wrapper foo
 GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_test_role; -- WARNING
 WARNING:  no privileges were granted for "postgresql"
 GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role;
index 051dfa3a96cee405011f217dc0ff00db4aec35b7..bfdb32afdc0942b88bc9259a67bc70ac62f18f22 100644 (file)
@@ -91,11 +91,8 @@ DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent;
 
 DROP ROLE regress_test_role_super;                          -- ERROR
 SET ROLE regress_test_role_super;
-DROP FOREIGN DATA WRAPPER foo;                              -- ERROR
-RESET ROLE;
-ALTER ROLE regress_test_role_super SUPERUSER;
 DROP FOREIGN DATA WRAPPER foo;
-DROP ROLE regress_test_role_super;
+RESET ROLE;
 \dew+
 
 CREATE FOREIGN DATA WRAPPER foo;