68 #include "utils/fmgroids.h"
90 Oid refclassid,
Oid refobjid,
94 Oid refclassId,
Oid refobjId,
99 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));
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,
632 char **detail_msg,
char **detail_log_msg)
638 int numReportedDeps = 0;
639 int numNotReportedDeps = 0;
640 int numNotReportedDbs = 0;
653 object.classId = classId;
654 object.objectId = objectId;
655 object.objectSubId = 0;
657 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
658 errmsg(
"cannot drop %s because it is required by the database system",
671 #define MAX_REPORTED_DEPS 100
673 allocedobjects = 128;
683 Anum_pg_shdepend_refclassid,
687 Anum_pg_shdepend_refobjid,
698 object.classId = sdepForm->classid;
699 object.objectId = sdepForm->objid;
700 object.objectSubId = sdepForm->objsubid;
712 if (numobjects >= allocedobjects)
719 objects[numobjects].
object = object;
720 objects[numobjects].
deptype = sdepForm->deptype;
737 foreach(cell, remDeps)
740 if (dep->
dbOid == sdepForm->dbid)
750 dep->
dbOid = sdepForm->dbid;
752 remDeps =
lappend(remDeps, dep);
765 qsort(objects, numobjects,
768 for (
int i = 0;
i < numobjects;
i++)
780 numNotReportedDeps++;
791 foreach(cell, remDeps)
795 object.classId = DatabaseRelationId;
796 object.objectId = dep->
dbOid;
797 object.objectSubId = 0;
818 *detail_msg = *detail_log_msg = NULL;
822 if (numNotReportedDeps > 0)
824 "(see server log for list)",
825 "\nand %d other objects "
826 "(see server log for list)",
829 if (numNotReportedDbs > 0)
831 "(see server log for list)",
832 "\nand objects in %d other databases "
833 "(see server log for list)",
837 *detail_msg = descs.
data;
838 *detail_log_msg = alldescs.
data;
877 Anum_pg_shdepend_dbid,
885 slot_stored_count = 0;
900 if (slot_init_count < max_slots)
908 memset(slot[slot_stored_count]->tts_isnull,
false,
909 slot[slot_stored_count]->tts_tupleDescriptor->natts *
sizeof(
bool));
914 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_classid - 1] = shdep->classid;
915 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objid - 1] = shdep->objid;
916 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objsubid - 1] = shdep->objsubid;
917 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refclassid - 1] = shdep->refclassid;
918 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refobjid - 1] = shdep->refobjid;
919 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_deptype - 1] = shdep->deptype;
925 if (slot_stored_count == max_slots)
928 slot_stored_count = 0;
933 if (slot_stored_count > 0)
942 for (
int i = 0;
i < slot_init_count;
i++)
968 Anum_pg_shdepend_dbid,
1026 Oid refclassId,
Oid refobjId,
1031 bool nulls[Natts_pg_shdepend];
1040 memset(nulls,
false,
sizeof(nulls));
1081 bool drop_subobjects,
1082 Oid refclassId,
Oid refobjId,
1092 Anum_pg_shdepend_dbid,
1096 Anum_pg_shdepend_classid,
1100 Anum_pg_shdepend_objid,
1103 if (drop_subobjects)
1108 Anum_pg_shdepend_objsubid,
1122 if (
OidIsValid(refclassId) && shdepForm->refclassid != refclassId)
1124 if (
OidIsValid(refobjId) && shdepForm->refobjid != refobjId)
1127 shdepForm->deptype != deptype)
1173 case AuthIdRelationId:
1176 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1177 errmsg(
"role %u was concurrently dropped",
1181 case TableSpaceRelationId:
1188 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1189 errmsg(
"tablespace %u was concurrently dropped",
1195 case DatabaseRelationId:
1200 if (database == NULL)
1202 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1203 errmsg(
"database %u was concurrently dropped",
1211 elog(
ERROR,
"unrecognized shared classId: %u", classId);
1242 if (objdesc == NULL)
1246 if (descs->
len != 0)
1262 elog(
ERROR,
"unrecognized dependency type: %d",
1314 foreach(cell, roleids)
1326 obj.
classId = AuthIdRelationId;
1331 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1332 errmsg(
"cannot drop objects owned by %s because they are "
1333 "required by the database system",
1338 Anum_pg_shdepend_refclassid,
1342 Anum_pg_shdepend_refobjid,
1362 switch (sdepForm->deptype)
1366 elog(
ERROR,
"unexpected dependency type");
1378 obj.
classId = sdepForm->classid;
1407 if (sdepForm->classid != AuthMemRelationId)
1424 sdepForm->classid == AuthMemRelationId)
1426 obj.
classId = sdepForm->classid;
1480 foreach(cell, roleids)
1492 obj.
classId = AuthIdRelationId;
1497 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1498 errmsg(
"cannot reassign ownership of objects owned by %s because they are required by the database system",
1508 Anum_pg_shdepend_refclassid,
1512 Anum_pg_shdepend_refobjid,
1545 "shdepReassignOwned",
1550 switch (sdepForm->classid)
1552 case TypeRelationId:
1556 case NamespaceRelationId:
1560 case RelationRelationId:
1570 case DefaultAclRelationId:
1578 case UserMappingRelationId:
1582 case ForeignServerRelationId:
1586 case ForeignDataWrapperRelationId:
1590 case EventTriggerRelationId:
1594 case PublicationRelationId:
1598 case SubscriptionRelationId:
1603 case CollationRelationId:
1604 case ConversionRelationId:
1605 case OperatorRelationId:
1606 case ProcedureRelationId:
1607 case LanguageRelationId:
1608 case LargeObjectRelationId:
1609 case OperatorFamilyRelationId:
1610 case OperatorClassRelationId:
1611 case ExtensionRelationId:
1612 case StatisticExtRelationId:
1613 case TableSpaceRelationId:
1614 case DatabaseRelationId:
1615 case TSConfigRelationId:
1616 case TSDictionaryRelationId:
1618 Oid classId = sdepForm->classid;
1621 if (classId == LargeObjectRelationId)
1622 classId = LargeObjectMetadataRelationId;
1634 elog(
ERROR,
"unexpected classid %u", sdepForm->classid);
void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid)
void AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId)
char * get_tablespace_name(Oid spc_oid)
static Datum values[MAXATTR]
#define ngettext(s, p, n)
#define OidIsValid(objectId)
bool IsPinnedObject(Oid classId, Oid objectId)
bool IsSharedRelation(Oid relationId)
char * get_database_name(Oid dbid)
elog(ERROR, "%s: %s", p2, msg)
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
void sort_object_addresses(ObjectAddresses *addrs)
void AcquireDeletionLock(const ObjectAddress *object, int flags)
void ReleaseDeletionLock(const ObjectAddress *object)
ObjectAddresses * new_object_addresses(void)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
void free_object_addresses(ObjectAddresses *addrs)
@ SHARED_DEPENDENCY_TABLESPACE
@ SHARED_DEPENDENCY_INVALID
@ SHARED_DEPENDENCY_POLICY
@ SHARED_DEPENDENCY_OWNER
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void AlterEventTriggerOwner_oid(Oid trigOid, Oid newOwnerId)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
const TupleTableSlotOps TTSOpsHeapTuple
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void AlterForeignServerOwner_oid(Oid srvId, Oid newOwnerId)
void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
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)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
HeapTuple heap_copytuple(HeapTuple tuple)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTuplesMultiInsertWithInfo(Relation heapRel, TupleTableSlot **slot, int ntuples, CatalogIndexState indstate)
void CatalogCloseIndexes(CatalogIndexState indstate)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
#define MAX_CATALOG_MULTI_INSERT_BYTES
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lappend(List *list, void *datum)
void list_free_deep(List *list)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
#define AccessExclusiveLock
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
void * repalloc(void *pointer, Size size)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define IsBootstrapProcessingMode()
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
#define ObjectAddressSet(addr, class_id, object_id)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static void shdepDropDependency(Relation sdepRel, Oid classId, Oid objectId, int32 objsubId, bool drop_subobjects, Oid refclassId, Oid refobjId, SharedDependencyType deptype)
static int shared_dependency_comparator(const void *a, const void *b)
void dropDatabaseDependencies(Oid databaseId)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
static void getOidListDiff(Oid *list1, int *nlist1, Oid *list2, int *nlist2)
void copyTemplateDependencies(Oid templateDbId, Oid newDbId)
static Oid classIdGetDbId(Oid classId)
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
#define MAX_REPORTED_DEPS
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
bool checkSharedDependencies(Oid classId, Oid objectId, char **detail_msg, char **detail_log_msg)
void recordDependencyOnTablespace(Oid classId, Oid objectId, Oid tablespace)
static void shdepAddDependency(Relation sdepRel, Oid classId, Oid objectId, int32 objsubId, Oid refclassId, Oid refobjId, SharedDependencyType deptype)
void shdepDropOwned(List *roleids, DropBehavior behavior)
static void storeObjectDescription(StringInfo descs, SharedDependencyObjectType type, ObjectAddress *object, SharedDependencyType deptype, int count)
void recordSharedDependencyOn(ObjectAddress *depender, ObjectAddress *referenced, SharedDependencyType deptype)
void shdepLockAndCheckObject(Oid classId, Oid objectId)
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
SharedDependencyObjectType
void shdepReassignOwned(List *roleids, Oid newrole)
static void shdepChangeDep(Relation sdepRel, Oid classid, Oid objid, int32 objsubid, Oid refclassid, Oid refobjid, SharedDependencyType deptype)
FormData_pg_shdepend * Form_pg_shdepend
bool RemoveRoleFromObjectPolicy(Oid roleid, Oid classid, Oid policy_id)
#define qsort(a, b, c, d)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
void AlterPublicationOwner_oid(Oid subid, Oid newOwnerId)
#define RelationGetDescr(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void AlterSchemaOwner_oid(Oid schemaoid, Oid newOwnerId)
#define BTEqualStrategyNumber
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
SharedDependencyObjectType objtype
void AlterSubscriptionOwner_oid(Oid subid, Oid newOwnerId)
#define SearchSysCacheExists1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
void AlterTypeOwner_oid(Oid typeOid, Oid newOwnerId, bool hasDependEntry)
void CommandCounterIncrement(void)