67 #include "utils/fmgroids.h" 88 Oid refclassid,
Oid refobjid,
92 Oid refclassId,
Oid refobjId,
97 Oid refclassId,
Oid refobjId,
174 referenced.
classId = AuthIdRelationId;
205 Oid refclassid,
Oid refobjid,
224 Anum_pg_shdepend_dbid,
228 Anum_pg_shdepend_classid,
232 Anum_pg_shdepend_objid,
236 Anum_pg_shdepend_objsubid,
251 "multiple pg_shdepend entries for object %u/%u/%d deptype %c",
252 classid, objid, objsubid, deptype);
270 shForm->refclassid = refclassid;
271 shForm->refobjid = refobjid;
279 bool nulls[Natts_pg_shdepend];
281 memset(nulls,
false,
sizeof(nulls));
286 values[Anum_pg_shdepend_objsubid - 1] =
Int32GetDatum(objsubid);
290 values[Anum_pg_shdepend_deptype - 1] =
CharGetDatum(deptype);
321 classId, objectId, 0,
322 AuthIdRelationId, newOwnerId,
345 AuthIdRelationId, newOwnerId,
388 if (newTablespaceId != DEFAULTTABLESPACE_OID &&
391 classId, objectId, 0,
392 TableSpaceRelationId, newTablespaceId,
396 classId, objectId, 0,
true,
419 in1 = in2 = out1 = out2 = 0;
420 while (in1 < *nlist1 && in2 < *nlist2)
422 if (list1[in1] == list2[in2])
428 else if (list1[in1] < list2[in2])
431 list1[out1++] = list1[in1++];
436 list2[out2++] = list2[in2++];
441 while (in1 < *nlist1)
443 list1[out1++] = list1[in1++];
447 while (in2 < *nlist2)
449 list2[out2++] = list2[in2++];
484 int noldmembers,
Oid *oldmembers,
485 int nnewmembers,
Oid *newmembers)
496 getOidListDiff(oldmembers, &noldmembers, newmembers, &nnewmembers);
498 if (noldmembers > 0 || nnewmembers > 0)
503 for (i = 0; i < nnewmembers; i++)
505 Oid roleid = newmembers[
i];
512 if (roleid == ownerId)
520 AuthIdRelationId, roleid,
525 for (i = 0; i < noldmembers; i++)
527 Oid roleid = oldmembers[
i];
530 if (roleid == ownerId)
539 AuthIdRelationId, roleid,
634 char **detail_msg,
char **detail_log_msg)
640 int numReportedDeps = 0;
641 int numNotReportedDeps = 0;
642 int numNotReportedDbs = 0;
661 #define MAX_REPORTED_DEPS 100 663 allocedobjects = 128;
673 Anum_pg_shdepend_refclassid,
677 Anum_pg_shdepend_refobjid,
691 object.classId = classId;
692 object.objectId = objectId;
693 object.objectSubId = 0;
695 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
696 errmsg(
"cannot drop %s because it is required by the database system",
700 object.classId = sdepForm->classid;
701 object.objectId = sdepForm->objid;
702 object.objectSubId = sdepForm->objsubid;
714 if (numobjects >= allocedobjects)
721 objects[numobjects].
object = object;
722 objects[numobjects].
deptype = sdepForm->deptype;
739 foreach(cell, remDeps)
742 if (dep->
dbOid == sdepForm->dbid)
752 dep->
dbOid = sdepForm->dbid;
754 remDeps =
lappend(remDeps, dep);
767 qsort((
void *) objects, numobjects,
770 for (
int i = 0;
i < numobjects;
i++)
782 numNotReportedDeps++;
793 foreach(cell, remDeps)
797 object.classId = DatabaseRelationId;
798 object.objectId = dep->
dbOid;
799 object.objectSubId = 0;
820 *detail_msg = *detail_log_msg = NULL;
824 if (numNotReportedDeps > 0)
826 "(see server log for list)",
827 "\nand %d other objects " 828 "(see server log for list)",
831 if (numNotReportedDbs > 0)
833 "(see server log for list)",
834 "\nand objects in %d other databases " 835 "(see server log for list)",
839 *detail_msg = descs.
data;
840 *detail_log_msg = alldescs.
data;
879 Anum_pg_shdepend_dbid,
887 slot_stored_count = 0;
902 if (slot_init_count < max_slots)
913 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_classid] = shdep->classid;
914 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objid] = shdep->objid;
915 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objsubid] = shdep->objsubid;
916 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refclassid] = shdep->refclassid;
917 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refobjid] = shdep->refobjid;
918 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_deptype] = shdep->deptype;
924 if (slot_stored_count == max_slots)
927 slot_stored_count = 0;
932 if (slot_stored_count > 0)
941 for (
int i = 0;
i < slot_init_count;
i++)
967 Anum_pg_shdepend_dbid,
1025 Oid refclassId,
Oid refobjId,
1030 bool nulls[Natts_pg_shdepend];
1039 memset(nulls,
false,
sizeof(nulls));
1047 values[Anum_pg_shdepend_objsubid - 1] =
Int32GetDatum(objsubId);
1051 values[Anum_pg_shdepend_deptype - 1] =
CharGetDatum(deptype);
1080 bool drop_subobjects,
1081 Oid refclassId,
Oid refobjId,
1091 Anum_pg_shdepend_dbid,
1095 Anum_pg_shdepend_classid,
1099 Anum_pg_shdepend_objid,
1102 if (drop_subobjects)
1107 Anum_pg_shdepend_objsubid,
1121 if (
OidIsValid(refclassId) && shdepForm->refclassid != refclassId)
1123 if (
OidIsValid(refobjId) && shdepForm->refobjid != refobjId)
1126 shdepForm->deptype != deptype)
1172 case AuthIdRelationId:
1175 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1176 errmsg(
"role %u was concurrently dropped",
1180 case TableSpaceRelationId:
1185 if (tablespace == NULL)
1187 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1188 errmsg(
"tablespace %u was concurrently dropped",
1194 case DatabaseRelationId:
1199 if (database == NULL)
1201 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1202 errmsg(
"database %u was concurrently dropped",
1210 elog(
ERROR,
"unrecognized shared classId: %u", classId);
1239 if (descs->
len != 0)
1255 elog(
ERROR,
"unrecognized dependency type: %d",
1268 elog(
ERROR,
"unrecognized object type: %d", type);
1285 bool result =
false;
1291 Anum_pg_shdepend_refclassid,
1295 Anum_pg_shdepend_refobjid,
1354 foreach(cell, roleids)
1366 obj.
classId = AuthIdRelationId;
1371 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1372 errmsg(
"cannot drop objects owned by %s because they are " 1373 "required by the database system",
1378 Anum_pg_shdepend_refclassid,
1382 Anum_pg_shdepend_refobjid,
1402 switch (sdepForm->deptype)
1407 elog(
ERROR,
"unexpected dependency type");
1424 obj.
classId = sdepForm->classid;
1447 obj.
classId = sdepForm->classid;
1501 foreach(cell, roleids)
1513 obj.
classId = AuthIdRelationId;
1518 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1519 errmsg(
"cannot reassign ownership of objects owned by %s because they are required by the database system",
1529 Anum_pg_shdepend_refclassid,
1533 Anum_pg_shdepend_refobjid,
1561 switch (sdepForm->classid)
1563 case TypeRelationId:
1567 case NamespaceRelationId:
1571 case RelationRelationId:
1581 case DefaultAclRelationId:
1589 case UserMappingRelationId:
1593 case ForeignServerRelationId:
1597 case ForeignDataWrapperRelationId:
1601 case EventTriggerRelationId:
1605 case PublicationRelationId:
1609 case SubscriptionRelationId:
1614 case CollationRelationId:
1615 case ConversionRelationId:
1616 case OperatorRelationId:
1617 case ProcedureRelationId:
1618 case LanguageRelationId:
1619 case LargeObjectRelationId:
1620 case OperatorFamilyRelationId:
1621 case OperatorClassRelationId:
1622 case ExtensionRelationId:
1623 case StatisticExtRelationId:
1624 case TableSpaceRelationId:
1625 case DatabaseRelationId:
1626 case TSConfigRelationId:
1627 case TSDictionaryRelationId:
1629 Oid classId = sdepForm->classid;
1632 if (classId == LargeObjectRelationId)
1633 classId = LargeObjectMetadataRelationId;
1645 elog(
ERROR,
"unexpected classid %u", sdepForm->classid);
HeapTuple heap_copytuple(HeapTuple tuple)
void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
void shdepDropOwned(List *roleids, DropBehavior behavior)
void recordSharedDependencyOn(ObjectAddress *depender, ObjectAddress *referenced, SharedDependencyType deptype)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
void table_close(Relation relation, LOCKMODE lockmode)
static int shared_dependency_comparator(const void *a, const void *b)
void systable_endscan(SysScanDesc sysscan)
void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static bool isSharedObjectPinned(Oid classId, Oid objectId, Relation sdepRel)
#define RelationGetDescr(relation)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
static void shdepChangeDep(Relation sdepRel, Oid classid, Oid objid, int32 objsubid, Oid refclassid, Oid refobjid, SharedDependencyType deptype)
void sort_object_addresses(ObjectAddresses *addrs)
static void getOidListDiff(Oid *list1, int *nlist1, Oid *list2, int *nlist2)
#define MAX_CATALOG_MULTI_INSERT_BYTES
void AlterSchemaOwner_oid(Oid oid, Oid newOwnerId)
FormData_pg_shdepend * Form_pg_shdepend
void recordDependencyOnTablespace(Oid classId, Oid objectId, Oid tablespace)
void ReleaseDeletionLock(const ObjectAddress *object)
static void shdepAddDependency(Relation sdepRel, Oid classId, Oid objectId, int32 objsubId, Oid refclassId, Oid refobjId, SharedDependencyType deptype)
void AlterForeignServerOwner_oid(Oid srvId, Oid newOwnerId)
#define MAX_REPORTED_DEPS
static void storeObjectDescription(StringInfo descs, SharedDependencyObjectType type, ObjectAddress *object, SharedDependencyType deptype, int count)
int errcode(int sqlerrcode)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
void heap_freetuple(HeapTuple htup)
#define OidIsValid(objectId)
void list_free_deep(List *list)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
SharedDependencyObjectType objtype
bool systable_recheck_tuple(SysScanDesc sysscan, HeapTuple tup)
bool RemoveRoleFromObjectPolicy(Oid roleid, Oid classid, Oid policy_id)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
HeapTuple systable_getnext(SysScanDesc sysscan)
#define SearchSysCacheExists1(cacheId, key1)
void pfree(void *pointer)
void appendStringInfo(StringInfo str, const char *fmt,...)
#define ObjectIdGetDatum(X)
void CatalogTuplesMultiInsertWithInfo(Relation heapRel, TupleTableSlot **slot, int ntuples, CatalogIndexState indstate)
#define SharedDependReferenceIndexId
SharedDependencyObjectType
void shdepLockAndCheckObject(Oid classId, Oid objectId)
void AlterTypeOwner_oid(Oid typeOid, Oid newOwnerId, bool hasDependEntry)
char * get_database_name(Oid dbid)
void AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
void shdepReassignOwned(List *roleids, Oid newrole)
void copyTemplateDependencies(Oid templateDbId, Oid newDbId)
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
List * lappend(List *list, void *datum)
void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
void dropDatabaseDependencies(Oid databaseId)
#define ngettext(s, p, n)
void AcquireDeletionLock(const ObjectAddress *object, int flags)
void CommandCounterIncrement(void)
bool IsSharedRelation(Oid relationId)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void AlterEventTriggerOwner_oid(Oid trigOid, Oid newOwnerId)
#define ereport(elevel,...)
static void shdepDropDependency(Relation sdepRel, Oid classId, Oid objectId, int32 objsubId, bool drop_subobjects, Oid refclassId, Oid refobjId, SharedDependencyType deptype)
#define HeapTupleIsValid(tuple)
#define Assert(condition)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
static Oid classIdGetDbId(Oid classId)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
void * repalloc(void *pointer, Size size)
#define ObjectAddressSet(addr, class_id, object_id)
static Datum values[MAXATTR]
#define IsBootstrapProcessingMode()
#define AccessExclusiveLock
int errmsg(const char *fmt,...)
char * get_tablespace_name(Oid spc_oid)
const TupleTableSlotOps TTSOpsHeapTuple
void AlterSubscriptionOwner_oid(Oid subid, Oid newOwnerId)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void CatalogCloseIndexes(CatalogIndexState indstate)
void AlterPublicationOwner_oid(Oid subid, Oid newOwnerId)
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
bool checkSharedDependencies(Oid classId, Oid objectId, char **detail_msg, char **detail_log_msg)
#define qsort(a, b, c, d)
Relation table_open(Oid relationId, LOCKMODE lockmode)
#define SharedDependDependerIndexId
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
#define BTEqualStrategyNumber
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)