67 #include "utils/fmgroids.h"
89 Oid refclassid,
Oid refobjid,
93 Oid refclassId,
Oid refobjId,
98 Oid refclassId,
Oid refobjId,
173 referenced.
classId = AuthIdRelationId;
204 Oid refclassid,
Oid refobjid,
223 Anum_pg_shdepend_dbid,
227 Anum_pg_shdepend_classid,
231 Anum_pg_shdepend_objid,
235 Anum_pg_shdepend_objsubid,
250 "multiple pg_shdepend entries for object %u/%u/%d deptype %c",
251 classid, objid, objsubid, deptype);
269 shForm->refclassid = refclassid;
270 shForm->refobjid = refobjid;
278 bool nulls[Natts_pg_shdepend];
280 memset(nulls,
false,
sizeof(nulls));
320 classId, objectId, 0,
321 AuthIdRelationId, newOwnerId,
344 AuthIdRelationId, newOwnerId,
387 if (newTablespaceId != DEFAULTTABLESPACE_OID &&
390 classId, objectId, 0,
391 TableSpaceRelationId, newTablespaceId,
395 classId, objectId, 0,
true,
418 in1 = in2 = out1 = out2 = 0;
419 while (in1 < *nlist1 && in2 < *nlist2)
421 if (list1[in1] == list2[in2])
427 else if (list1[in1] < list2[in2])
430 list1[out1++] = list1[in1++];
435 list2[out2++] = list2[in2++];
440 while (in1 < *nlist1)
442 list1[out1++] = list1[in1++];
446 while (in2 < *nlist2)
448 list2[out2++] = list2[in2++];
483 int noldmembers,
Oid *oldmembers,
484 int nnewmembers,
Oid *newmembers)
495 getOidListDiff(oldmembers, &noldmembers, newmembers, &nnewmembers);
497 if (noldmembers > 0 || nnewmembers > 0)
502 for (
i = 0;
i < nnewmembers;
i++)
504 Oid roleid = newmembers[
i];
511 if (roleid == ownerId)
519 AuthIdRelationId, roleid,
524 for (
i = 0;
i < noldmembers;
i++)
526 Oid roleid = oldmembers[
i];
529 if (roleid == ownerId)
538 AuthIdRelationId, roleid,
631 char **detail_msg,
char **detail_log_msg)
637 int numReportedDeps = 0;
638 int numNotReportedDeps = 0;
639 int numNotReportedDbs = 0;
652 object.classId = classId;
653 object.objectId = objectId;
654 object.objectSubId = 0;
656 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
657 errmsg(
"cannot drop %s because it is required by the database system",
670 #define MAX_REPORTED_DEPS 100
672 allocedobjects = 128;
682 Anum_pg_shdepend_refclassid,
686 Anum_pg_shdepend_refobjid,
697 object.classId = sdepForm->classid;
698 object.objectId = sdepForm->objid;
699 object.objectSubId = sdepForm->objsubid;
711 if (numobjects >= allocedobjects)
718 objects[numobjects].
object = object;
719 objects[numobjects].
deptype = sdepForm->deptype;
736 foreach(cell, remDeps)
739 if (dep->
dbOid == sdepForm->dbid)
749 dep->
dbOid = sdepForm->dbid;
751 remDeps =
lappend(remDeps, dep);
764 qsort((
void *) objects, numobjects,
767 for (
int i = 0;
i < numobjects;
i++)
779 numNotReportedDeps++;
790 foreach(cell, remDeps)
794 object.classId = DatabaseRelationId;
795 object.objectId = dep->
dbOid;
796 object.objectSubId = 0;
817 *detail_msg = *detail_log_msg = NULL;
821 if (numNotReportedDeps > 0)
823 "(see server log for list)",
824 "\nand %d other objects "
825 "(see server log for list)",
828 if (numNotReportedDbs > 0)
830 "(see server log for list)",
831 "\nand objects in %d other databases "
832 "(see server log for list)",
836 *detail_msg = descs.
data;
837 *detail_log_msg = alldescs.
data;
876 Anum_pg_shdepend_dbid,
884 slot_stored_count = 0;
899 if (slot_init_count < max_slots)
907 memset(slot[slot_stored_count]->tts_isnull,
false,
908 slot[slot_stored_count]->tts_tupleDescriptor->natts *
sizeof(
bool));
913 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_classid - 1] = shdep->classid;
914 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objid - 1] = shdep->objid;
915 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_objsubid - 1] = shdep->objsubid;
916 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refclassid - 1] = shdep->refclassid;
917 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_refobjid - 1] = shdep->refobjid;
918 slot[slot_stored_count]->
tts_values[Anum_pg_shdepend_deptype - 1] = 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));
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:
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);
1241 if (objdesc == NULL)
1245 if (descs->
len != 0)
1261 elog(
ERROR,
"unrecognized dependency type: %d",
1313 foreach(cell, roleids)
1325 obj.
classId = AuthIdRelationId;
1330 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1331 errmsg(
"cannot drop objects owned by %s because they are "
1332 "required by the database system",
1337 Anum_pg_shdepend_refclassid,
1341 Anum_pg_shdepend_refobjid,
1361 switch (sdepForm->deptype)
1365 elog(
ERROR,
"unexpected dependency type");
1382 obj.
classId = sdepForm->classid;
1405 obj.
classId = sdepForm->classid;
1459 foreach(cell, roleids)
1471 obj.
classId = AuthIdRelationId;
1476 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
1477 errmsg(
"cannot reassign ownership of objects owned by %s because they are required by the database system",
1487 Anum_pg_shdepend_refclassid,
1491 Anum_pg_shdepend_refobjid,
1524 "shdepReassignOwned",
1529 switch (sdepForm->classid)
1531 case TypeRelationId:
1535 case NamespaceRelationId:
1539 case RelationRelationId:
1549 case DefaultAclRelationId:
1557 case UserMappingRelationId:
1561 case ForeignServerRelationId:
1565 case ForeignDataWrapperRelationId:
1569 case EventTriggerRelationId:
1573 case PublicationRelationId:
1577 case SubscriptionRelationId:
1582 case CollationRelationId:
1583 case ConversionRelationId:
1584 case OperatorRelationId:
1585 case ProcedureRelationId:
1586 case LanguageRelationId:
1587 case LargeObjectRelationId:
1588 case OperatorFamilyRelationId:
1589 case OperatorClassRelationId:
1590 case ExtensionRelationId:
1591 case StatisticExtRelationId:
1592 case TableSpaceRelationId:
1593 case DatabaseRelationId:
1594 case TSConfigRelationId:
1595 case TSDictionaryRelationId:
1597 Oid classId = sdepForm->classid;
1600 if (classId == LargeObjectRelationId)
1601 classId = LargeObjectMetadataRelationId;
1613 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)
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)
#define ObjectIdGetDatum(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 oid, 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)