29#include "utils/fmgroids.h"
89 max_slots =
Min(nreferenced,
97 slot_stored_count = 0;
100 for (
i = 0;
i < nreferenced;
i++, referenced++)
110 if (slot_init_count < max_slots)
131 memset(slot[slot_stored_count]->tts_isnull,
false,
132 slot[slot_stored_count]->tts_tupleDescriptor->natts *
sizeof(
bool));
138 if (slot_stored_count == max_slots)
141 if (indstate == NULL)
146 slot_stored_count = 0;
151 if (slot_stored_count > 0)
154 if (indstate == NULL)
161 if (indstate != NULL)
167 for (
i = 0;
i < slot_init_count;
i++)
222 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
223 errmsg(
"%s is already a member of extension \"%s\"",
229 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
230 errmsg(
"%s is not a member of extension \"%s\"",
233 errdetail(
"An extension is not allowed to replace an object that it does not own.")));
237 extension.
classId = ExtensionRelationId;
280 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
281 errmsg(
"%s is not a member of extension \"%s\"",
284 errdetail(
"An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns.")));
302 bool skipExtensionDeps)
313 Anum_pg_depend_classid,
317 Anum_pg_depend_objid,
326 if (skipExtensionDeps &&
352 Oid refclassId,
char deptype)
363 Anum_pg_depend_classid,
367 Anum_pg_depend_objid,
378 if (depform->refclassid == refclassId && depform->deptype == deptype)
399 Oid refclassId,
Oid refobjectId)
410 Anum_pg_depend_classid,
414 Anum_pg_depend_objid,
425 if (depform->refclassid == refclassId &&
426 depform->refobjid == refobjectId &&
427 depform->deptype == deptype)
458 Oid refClassId,
Oid oldRefObjectId,
512 Anum_pg_depend_classid,
516 Anum_pg_depend_objid,
527 if (depform->refclassid == refClassId &&
528 depform->refobjid == oldRefObjectId)
538 depform->refobjid = newRefObjectId;
577 Anum_pg_depend_classid,
581 Anum_pg_depend_objid,
596 depform->objid = newObjectId;
646 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
647 errmsg(
"cannot remove dependency on %s because it is a system object",
660 Anum_pg_depend_refclassid,
664 Anum_pg_depend_refobjid,
683 depform->refobjid = newRefObjectId;
743 Anum_pg_depend_classid,
747 Anum_pg_depend_objid,
758 if (depform->refclassid == ExtensionRelationId &&
761 result = depform->refobjid;
789 Anum_pg_depend_classid,
793 Anum_pg_depend_objid,
804 if (depform->refclassid == ExtensionRelationId &&
839 Anum_pg_depend_classid,
843 Anum_pg_depend_objid,
854 if (depform->refclassid == RelationRelationId &&
855 depform->deptype == deptype)
857 *tableId = depform->refobjid;
858 *colId = depform->refobjsubid;
888 Anum_pg_depend_refclassid,
892 Anum_pg_depend_refobjid,
897 Anum_pg_depend_refobjsubid,
913 if (deprec->classid == RelationRelationId &&
914 deprec->objsubid == 0 &&
915 deprec->refobjsubid != 0 &&
919 if (!deptype || deprec->deptype == deptype)
962 elog(
ERROR,
"cache lookup failed for attribute \"%s\" of relation %u",
969 elog(
ERROR,
"more than one owned sequence found");
970 else if (seqlist ==
NIL)
1000 Anum_pg_depend_classid,
1004 Anum_pg_depend_objid,
1008 Anum_pg_depend_objsubid,
1023 if (deprec->refclassid == ConstraintRelationId &&
1024 deprec->refobjsubid == 0 &&
1027 constraintId = deprec->refobjid;
1035 return constraintId;
1056 Anum_pg_depend_refclassid,
1060 Anum_pg_depend_refobjid,
1064 Anum_pg_depend_refobjsubid,
1079 if (deprec->classid == ConstraintRelationId &&
1080 deprec->objsubid == 0 &&
#define InvalidAttrNumber
#define Assert(condition)
#define OidIsValid(objectId)
bool IsPinnedObject(Oid classId, Oid objectId)
@ DEPENDENCY_AUTO_EXTENSION
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
const TupleTableSlotOps TTSOpsHeapTuple
Oid CurrentExtensionObject
char * get_extension_name(Oid ext_oid)
void systable_endscan(SysScanDesc sysscan)
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)
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)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
#define MAX_CATALOG_MULTI_INSERT_BYTES
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
AttrNumber get_attnum(Oid relid, const char *attname)
char get_rel_relkind(Oid relid)
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
void pfree(void *pointer)
#define IsBootstrapProcessingMode()
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
List * get_partition_ancestors(Oid relid)
void checkMembershipInCurrentExtension(const ObjectAddress *object)
void recordMultipleDependencies(const ObjectAddress *depender, const ObjectAddress *referenced, int nreferenced, DependencyType behavior)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
static bool isObjectPinned(const ObjectAddress *object)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
Oid getExtensionOfObject(Oid classId, Oid objectId)
long changeDependenciesOf(Oid classId, Oid oldObjectId, Oid newObjectId)
List * get_index_ref_constraints(Oid indexId)
List * getOwnedSequences(Oid relid)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId, char deptype, Oid refclassId, Oid refobjectId)
long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
static List * getOwnedSequences_internal(Oid relid, AttrNumber attnum, char deptype)
Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok)
Oid get_index_constraint(Oid indexId)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
List * getAutoExtensionsOfObject(Oid classId, Oid objectId)
FormData_pg_depend * Form_pg_depend
static int list_length(const List *l)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
#define RelationGetDescr(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define BTEqualStrategyNumber
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)