84 #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
156 ConstraintRelationId,
157 ConversionRelationId,
158 AttrDefaultRelationId,
160 LargeObjectRelationId,
162 OperatorClassRelationId,
163 OperatorFamilyRelationId,
164 AccessMethodRelationId,
165 AccessMethodOperatorRelationId,
166 AccessMethodProcedureRelationId,
170 StatisticExtRelationId,
172 TSDictionaryRelationId,
173 TSTemplateRelationId,
178 TableSpaceRelationId,
179 ForeignDataWrapperRelationId,
180 ForeignServerRelationId,
181 UserMappingRelationId,
182 DefaultAclRelationId,
184 EventTriggerRelationId,
185 ParameterAclRelationId,
187 PublicationNamespaceRelationId,
188 PublicationRelationId,
189 PublicationRelRelationId,
190 SubscriptionRelationId,
198 "object_classes[] must cover all ObjectClasses");
254 bool original =
false;
503 int numDependentObjects;
504 int maxDependentObjects;
545 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
546 errmsg(
"cannot drop %s because it is required by the database system",
560 Anum_pg_depend_classid,
564 Anum_pg_depend_objid,
571 Anum_pg_depend_objsubid,
586 memset(&owningObject, 0,
sizeof(owningObject));
587 memset(&partitionObject, 0,
sizeof(partitionObject));
593 otherObject.
classId = foundDep->refclassid;
594 otherObject.
objectId = foundDep->refobjid;
609 switch (foundDep->deptype)
637 otherObject.
classId == ExtensionRelationId &&
665 if (pendingObjects &&
686 owningObject = otherObject;
771 elog(
ERROR,
"deletion of owning object %s failed to delete %s",
792 partitionObject = otherObject;
802 partitionObject = otherObject;
813 elog(
ERROR,
"unrecognized dependency type '%c' for %s",
837 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
838 errmsg(
"cannot drop %s because %s requires it",
840 errhint(
"You can drop %s instead.", otherObjDesc)));
851 maxDependentObjects = 128;
854 numDependentObjects = 0;
857 Anum_pg_depend_refclassid,
861 Anum_pg_depend_refobjid,
867 Anum_pg_depend_refobjsubid,
883 otherObject.
classId = foundDep->classid;
884 otherObject.
objectId = foundDep->objid;
921 switch (foundDep->deptype)
941 elog(
ERROR,
"unrecognized dependency type '%c' for %s",
948 if (numDependentObjects >= maxDependentObjects)
951 maxDependentObjects *= 2;
957 dependentObjects[numDependentObjects].
obj = otherObject;
958 dependentObjects[numDependentObjects].
subflags = subflags;
959 numDependentObjects++;
969 if (numDependentObjects > 1)
970 qsort(dependentObjects, numDependentObjects,
979 mystack.
flags = objflags;
980 mystack.
next = stack;
982 for (
int i = 0;
i < numDependentObjects;
i++)
995 pfree(dependentObjects);
1038 int numReportedClient = 0;
1039 int numNotReportedClient = 0;
1064 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1065 errmsg(
"cannot drop %s because %s requires it",
1067 errhint(
"You can drop %s instead.", otherObjDesc)));
1085 #define MAX_REPORTED_DEPS 100
1094 for (
i = targetObjects->
numrefs - 1;
i >= 0;
i--)
1111 if (objDesc == NULL)
1144 if (clientdetail.
len != 0)
1147 objDesc, otherDesc);
1148 numReportedClient++;
1151 numNotReportedClient++;
1153 if (logdetail.
len != 0)
1156 objDesc, otherDesc);
1160 numNotReportedClient++;
1168 if (clientdetail.
len != 0)
1172 numReportedClient++;
1175 numNotReportedClient++;
1177 if (logdetail.
len != 0)
1186 if (numNotReportedClient > 0)
1188 "(see server log for list)",
1189 "\nand %d other objects "
1190 "(see server log for list)",
1191 numNotReportedClient),
1192 numNotReportedClient);
1198 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1199 errmsg(
"cannot drop %s because other objects depend on it",
1203 errhint(
"Use DROP ... CASCADE to drop the dependent objects too.")));
1206 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1207 errmsg(
"cannot drop desired object(s) because other objects depend on them"),
1210 errhint(
"Use DROP ... CASCADE to drop the dependent objects too.")));
1212 else if (numReportedClient > 1)
1216 "drop cascades to %d other objects",
1217 numReportedClient + numNotReportedClient,
1218 numReportedClient + numNotReportedClient),
1222 else if (numReportedClient == 1)
1255 elog(
ERROR,
"cache lookup failed for %s %u",
1278 elog(
ERROR,
"could not find tuple for %s %u",
1339 Anum_pg_depend_classid,
1343 Anum_pg_depend_objid,
1349 Anum_pg_depend_objsubid,
1407 if (relKind == RELKIND_INDEX ||
1408 relKind == RELKIND_PARTITIONED_INDEX)
1429 if (relKind == RELKIND_SEQUENCE)
1525 elog(
ERROR,
"global objects cannot be deleted by doDeletion");
1657 rte.type = T_RangeTblEntry;
1660 rte.
relkind = RELKIND_RELATION;
1672 if ((behavior != self_behavior || reverse_self) &&
1684 for (oldref = 0; oldref < context.
addrs->
numrefs; oldref++)
1688 if (thisobj->
classId == RelationRelationId &&
1714 for (selfref = 0; selfref < self_addrs->
numrefs; selfref++)
1818 con->constcollid != DEFAULT_COLLATION_OID)
1828 if (!con->constisnull)
1833 case REGPROCEDUREOID:
1841 case REGOPERATOROID:
1862 case REGCOLLATIONOID:
1876 case REGDICTIONARYOID:
1884 case REGNAMESPACEOID:
1898 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1899 errmsg(
"constant of the type %s cannot be used here",
1915 param->paramcollid != DEFAULT_COLLATION_OID)
1985 if (sbsref->refrestype != sbsref->refcontainertype &&
1986 sbsref->refrestype != sbsref->refelemtype)
1994 elog(
ERROR,
"already-planned subqueries not supported");
2019 fselect->resultcollid != DEFAULT_COLLATION_OID)
2033 foreach(l, fstore->fieldnums)
2050 relab->resultcollid != DEFAULT_COLLATION_OID)
2063 iocoerce->resultcollid != DEFAULT_COLLATION_OID)
2076 acoerce->resultcollid != DEFAULT_COLLATION_OID)
2108 foreach(l, rcexpr->opnos)
2113 foreach(l, rcexpr->opfamilies)
2165 wc->inRangeColl != DEFAULT_COLLATION_OID)
2208 foreach(lc, query->
rtable)
2260 if (query->resultRelation <= 0 ||
2262 elog(
ERROR,
"invalid resultRelation %d",
2263 query->resultRelation);
2282 foreach(lc, query->constraintDeps)
2316 foreach(ct, rtfunc->funccoltypes)
2321 foreach(ct, rtfunc->funccolcollations)
2338 foreach(ct, tf->coltypes)
2343 foreach(ct, tf->colcollations)
2386 if (
attnum > atts_done &&
2387 attnum <= atts_done + rtfunc->funccolcount)
2392 if (tupdesc && tupdesc->
tdtypeid != RECORDOID)
2410 atts_done += rtfunc->funccolcount;
2419 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2420 errmsg(
"column %d of relation \"%s\" does not exist",
2449 priorobj = addrs->
refs;
2451 for (oldref = 1; oldref < addrs->
numrefs; oldref++)
2477 *priorobj = *thisobj;
2631 *itemextra = *extra;
2671 bool result =
false;
2744 bool result =
false;
2747 for (stackptr = stack; stackptr; stackptr = stackptr->
next)
2841 elog(
ERROR,
"invalid non-zero objectSubId for object class %u",
2846 case RelationRelationId:
2850 case ProcedureRelationId:
2853 case TypeRelationId:
2856 case CastRelationId:
2859 case CollationRelationId:
2862 case ConstraintRelationId:
2865 case ConversionRelationId:
2868 case AttrDefaultRelationId:
2871 case LanguageRelationId:
2874 case LargeObjectRelationId:
2877 case OperatorRelationId:
2880 case OperatorClassRelationId:
2883 case OperatorFamilyRelationId:
2886 case AccessMethodRelationId:
2889 case AccessMethodOperatorRelationId:
2892 case AccessMethodProcedureRelationId:
2895 case RewriteRelationId:
2898 case TriggerRelationId:
2901 case NamespaceRelationId:
2904 case StatisticExtRelationId:
2907 case TSParserRelationId:
2910 case TSDictionaryRelationId:
2913 case TSTemplateRelationId:
2916 case TSConfigRelationId:
2919 case AuthIdRelationId:
2922 case AuthMemRelationId:
2925 case DatabaseRelationId:
2928 case TableSpaceRelationId:
2931 case ForeignDataWrapperRelationId:
2934 case ForeignServerRelationId:
2937 case UserMappingRelationId:
2940 case DefaultAclRelationId:
2943 case ExtensionRelationId:
2946 case EventTriggerRelationId:
2949 case ParameterAclRelationId:
2952 case PolicyRelationId:
2955 case PublicationNamespaceRelationId:
2958 case PublicationRelationId:
2961 case PublicationRelRelationId:
2964 case SubscriptionRelationId:
2967 case TransformRelationId:
2990 Anum_pg_init_privs_objoid,
2994 Anum_pg_init_privs_classoid,
2998 Anum_pg_init_privs_objsubid,
#define InvalidAttrNumber
#define ngettext(s, p, n)
#define OidIsValid(objectId)
bool IsPinnedObject(Oid classId, Oid objectId)
elog(ERROR, "%s: %s", p2, msg)
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)
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)
StaticAssertDecl(lengthof(object_classes)==LAST_OCLASS+1, "object_classes[] must cover all ObjectClasses")
ObjectClass getObjectClass(const ObjectAddress *object)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
static void deleteOneObject(const ObjectAddress *object, Relation *depRel, int32 flags)
static void DeleteInitPrivs(const ObjectAddress *object)
#define MAX_REPORTED_DEPS
static const Oid object_classes[]
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)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
#define DEPFLAG_SUBOBJECT
#define DEPFLAG_EXTENSION
static void deleteObjectsInList(ObjectAddresses *targetObjects, Relation *depRel, int flags)
static void add_object_address(ObjectClass oclass, Oid objectId, int32 subId, ObjectAddresses *addrs)
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
@ OCLASS_PUBLICATION_NAMESPACE
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 EventTriggerSupportsObjectClass(ObjectClass objclass)
Oid CurrentExtensionObject
void RemoveExtensionById(Oid extId)
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)
void RemoveAttributeById(Oid relid, AttrNumber attnum)
void heap_drop_with_catalog(Oid relid)
#define HeapTupleIsValid(tuple)
void index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
Assert(fmt[strlen(fmt) - 1] !='\n')
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 pfree(void *pointer)
void * repalloc(void *pointer, Size size)
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)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
int get_object_catcache_oid(Oid class_id)
Oid get_object_oid_index(Oid class_id)
const char * get_object_class_descr(Oid class_id)
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 DeleteSequenceTuple(Oid relid)
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)