33 #include "utils/fmgroids.h" 51 Oid constraintNamespace,
58 const int16 *constraintKey,
60 int constraintNTotalKeys,
64 const int16 *foreignKey,
69 char foreignUpdateType,
70 char foreignDeleteType,
71 char foreignMatchType,
83 bool nulls[Natts_pg_constraint];
105 if (constraintNKeys > 0)
110 for (i = 0; i < constraintNKeys; i++)
113 INT2OID, 2,
true, TYPALIGN_SHORT);
118 if (foreignNKeys > 0)
123 for (i = 0; i < foreignNKeys; i++)
126 INT2OID, 2,
true, TYPALIGN_SHORT);
127 for (i = 0; i < foreignNKeys; i++)
130 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
131 for (i = 0; i < foreignNKeys; i++)
134 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
135 for (i = 0; i < foreignNKeys; i++)
138 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
143 conpfeqopArray = NULL;
144 conppeqopArray = NULL;
145 conffeqopArray = NULL;
153 for (i = 0; i < constraintNKeys; i++)
156 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
159 conexclopArray = NULL;
162 for (i = 0; i < Natts_pg_constraint; i++)
169 Anum_pg_constraint_oid);
171 values[Anum_pg_constraint_conname - 1] =
NameGetDatum(&cname);
172 values[Anum_pg_constraint_connamespace - 1] =
ObjectIdGetDatum(constraintNamespace);
173 values[Anum_pg_constraint_contype - 1] =
CharGetDatum(constraintType);
174 values[Anum_pg_constraint_condeferrable - 1] =
BoolGetDatum(isDeferrable);
175 values[Anum_pg_constraint_condeferred - 1] =
BoolGetDatum(isDeferred);
176 values[Anum_pg_constraint_convalidated - 1] =
BoolGetDatum(isValidated);
180 values[Anum_pg_constraint_conparentid - 1] =
ObjectIdGetDatum(parentConstrId);
182 values[Anum_pg_constraint_confupdtype - 1] =
CharGetDatum(foreignUpdateType);
183 values[Anum_pg_constraint_confdeltype - 1] =
CharGetDatum(foreignDeleteType);
184 values[Anum_pg_constraint_confmatchtype - 1] =
CharGetDatum(foreignMatchType);
185 values[Anum_pg_constraint_conislocal - 1] =
BoolGetDatum(conIsLocal);
186 values[Anum_pg_constraint_coninhcount - 1] =
Int32GetDatum(conInhCount);
187 values[Anum_pg_constraint_connoinherit - 1] =
BoolGetDatum(conNoInherit);
192 nulls[Anum_pg_constraint_conkey - 1] =
true;
195 values[Anum_pg_constraint_confkey - 1] =
PointerGetDatum(confkeyArray);
197 nulls[Anum_pg_constraint_confkey - 1] =
true;
200 values[Anum_pg_constraint_conpfeqop - 1] =
PointerGetDatum(conpfeqopArray);
202 nulls[Anum_pg_constraint_conpfeqop - 1] =
true;
205 values[Anum_pg_constraint_conppeqop - 1] =
PointerGetDatum(conppeqopArray);
207 nulls[Anum_pg_constraint_conppeqop - 1] =
true;
210 values[Anum_pg_constraint_conffeqop - 1] =
PointerGetDatum(conffeqopArray);
212 nulls[Anum_pg_constraint_conffeqop - 1] =
true;
215 values[Anum_pg_constraint_conexclop - 1] =
PointerGetDatum(conexclopArray);
217 nulls[Anum_pg_constraint_conexclop - 1] =
true;
222 nulls[Anum_pg_constraint_conbin - 1] =
true;
243 if (constraintNTotalKeys > 0)
245 for (i = 0; i < constraintNTotalKeys; i++)
285 if (foreignNKeys > 0)
287 for (i = 0; i < foreignNKeys; i++)
290 foreignRelId, foreignKey[i]);
301 if (
OidIsValid(indexRelId) && constraintType == CONSTRAINT_FOREIGN)
315 if (foreignNKeys > 0)
325 oprobject.
classId = OperatorRelationId;
328 for (i = 0; i < foreignNKeys; i++)
332 if (ppEqOp[i] != pfEqOp[i])
337 if (ffEqOp[i] != pfEqOp[i])
399 Anum_pg_constraint_conrelid,
404 Anum_pg_constraint_contypid,
407 ? objId : InvalidOid));
409 Anum_pg_constraint_conname,
414 true, NULL, 3, skey);
443 Anum_pg_constraint_conname,
448 Anum_pg_constraint_connamespace,
492 char *conname = NULL;
503 strlcpy(modlabel, label,
sizeof(modlabel));
513 if (strcmp((
char *)
lfirst(l), conname) == 0)
523 Anum_pg_constraint_conname,
528 Anum_pg_constraint_connamespace,
545 snprintf(modlabel,
sizeof(modlabel),
"%s%d", label, ++pass);
567 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
588 if (con->contype == CONSTRAINT_CHECK)
598 elog(
ERROR,
"cache lookup failed for relation %u",
602 if (classForm->relchecks == 0)
603 elog(
ERROR,
"relation \"%s\" has relchecks = 0",
605 classForm->relchecks--;
627 elog(
ERROR,
"constraint %u is not of a known type", conId);
658 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
670 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
678 errmsg(
"constraint \"%s\" for domain %s already exists",
711 Anum_pg_constraint_conrelid,
715 Anum_pg_constraint_contypid,
733 if (conform->connamespace == oldNspId && oldNspId != newNspId)
738 conform->connamespace = newNspId;
783 elog(
ERROR,
"cache lookup failed for constraint %u", childConstrId);
789 Assert(constrForm->coninhcount == 0);
791 elog(
ERROR,
"constraint %u already has a parent constraint",
794 constrForm->conislocal =
false;
795 constrForm->coninhcount++;
796 constrForm->conparentid = parentConstrId;
810 constrForm->coninhcount--;
811 constrForm->conislocal =
true;
815 Assert(constrForm->coninhcount == 0);
820 ConstraintRelationId,
849 Anum_pg_constraint_conrelid,
853 Anum_pg_constraint_contypid,
857 Anum_pg_constraint_conname,
873 (
errcode(ERRCODE_UNDEFINED_OBJECT),
874 errmsg(
"constraint \"%s\" for table \"%s\" does not exist",
896 bool missing_ok,
Oid *constraintOid)
910 Anum_pg_constraint_conrelid,
914 Anum_pg_constraint_contypid,
918 Anum_pg_constraint_conname,
949 elog(
ERROR,
"conkey is not a 1-D smallint array");
953 for (i = 0; i < numcols; i++)
964 if (!
OidIsValid(*constraintOid) && !missing_ok)
966 (
errcode(ERRCODE_UNDEFINED_OBJECT),
967 errmsg(
"constraint \"%s\" for table \"%s\" does not exist",
991 Anum_pg_constraint_conrelid,
996 true, NULL, 1, &key);
1002 if (constrForm->conindid == indexId)
1004 constraintId = constrForm->oid;
1011 return constraintId;
1031 Anum_pg_constraint_conrelid,
1035 Anum_pg_constraint_contypid,
1039 Anum_pg_constraint_conname,
1055 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1056 errmsg(
"constraint \"%s\" for domain %s does not exist",
1094 Anum_pg_constraint_conrelid,
1112 if (con->contype != CONSTRAINT_PRIMARY)
1120 if (con->condeferrable && !deferrableOk)
1124 adatum =
heap_getattr(tuple, Anum_pg_constraint_conkey,
1127 elog(
ERROR,
"null conkey for constraint %u",
1135 elog(
ERROR,
"conkey is not a 1-D smallint array");
1139 for (i = 0; i < numkeys; i++)
1166 Oid *pf_eq_oprs,
Oid *pp_eq_oprs,
Oid *ff_eq_oprs)
1182 Anum_pg_constraint_conkey, &isNull);
1184 elog(
ERROR,
"null conkey for constraint %u", constrId);
1189 elog(
ERROR,
"conkey is not a 1-D smallint array");
1192 elog(
ERROR,
"foreign key constraint cannot have %d columns", numkeys);
1198 Anum_pg_constraint_confkey, &isNull);
1200 elog(
ERROR,
"null confkey for constraint %u", constrId);
1206 elog(
ERROR,
"confkey is not a 1-D smallint array");
1214 Anum_pg_constraint_conpfeqop, &isNull);
1216 elog(
ERROR,
"null conpfeqop for constraint %u", constrId);
1223 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
1232 Anum_pg_constraint_conppeqop, &isNull);
1234 elog(
ERROR,
"null conppeqop for constraint %u", constrId);
1240 elog(
ERROR,
"conppeqop is not a 1-D Oid array");
1249 Anum_pg_constraint_conffeqop, &isNull);
1251 elog(
ERROR,
"null conffeqop for constraint %u", constrId);
1257 elog(
ERROR,
"conffeqop is not a 1-D Oid array");
1284 List *grouping_columns,
1285 List **constraintDeps)
1294 if (pkattnos == NULL)
1298 groupbyattnos = NULL;
1299 foreach(gl, grouping_columns)
1304 gvar->
varno == varno &&
1313 *constraintDeps =
lappend_oid(*constraintDeps, constraintOid);
bool check_functional_grouping(Oid relid, Index varno, Index varlevelsup, List *grouping_columns, List **constraintDeps)
HeapTuple heap_copytuple(HeapTuple tuple)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
char * ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others)
Bitmapset * get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
#define IsA(nodeptr, _type_)
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname)
void table_close(Relation relation, LOCKMODE lockmode)
Oid get_relation_idx_constraint_oid(Oid relationId, Oid indexId)
void systable_endscan(SysScanDesc sysscan)
#define ConstraintNameNspIndexId
#define RelationGetDescr(relation)
void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs)
void namestrcpy(Name name, const char *str)
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
#define PointerGetDatum(X)
Oid CreateConstraintEntry(const char *constraintName, Oid constraintNamespace, char constraintType, bool isDeferrable, bool isDeferred, bool isValidated, Oid parentConstrId, Oid relId, const int16 *constraintKey, int constraintNKeys, int constraintNTotalKeys, Oid domainId, Oid indexRelId, Oid foreignRelId, const int16 *foreignKey, const Oid *pfEqOp, const Oid *ppEqOp, const Oid *ffEqOp, int foreignNKeys, char foreignUpdateType, char foreignDeleteType, char foreignMatchType, const Oid *exclOp, Node *conExpr, const char *conBin, bool conIsLocal, int conInhCount, bool conNoInherit, bool is_internal)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
int errcode(int sqlerrcode)
#define FirstLowInvalidHeapAttributeNumber
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
bool ConstraintNameExists(const char *conname, Oid namespaceid)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
void heap_freetuple(HeapTuple htup)
List * lappend_oid(List *list, Oid datum)
#define OidIsValid(objectId)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
void RenameConstraintById(Oid conId, const char *newname)
char * makeObjectName(const char *name1, const char *name2, const char *label)
HeapTuple systable_getnext(SysScanDesc sysscan)
void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved)
void pfree(void *pointer)
#define ObjectIdGetDatum(X)
#define ConstraintRelidTypidNameIndexId
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self, bool record_version)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
#define ConstraintOidIndexId
Bitmapset * get_relation_constraint_attnos(Oid relid, const char *conname, bool missing_ok, Oid *constraintOid)
#define CStringGetDatum(X)
#define RelationGetRelationName(relation)
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
void ConstraintSetParentConstraint(Oid childConstrId, Oid parentConstrId, Oid childTableId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define heap_getattr(tup, attnum, tupleDesc, isnull)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
void ReleaseSysCache(HeapTuple tuple)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
#define InvokeObjectPostCreateHookArg(classId, objectId, subId, is_internal)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
#define ereport(elevel,...)
size_t strlcpy(char *dst, const char *src, size_t siz)
FormData_pg_constraint * Form_pg_constraint
#define HeapTupleIsValid(tuple)
#define Assert(condition)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
Bitmapset * bms_add_member(Bitmapset *a, int x)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
#define ObjectAddressSet(addr, class_id, object_id)
#define DatumGetPointer(X)
static Datum values[MAXATTR]
FormData_pg_class * Form_pg_class
#define SearchSysCacheCopy1(cacheId, key1)
#define AccessExclusiveLock
int errmsg(const char *fmt,...)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define CStringGetTextDatum(s)
Relation table_open(Oid relationId, LOCKMODE lockmode)
#define ERRCODE_DUPLICATE_OBJECT
char * get_rel_name(Oid relid)
void RemoveConstraintById(Oid conId)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
#define BTEqualStrategyNumber
#define DatumGetArrayTypeP(X)