/*
- * 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)
{
#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.
{
ObjectAddresses *objects;
ListCell *cell1;
+ ListCell *cell2 = NULL;
objects = new_object_addresses();
{
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);
/* 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)
* 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)
{
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)));
}
}
-/*
- * 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
*/
}
-/*
- * 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
*/
}
-/*
- * 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.
*
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
*
}
}
-
-/*
- * 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.
*/
}
-/*
- * 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.
*/
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.
*/
}
}
-
-/*
- * 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.
*/
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);
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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;
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;
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;
case T_CreateCastStmt:
retval = _copyCreateCastStmt(from);
break;
- case T_DropCastStmt:
- retval = _copyDropCastStmt(from);
- break;
case T_PrepareStmt:
retval = _copyPrepareStmt(from);
break;
_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);
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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;
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;
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;
case T_CreateCastStmt:
retval = _equalCreateCastStmt(a, b);
break;
- case T_DropCastStmt:
- retval = _equalDropCastStmt(a, b);
- break;
case T_PrepareStmt:
retval = _equalPrepareStmt(a, b);
break;
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;
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;
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;
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;
}
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,
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;
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;
n->removeType = $2;
n->missing_ok = TRUE;
n->objects = $5;
+ n->arguments = NIL;
n->behavior = $6;
$$ = (Node *)n;
}
n->removeType = $2;
n->missing_ok = FALSE;
n->objects = $3;
+ n->arguments = NIL;
n->behavior = $4;
$$ = (Node *)n;
}
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;
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;
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;
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;
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;
}
#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.
*/
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:
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:
AlterForeignDataWrapper((AlterFdwStmt *) parsetree);
break;
- case T_DropFdwStmt:
- RemoveForeignDataWrapper((DropFdwStmt *) parsetree);
- break;
-
case T_CreateForeignServerStmt:
CreateForeignServer((CreateForeignServerStmt *) parsetree);
break;
AlterForeignServer((AlterForeignServerStmt *) parsetree);
break;
- case T_DropForeignServerStmt:
- RemoveForeignServer((DropForeignServerStmt *) parsetree);
- break;
-
case T_CreateUserMappingStmt:
CreateUserMapping((CreateUserMappingStmt *) parsetree);
break;
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;
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 ****
*/
CreateCast((CreateCastStmt *) parsetree);
break;
- case T_DropCastStmt:
- DropCast((DropCastStmt *) parsetree);
- break;
-
case T_CreateOpClassStmt:
DefineOpClass((CreateOpClassStmt *) parsetree);
break;
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;
tag = "ALTER FOREIGN DATA WRAPPER";
break;
- case T_DropFdwStmt:
- tag = "DROP FOREIGN DATA WRAPPER";
- break;
-
case T_CreateForeignServerStmt:
tag = "CREATE SERVER";
break;
tag = "ALTER SERVER";
break;
- case T_DropForeignServerStmt:
- tag = "DROP SERVER";
- break;
-
case T_CreateUserMappingStmt:
tag = "CREATE USER MAPPING";
break;
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 = "???";
}
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;
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;
tag = "CREATE CAST";
break;
- case T_DropCastStmt:
- tag = "DROP CAST";
- break;
-
case T_CreateOpClassStmt:
tag = "CREATE OPERATOR CLASS";
break;
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;
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:
lev = LOGSTMT_DDL;
break;
- case T_RemoveFuncStmt:
- lev = LOGSTMT_DDL;
- break;
-
case T_DoStmt:
lev = LOGSTMT_ALL;
break;
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;
lev = LOGSTMT_DDL;
break;
- case T_DropCastStmt:
- lev = LOGSTMT_DDL;
- break;
-
case T_CreateOpClassStmt:
lev = LOGSTMT_DDL;
break;
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;
/* 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);
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);
/* 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);
/* 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);
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);
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);
#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);
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);
T_IndexStmt,
T_CreateFunctionStmt,
T_AlterFunctionStmt,
- T_RemoveFuncStmt,
T_DoStmt,
T_RenameStmt,
T_RuleStmt,
T_VariableShowStmt,
T_DiscardStmt,
T_CreateTrigStmt,
- T_DropPropertyStmt,
T_CreatePLangStmt,
- T_DropPLangStmt,
T_CreateRoleStmt,
T_AlterRoleStmt,
T_DropRoleStmt,
T_AlterRoleSetStmt,
T_CreateConversionStmt,
T_CreateCastStmt,
- T_DropCastStmt,
T_CreateOpClassStmt,
T_CreateOpFamilyStmt,
T_AlterOpFamilyStmt,
- T_RemoveOpClassStmt,
- T_RemoveOpFamilyStmt,
T_PrepareStmt,
T_ExecuteStmt,
T_DeallocateStmt,
T_AlterTSConfigurationStmt,
T_CreateFdwStmt,
T_AlterFdwStmt,
- T_DropFdwStmt,
T_CreateForeignServerStmt,
T_AlterForeignServerStmt,
- T_DropForeignServerStmt,
T_CreateUserMappingStmt,
T_AlterUserMappingStmt,
T_DropUserMappingStmt,
} AlterExtensionContentsStmt;
/* ----------------------
- * Create/Drop FOREIGN DATA WRAPPER Statements
+ * Create/Alter FOREIGN DATA WRAPPER Statements
* ----------------------
*/
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
* ----------------------
*/
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
* ----------------------
} CreateTrigStmt;
/* ----------------------
- * Create/Drop PROCEDURAL LANGUAGE Statements
+ * Create PROCEDURAL LANGUAGE Statements
* ----------------------
*/
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
*
{
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
* ----------------------
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
*
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
* ----------------------
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
* ----------------------
#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 */
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
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
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
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;
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;