aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/aggregatecmds.c53
-rw-r--r--src/backend/commands/dropcmds.c107
-rw-r--r--src/backend/commands/foreigncmds.c83
-rw-r--r--src/backend/commands/functioncmds.c111
-rw-r--r--src/backend/commands/opclasscmds.c98
-rw-r--r--src/backend/commands/operatorcmds.c50
-rw-r--r--src/backend/commands/proclang.c37
-rw-r--r--src/backend/commands/trigger.c36
-rw-r--r--src/backend/nodes/copyfuncs.c128
-rw-r--r--src/backend/nodes/equalfuncs.c112
-rw-r--r--src/backend/parser/gram.y170
-rw-r--r--src/backend/rewrite/rewriteRemove.c65
-rw-r--r--src/backend/tcop/utility.c193
-rw-r--r--src/include/commands/defrem.h8
-rw-r--r--src/include/commands/proclang.h1
-rw-r--r--src/include/commands/trigger.h2
-rw-r--r--src/include/nodes/nodes.h8
-rw-r--r--src/include/nodes/parsenodes.h103
-rw-r--r--src/include/rewrite/rewriteRemove.h3
-rw-r--r--src/test/regress/expected/foreign_data.out16
-rw-r--r--src/test/regress/sql/foreign_data.sql5
21 files changed, 241 insertions, 1148 deletions
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c
index a2122c1d8b6..085a2059199 100644
--- a/src/backend/commands/aggregatecmds.c
+++ b/src/backend/commands/aggregatecmds.c
@@ -208,59 +208,10 @@ 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)
{
Oid procOid;
diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c
index 8297730e3cf..c9f9ea921dc 100644
--- a/src/backend/commands/dropcmds.c
+++ b/src/backend/commands/dropcmds.c
@@ -20,13 +20,17 @@
#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)));
}
diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c
index d9c27d187a7..b30ff409235 100644
--- a/src/backend/commands/foreigncmds.c
+++ b/src/backend/commands/foreigncmds.c
@@ -686,50 +686,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
*/
void
@@ -958,45 +914,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
*/
void
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index c4746618ae5..45fdfee2175 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -961,72 +961,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.
*
* Note: this is also used for aggregate deletion, since the OIDs of
@@ -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
*
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index af0de05a032..0ef3584bb2f 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -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.
*/
diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c
index c5c18ee4fcc..1e6c5ce2ad7 100644
--- a/src/backend/commands/operatorcmds.c
+++ b/src/backend/commands/operatorcmds.c
@@ -291,56 +291,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.
*/
void
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 7a37e96c402..e4cd2ab33d1 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -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.
*/
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index a6e7268aa78..5589528e5ca 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -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.
*/
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 63958c3afc6..b8f047a9a58 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -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;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index f3a34a12e20..d1af48a30da 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -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);
@@ -1290,18 +1291,6 @@ _equalAlterFunctionStmt(AlterFunctionStmt *a, AlterFunctionStmt *b)
}
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)
{
COMPARE_NODE_FIELD(args);
@@ -1310,28 +1299,6 @@ _equalDoStmt(DoStmt *a, DoStmt *b)
}
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)
{
COMPARE_SCALAR_FIELD(renameType);
@@ -1720,16 +1687,6 @@ _equalAlterFdwStmt(AlterFdwStmt *a, AlterFdwStmt *b)
}
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)
{
COMPARE_STRING_FIELD(servername);
@@ -1753,16 +1710,6 @@ _equalAlterForeignServerStmt(AlterForeignServerStmt *a, AlterForeignServerStmt *
}
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)
{
COMPARE_STRING_FIELD(username);
@@ -1825,18 +1772,6 @@ _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
}
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)
{
COMPARE_SCALAR_FIELD(replace);
@@ -1850,16 +1785,6 @@ _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
}
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)
{
COMPARE_SCALAR_FIELD(stmt_type);
@@ -1964,17 +1889,6 @@ _equalCreateCastStmt(CreateCastStmt *a, CreateCastStmt *b)
}
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)
{
COMPARE_STRING_FIELD(name);
@@ -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;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c135465fbd3..7ea38e4663e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -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;
}
diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c
index b9b693cee1d..3cc159ae5f1 100644
--- a/src/backend/rewrite/rewriteRemove.c
+++ b/src/backend/rewrite/rewriteRemove.c
@@ -30,71 +30,6 @@
#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.
*/
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 5b0633398cf..cc8f32d4cea 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -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;
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index a466e2edb05..70d3a8fe021 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -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);
diff --git a/src/include/commands/proclang.h b/src/include/commands/proclang.h
index 644c371dcc0..17d09724199 100644
--- a/src/include/commands/proclang.h
+++ b/src/include/commands/proclang.h
@@ -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);
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
index fe21298b648..e7d28f7cdd2 100644
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -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);
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 824d8b5dc9a..3a240897985 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -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,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index af6565e7e4a..6449eca52d9 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -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,30 +1897,13 @@ 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
* ----------------------
*/
@@ -2118,20 +2077,6 @@ typedef struct AlterFunctionStmt
} 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
*
* DoStmt is the raw parser output, InlineCodeBlock is the execution-time API
@@ -2152,32 +2097,6 @@ typedef struct InlineCodeBlock
} 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
* ----------------------
*/
@@ -2558,20 +2477,6 @@ typedef struct CreateCastStmt
} 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
* ----------------------
*/
diff --git a/src/include/rewrite/rewriteRemove.h b/src/include/rewrite/rewriteRemove.h
index b9a63bad7b4..14f3c1dfddb 100644
--- a/src/include/rewrite/rewriteRemove.h
+++ b/src/include/rewrite/rewriteRemove.h
@@ -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 */
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index 2687d51f77b..314748c6d44 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -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;
diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql
index 051dfa3a96c..bfdb32afdc0 100644
--- a/src/test/regress/sql/foreign_data.sql
+++ b/src/test/regress/sql/foreign_data.sql
@@ -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;