63 #include "utils/fmgroids.h"
85 Oid refclassid,
Oid refobjid,
89 Oid refclassId,
Oid refobjId,
94 Oid refclassId,
Oid refobjId,
169 referenced.
classId = AuthIdRelationId;
200 Oid refclassid,
Oid refobjid,
219 Anum_pg_shdepend_dbid,
223 Anum_pg_shdepend_classid,
227 Anum_pg_shdepend_objid,
231 Anum_pg_shdepend_objsubid,
246 "multiple pg_shdepend entries for object %u/%u/%d deptype %c",
247 classid, objid, objsubid, deptype);
265 shForm->refclassid = refclassid;
266 shForm->refobjid = refobjid;
274 bool nulls[Natts_pg_shdepend];
276 memset(nulls,
false,
sizeof(nulls));
316 classId, objectId, 0,
317 AuthIdRelationId, newOwnerId,
340 AuthIdRelationId, newOwnerId,
383 if (newTablespaceId != DEFAULTTABLESPACE_OID &&
386 classId, objectId, 0,
387 TableSpaceRelationId, newTablespaceId,
391 classId, objectId, 0,
true,
414 in1 = in2 = out1 = out2 = 0;
415 while (in1 < *nlist1 && in2 < *nlist2)
417 if (list1[in1] == list2[in2])
423 else if (list1[in1] < list2[in2])
426 list1[out1++] = list1[in1++];
431 list2[out2++] = list2[in2++];
436 while (in1 < *nlist1)
438 list1[out1++] = list1[in1++];
442 while (in2 < *nlist2)
444 list2[out2++] = list2[in2++];
479 int noldmembers,
Oid *oldmembers,
480 int nnewmembers,
Oid *newmembers)
491 getOidListDiff(oldmembers, &noldmembers, newmembers, &nnewmembers);
493 if (noldmembers > 0 || nnewmembers > 0)
498 for (
i = 0;
i < nnewmembers;
i++)
500 Oid roleid = newmembers[
i];
507 if (roleid == ownerId)
515 AuthIdRelationId, roleid,
520 for (
i = 0;
i < noldmembers;
i++)
522 Oid roleid = oldmembers[
i];
525 if (roleid == ownerId)
534 AuthIdRelationId, roleid,
627 char **detail_msg,
char **detail_log_msg)
633 int numReportedDeps = 0;
634 int numNotReportedDeps = 0;
635 int numNotReportedDbs = 0;
648 object.classId = classId;
649 object.objectId = objectId;
650 object.objectSubId = 0;
652 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
653 errmsg(
"cannot drop %s because it is required by the database system",
666 #define MAX_REPORTED_DEPS 100
668 allocedobjects = 128;
678 Anum_pg_shdepend_refclassid,
682 Anum_pg_shdepend_refobjid,
693 object.classId = sdepForm->classid;
694 object.objectId = sdepForm->objid;
695 object.objectSubId = sdepForm->objsubid;
707 if (numobjects >= allocedobjects)
714 objects[numobjects].
object = object;
715 objects[numobjects].
deptype = sdepForm->deptype;
732 foreach(cell, remDeps)
735 if (dep->
dbOid == sdepForm->dbid)
745 dep->
dbOid = sdepForm->dbid;
747 remDeps =
lappend(remDeps, dep);
760 qsort(objects, numobjects,
763 for (
int i = 0;
i < numobjects;
i++)
775 numNotReportedDeps++;
786 foreach(cell, remDeps)
790 object.classId = DatabaseRelationId;
791 object.objectId = dep->
dbOid;
792 object.objectSubId = 0;
813 *detail_msg = *detail_log_msg = NULL;
817 if (numNotReportedDeps > 0)
819 "(see server log for list)",
820 "\nand %d other objects "
821 "(see server log for list)",
824 if (numNotReportedDbs > 0)
826 "(see server log for list)",
827 "\nand objects in %d other databases "
828 "(see server log for list)",
832 *detail_msg = descs.
data;
833 *detail_log_msg = alldescs.
data;
872 Anum_pg_shdepend_dbid,
880 slot_stored_count = 0;
895 if (slot_init_count < max_slots)
903 memset(slot[slot_stored_count]->tts_isnull,
false,
904 slot[slot_stored_count]->tts_tupleDescriptor->natts *
sizeof(
bool));
909 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_classid - 1] = shdep->classid;
910 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objid - 1] = shdep->objid;
911 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objsubid - 1] = shdep->objsubid;
912 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refclassid - 1] = shdep->refclassid;
913 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refobjid - 1] = shdep->refobjid;
914 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_deptype - 1] = shdep->deptype;
920 if (slot_stored_count == max_slots)
923 slot_stored_count = 0;
928 if (slot_stored_count > 0)
937 for (
int i = 0;
i < slot_init_count;
i++)
963 Anum_pg_shdepend_dbid,
1021 Oid refclassId,
Oid refobjId,
1026 bool nulls[Natts_pg_shdepend];
1035 memset(nulls,
false,
sizeof(nulls));
1076 bool drop_subobjects,
1077 Oid refclassId,
Oid refobjId,
1087 Anum_pg_shdepend_dbid,
1091 Anum_pg_shdepend_classid,
1095 Anum_pg_shdepend_objid,
1098 if (drop_subobjects)
1103 Anum_pg_shdepend_objsubid,
1117 if (
OidIsValid(refclassId) && shdepForm->refclassid != refclassId)
1119 if (
OidIsValid(refobjId) && shdepForm->refobjid != refobjId)
1122 shdepForm->deptype != deptype)
1168 case AuthIdRelationId:
1171 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1172 errmsg(
"role %u was concurrently dropped",
1176 case TableSpaceRelationId:
1183 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1184 errmsg(
"tablespace %u was concurrently dropped",
1190 case DatabaseRelationId:
1195 if (database == NULL)
1197 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1198 errmsg(
"database %u was concurrently dropped",
1206 elog(
ERROR,
"unrecognized shared classId: %u", classId);
1237 if (objdesc == NULL)
1241 if (descs->
len != 0)
1257 elog(
ERROR,
"unrecognized dependency type: %d",
1309 foreach(cell, roleids)
1321 obj.
classId = AuthIdRelationId;
1326 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1327 errmsg(
"cannot drop objects owned by %s because they are "
1328 "required by the database system",
1333 Anum_pg_shdepend_refclassid,
1337 Anum_pg_shdepend_refobjid,
1357 switch (sdepForm->deptype)
1361 elog(
ERROR,
"unexpected dependency type");
1373 obj.
classId = sdepForm->classid;
1402 if (sdepForm->classid != AuthMemRelationId)
1419 sdepForm->classid == AuthMemRelationId)
1421 obj.
classId = sdepForm->classid;
1475 foreach(cell, roleids)
1487 obj.
classId = AuthIdRelationId;
1492 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1493 errmsg(
"cannot reassign ownership of objects owned by %s because they are required by the database system",
1503 Anum_pg_shdepend_refclassid,
1507 Anum_pg_shdepend_refobjid,
1540 "shdepReassignOwned",
1545 switch (sdepForm->classid)
1547 case TypeRelationId:
1551 case NamespaceRelationId:
1555 case RelationRelationId:
1565 case DefaultAclRelationId:
1573 case UserMappingRelationId:
1577 case ForeignServerRelationId:
1581 case ForeignDataWrapperRelationId:
1585 case EventTriggerRelationId:
1589 case PublicationRelationId:
1593 case SubscriptionRelationId:
1598 case CollationRelationId:
1599 case ConversionRelationId:
1600 case OperatorRelationId:
1601 case ProcedureRelationId:
1602 case LanguageRelationId:
1603 case LargeObjectRelationId:
1604 case OperatorFamilyRelationId:
1605 case OperatorClassRelationId:
1606 case ExtensionRelationId:
1607 case StatisticExtRelationId:
1608 case TableSpaceRelationId:
1609 case DatabaseRelationId:
1610 case TSConfigRelationId:
1611 case TSDictionaryRelationId:
1618 elog(
ERROR,
"unexpected classid %u", sdepForm->classid);
void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid)
void AlterObjectOwner_internal(Oid classId, Oid objectId, Oid new_ownerId)
char * get_tablespace_name(Oid spc_oid)
static Datum values[MAXATTR]
#define ngettext(s, p, n)
#define Assert(condition)
#define OidIsValid(objectId)
bool IsPinnedObject(Oid classId, Oid objectId)
bool IsSharedRelation(Oid relationId)
char * get_database_name(Oid dbid)
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_copytuple(HeapTuple tuple)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
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
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 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)
MemoryContextSwitchTo(old_ctx)
#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)