diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index a2122c1d8b..085a205919 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -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) { diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c index 8297730e3c..c9f9ea921d 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 d9c27d187a..b30ff40923 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -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 */ diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index c4746618ae..45fdfee217 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -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 * diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index af0de05a03..0ef3584bb2 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 c5c18ee4fc..1e6c5ce2ad 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -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. */ diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 7a37e96c40..e4cd2ab33d 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 a6e7268aa7..5589528e5c 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 63958c3afc..b8f047a9a5 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 f3a34a12e2..d1af48a30d 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); @@ -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; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index c135465fbd..7ea38e4663 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 b9b693cee1..3cc159ae5f 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 5b0633398c..cc8f32d4ce 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 a466e2edb0..70d3a8fe02 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 644c371dcc..17d0972419 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 fe21298b64..e7d28f7cdd 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 824d8b5dc9..3a24089798 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 af6565e7e4..6449eca52d 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,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 * ---------------------- diff --git a/src/include/rewrite/rewriteRemove.h b/src/include/rewrite/rewriteRemove.h index b9a63bad7b..14f3c1dfdd 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 2687d51f77..314748c6d4 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 051dfa3a96..bfdb32afdc 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;