85#include "utils/fmgroids.h"
102#define DEPFLAG_ORIGINAL 0x0001
103#define DEPFLAG_NORMAL 0x0002
104#define DEPFLAG_AUTO 0x0004
105#define DEPFLAG_INTERNAL 0x0008
106#define DEPFLAG_PARTITION 0x0010
107#define DEPFLAG_EXTENSION 0x0020
108#define DEPFLAG_REVERSE 0x0040
109#define DEPFLAG_IS_PART 0x0080
110#define DEPFLAG_SUBOBJECT 0x0100
200 bool original =
false;
499 int numDependentObjects;
500 int maxDependentObjects;
547 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
548 errmsg(
"cannot drop %s because it is required by the database system",
562 Anum_pg_depend_classid,
566 Anum_pg_depend_objid,
573 Anum_pg_depend_objsubid,
588 memset(&owningObject, 0,
sizeof(owningObject));
589 memset(&partitionObject, 0,
sizeof(partitionObject));
595 otherObject.
classId = foundDep->refclassid;
596 otherObject.
objectId = foundDep->refobjid;
611 switch (foundDep->deptype)
639 otherObject.
classId == ExtensionRelationId &&
667 if (pendingObjects &&
688 owningObject = otherObject;
773 elog(
ERROR,
"deletion of owning object %s failed to delete %s",
794 partitionObject = otherObject;
804 partitionObject = otherObject;
815 elog(
ERROR,
"unrecognized dependency type '%c' for %s",
839 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
840 errmsg(
"cannot drop %s because %s requires it",
842 errhint(
"You can drop %s instead.", otherObjDesc)));
853 maxDependentObjects = 128;
855 numDependentObjects = 0;
858 Anum_pg_depend_refclassid,
862 Anum_pg_depend_refobjid,
868 Anum_pg_depend_refobjsubid,
884 otherObject.
classId = foundDep->classid;
885 otherObject.
objectId = foundDep->objid;
922 switch (foundDep->deptype)
942 elog(
ERROR,
"unrecognized dependency type '%c' for %s",
949 if (numDependentObjects >= maxDependentObjects)
952 maxDependentObjects *= 2;
958 dependentObjects[numDependentObjects].
obj = otherObject;
959 dependentObjects[numDependentObjects].
subflags = subflags;
960 numDependentObjects++;
970 if (numDependentObjects > 1)
971 qsort(dependentObjects, numDependentObjects,
980 mystack.
flags = objflags;
981 mystack.
next = stack;
983 for (
int i = 0;
i < numDependentObjects;
i++)
996 pfree(dependentObjects);
1039 int numReportedClient = 0;
1040 int numNotReportedClient = 0;
1065 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1066 errmsg(
"cannot drop %s because %s requires it",
1068 errhint(
"You can drop %s instead.", otherObjDesc)));
1086#define MAX_REPORTED_DEPS 100
1095 for (
i = targetObjects->
numrefs - 1;
i >= 0;
i--)
1112 if (objDesc == NULL)
1145 if (clientdetail.
len != 0)
1148 objDesc, otherDesc);
1149 numReportedClient++;
1152 numNotReportedClient++;
1154 if (logdetail.
len != 0)
1157 objDesc, otherDesc);
1161 numNotReportedClient++;
1169 if (clientdetail.
len != 0)
1173 numReportedClient++;
1176 numNotReportedClient++;
1178 if (logdetail.
len != 0)
1187 if (numNotReportedClient > 0)
1189 "(see server log for list)",
1190 "\nand %d other objects "
1191 "(see server log for list)",
1192 numNotReportedClient),
1193 numNotReportedClient);
1199 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1200 errmsg(
"cannot drop %s because other objects depend on it",
1204 errhint(
"Use DROP ... CASCADE to drop the dependent objects too.")));
1207 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1208 errmsg(
"cannot drop desired object(s) because other objects depend on them"),
1211 errhint(
"Use DROP ... CASCADE to drop the dependent objects too.")));
1213 else if (numReportedClient > 1)
1217 "drop cascades to %d other objects",
1218 numReportedClient + numNotReportedClient,
1219 numReportedClient + numNotReportedClient),
1223 else if (numReportedClient == 1)
1256 elog(
ERROR,
"cache lookup failed for %s %u",
1279 elog(
ERROR,
"could not find tuple for %s %u",
1340 Anum_pg_depend_classid,
1344 Anum_pg_depend_objid,
1350 Anum_pg_depend_objsubid,
1406 case RelationRelationId:
1410 if (relKind == RELKIND_INDEX ||
1411 relKind == RELKIND_PARTITIONED_INDEX)
1432 if (relKind == RELKIND_SEQUENCE)
1437 case ProcedureRelationId:
1441 case TypeRelationId:
1445 case ConstraintRelationId:
1449 case AttrDefaultRelationId:
1453 case LargeObjectRelationId:
1457 case OperatorRelationId:
1461 case RewriteRelationId:
1465 case TriggerRelationId:
1469 case StatisticExtRelationId:
1473 case TSConfigRelationId:
1477 case ExtensionRelationId:
1481 case PolicyRelationId:
1485 case PublicationNamespaceRelationId:
1489 case PublicationRelRelationId:
1493 case PublicationRelationId:
1497 case CastRelationId:
1498 case CollationRelationId:
1499 case ConversionRelationId:
1500 case LanguageRelationId:
1501 case OperatorClassRelationId:
1502 case OperatorFamilyRelationId:
1503 case AccessMethodRelationId:
1504 case AccessMethodOperatorRelationId:
1505 case AccessMethodProcedureRelationId:
1506 case NamespaceRelationId:
1507 case TSParserRelationId:
1508 case TSDictionaryRelationId:
1509 case TSTemplateRelationId:
1510 case ForeignDataWrapperRelationId:
1511 case ForeignServerRelationId:
1512 case UserMappingRelationId:
1513 case DefaultAclRelationId:
1514 case EventTriggerRelationId:
1515 case TransformRelationId:
1516 case AuthMemRelationId:
1523 case AuthIdRelationId:
1524 case DatabaseRelationId:
1525 case TableSpaceRelationId:
1526 case SubscriptionRelationId:
1527 case ParameterAclRelationId:
1528 elog(
ERROR,
"global objects cannot be deleted by doDeletion");
1651 context.
addrs = addrs;
1690 rte.type = T_RangeTblEntry;
1693 rte.relkind = RELKIND_RELATION;
1705 if ((behavior != self_behavior || reverse_self) &&
1717 for (oldref = 0; oldref < context.
addrs->
numrefs; oldref++)
1721 if (thisobj->
classId == RelationRelationId &&
1747 for (selfref = 0; selfref < self_addrs->
numrefs; selfref++)
1851 con->constcollid != DEFAULT_COLLATION_OID)
1861 if (!con->constisnull)
1866 case REGPROCEDUREOID:
1874 case REGOPERATOROID:
1895 case REGCOLLATIONOID:
1909 case REGDICTIONARYOID:
1917 case REGNAMESPACEOID:
1931 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1932 errmsg(
"constant of the type %s cannot be used here",
1940 case REGDATABASEOID:
1942 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1943 errmsg(
"constant of the type %s cannot be used here",
2029 if (sbsref->refrestype != sbsref->refcontainertype &&
2030 sbsref->refrestype != sbsref->refelemtype)
2038 elog(
ERROR,
"already-planned subqueries not supported");
2063 fselect->resultcollid != DEFAULT_COLLATION_OID)
2077 foreach(l, fstore->fieldnums)
2094 relab->resultcollid != DEFAULT_COLLATION_OID)
2107 iocoerce->resultcollid != DEFAULT_COLLATION_OID)
2120 acoerce->resultcollid != DEFAULT_COLLATION_OID)
2152 foreach(l, rcexpr->opnos)
2157 foreach(l, rcexpr->opfamilies)
2209 wc->inRangeColl != DEFAULT_COLLATION_OID)
2252 foreach(lc, query->
rtable)
2278 for (
int i = 0;
i < rte->joinmergedcols;
i++)
2297 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2298 errmsg(
"transition table \"%s\" cannot be referenced in a persistent object",
2299 rte->eref->aliasname)));
2319 if (query->resultRelation <= 0 ||
2321 elog(
ERROR,
"invalid resultRelation %d",
2322 query->resultRelation);
2341 foreach(lc, query->constraintDeps)
2375 foreach(ct, rtfunc->funccoltypes)
2380 foreach(ct, rtfunc->funccolcollations)
2397 foreach(ct, tf->coltypes)
2402 foreach(ct, tf->colcollations)
2445 if (
attnum > atts_done &&
2446 attnum <= atts_done + rtfunc->funccolcount)
2451 if (rtfunc->funccolnames !=
NIL)
2455 if (tupdesc && tupdesc->
tdtypeid != RECORDOID)
2473 atts_done += rtfunc->funccolcount;
2482 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2483 errmsg(
"column %d of relation \"%s\" does not exist",
2484 attnum, rte->eref->aliasname)));
2524 *foundobj = *thisobj;
2581 priorobj = addrs->
refs;
2583 for (oldref = 1; oldref < addrs->
numrefs; oldref++)
2609 *priorobj = *thisobj;
2759 *itemextra = *extra;
2799 bool result =
false;
2872 bool result =
false;
2875 for (stackptr = stack; stackptr; stackptr = stackptr->
next)
2972 Anum_pg_init_privs_objoid,
2976 Anum_pg_init_privs_classoid,
2982 Anum_pg_init_privs_objsubid,
#define InvalidAttrNumber
#define ngettext(s, p, n)
#define OidIsValid(objectId)
bool IsPinnedObject(Oid classId, Oid objectId)
void DeleteSequenceTuple(Oid relid)
static bool object_address_present_add_flags(const ObjectAddress *object, int flags, ObjectAddresses *addrs)
#define DEPFLAG_PARTITION
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
struct ObjectAddressStack ObjectAddressStack
static void add_exact_object_address_extra(const ObjectAddress *object, const ObjectAddressExtra *extra, ObjectAddresses *addrs)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
static void DropObjectById(const ObjectAddress *object)
static int object_address_comparator(const void *a, const void *b)
void sort_object_addresses(ObjectAddresses *addrs)
static void doDeletion(const ObjectAddress *object, int flags)
static bool stack_address_present_add_flags(const ObjectAddress *object, int flags, ObjectAddressStack *stack)
void performDeletionCheck(const ObjectAddress *object, DropBehavior behavior, int flags)
static void add_object_address(Oid classId, Oid objectId, int32 subId, ObjectAddresses *addrs)
static bool find_expr_references_walker(Node *node, find_expr_references_context *context)
static void eliminate_duplicate_dependencies(ObjectAddresses *addrs)
void AcquireDeletionLock(const ObjectAddress *object, int flags)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
bool query_uses_temp_object(Query *query, ObjectAddress *temp_object)
static void deleteOneObject(const ObjectAddress *object, Relation *depRel, int32 flags)
static void DeleteInitPrivs(const ObjectAddress *object)
#define MAX_REPORTED_DEPS
static void process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, find_expr_references_context *context)
static void reportDependentObjects(const ObjectAddresses *targetObjects, DropBehavior behavior, int flags, const ObjectAddress *origObject)
void ReleaseDeletionLock(const ObjectAddress *object)
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
void recordDependencyOnExpr(const ObjectAddress *depender, Node *expr, List *rtable, DependencyType behavior)
static void findDependentObjects(const ObjectAddress *object, int objflags, int flags, ObjectAddressStack *stack, ObjectAddresses *targetObjects, const ObjectAddresses *pendingObjects, Relation *depRel)
void collectDependenciesOfExpr(ObjectAddresses *addrs, Node *expr, List *rtable)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
bool find_temp_object(const ObjectAddresses *addrs, bool local_temp_okay, ObjectAddress *foundobj)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
#define DEPFLAG_SUBOBJECT
#define DEPFLAG_EXTENSION
static void deleteObjectsInList(ObjectAddresses *targetObjects, Relation *depRel, int flags)
void free_object_addresses(ObjectAddresses *addrs)
#define PERFORM_DELETION_CONCURRENTLY
#define PERFORM_DELETION_SKIP_EXTENSIONS
@ DEPENDENCY_AUTO_EXTENSION
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
#define PERFORM_DELETION_CONCURRENT_LOCK
#define PERFORM_DELETION_QUIETLY
#define PERFORM_DELETION_SKIP_ORIGINAL
#define PERFORM_DELETION_INTERNAL
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errhint(const char *fmt,...)
bool message_level_is_interesting(int elevel)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errdetail_log(const char *fmt,...)
#define ereport(elevel,...)
void EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool normal)
bool trackDroppedObjectsNeeded(void)
bool EventTriggerSupportsObject(const ObjectAddress *object)
Oid CurrentExtensionObject
void RemoveExtensionById(Oid extId)
#define palloc_object(type)
#define palloc_array(type, count)
TupleDesc get_expr_result_tupdesc(Node *expr, bool noError)
void RemoveFunctionById(Oid funcOid)
void systable_endscan(SysScanDesc sysscan)
bool systable_recheck_tuple(SysScanDesc sysscan, HeapTuple tup)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Assert(PointerIsAligned(start, uint64))
void RemoveAttributeById(Oid relid, AttrNumber attnum)
void heap_drop_with_catalog(Oid relid)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
void index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
List * list_delete_first(List *list)
List * lcons(void *datum, List *list)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
#define AccessExclusiveLock
#define ShareUpdateExclusiveLock
char get_rel_relkind(Oid relid)
Oid get_typ_typrelid(Oid typid)
Oid getBaseType(Oid typid)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
bool isTempNamespace(Oid namespaceId)
bool isAnyTempNamespace(Oid namespaceId)
Oid exprType(const Node *expr)
#define query_tree_walker(q, w, c, f)
#define QTW_EXAMINE_SORTGROUP
#define expression_tree_walker(n, w, c)
#define QTW_IGNORE_JOINALIASES
#define IsA(nodeptr, _type_)
#define InvokeObjectDropHookArg(classId, objectId, subId, dropflags)
AttrNumber get_object_attnum_oid(Oid class_id)
const char * get_object_class_descr(Oid class_id)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
int get_object_catcache_oid(Oid class_id)
Oid get_object_oid_index(Oid class_id)
Oid get_object_namespace(const ObjectAddress *address)
void RemoveOperatorById(Oid operOid)
#define rt_fetch(rangetable_index, rangetable)
void RemoveAttrDefaultById(Oid attrdefId)
void RemoveConstraintById(Oid conId)
void recordMultipleDependencies(const ObjectAddress *depender, const ObjectAddress *referenced, int nreferenced, DependencyType behavior)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
FormData_pg_depend * Form_pg_depend
void LargeObjectDrop(Oid loid)
static int list_length(const List *l)
static void * list_nth(const List *list, int n)
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
void RemovePolicyById(Oid policy_id)
#define qsort(a, b, c, d)
static Oid DatumGetObjectId(Datum X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
void RemovePublicationSchemaById(Oid psoid)
void RemovePublicationById(Oid pubid)
void RemovePublicationRelById(Oid proid)
void RemoveRewriteRuleById(Oid ruleOid)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void DeleteSecurityLabel(const ObjectAddress *object)
void check_stack_depth(void)
void RemoveStatisticsById(Oid statsOid)
#define BTEqualStrategyNumber
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
const ObjectAddress * object
struct ObjectAddressStack * next
ObjectAddressExtra * extras
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define SearchSysCacheExists1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void RemoveTriggerById(Oid trigOid)
void RemoveTSConfigurationById(Oid cfgId)
void RemoveTypeById(Oid typeOid)
void CommandCounterIncrement(void)