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 const int16 *fkDeleteSetCols,
72 int numFkDeleteSetCols,
73 char foreignMatchType,
85 bool nulls[Natts_pg_constraint];
108 if (constraintNKeys > 0)
113 for (
i = 0;
i < constraintNKeys;
i++)
116 INT2OID, 2,
true, TYPALIGN_SHORT);
121 if (foreignNKeys > 0)
126 for (
i = 0;
i < foreignNKeys;
i++)
129 INT2OID, 2,
true, TYPALIGN_SHORT);
130 for (
i = 0;
i < foreignNKeys;
i++)
133 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
134 for (
i = 0;
i < foreignNKeys;
i++)
137 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
138 for (
i = 0;
i < foreignNKeys;
i++)
141 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
143 if (numFkDeleteSetCols > 0)
145 for (
i = 0;
i < numFkDeleteSetCols;
i++)
148 INT2OID, 2,
true, TYPALIGN_SHORT);
151 confdelsetcolsArray = NULL;
156 conpfeqopArray = NULL;
157 conppeqopArray = NULL;
158 conffeqopArray = NULL;
159 confdelsetcolsArray = NULL;
167 for (
i = 0;
i < constraintNKeys;
i++)
170 OIDOID,
sizeof(
Oid),
true, TYPALIGN_INT);
173 conexclopArray = NULL;
176 for (
i = 0;
i < Natts_pg_constraint;
i++)
183 Anum_pg_constraint_oid);
206 nulls[Anum_pg_constraint_conkey - 1] =
true;
211 nulls[Anum_pg_constraint_confkey - 1] =
true;
216 nulls[Anum_pg_constraint_conpfeqop - 1] =
true;
221 nulls[Anum_pg_constraint_conppeqop - 1] =
true;
226 nulls[Anum_pg_constraint_conffeqop - 1] =
true;
228 if (confdelsetcolsArray)
231 nulls[Anum_pg_constraint_confdelsetcols - 1] =
true;
236 nulls[Anum_pg_constraint_conexclop - 1] =
true;
241 nulls[Anum_pg_constraint_conbin - 1] =
true;
262 if (constraintNTotalKeys > 0)
264 for (
i = 0;
i < constraintNTotalKeys;
i++)
304 if (foreignNKeys > 0)
306 for (
i = 0;
i < foreignNKeys;
i++)
309 foreignRelId, foreignKey[
i]);
320 if (
OidIsValid(indexRelId) && constraintType == CONSTRAINT_FOREIGN)
334 if (foreignNKeys > 0)
344 oprobject.
classId = OperatorRelationId;
347 for (
i = 0;
i < foreignNKeys;
i++)
351 if (ppEqOp[
i] != pfEqOp[
i])
356 if (ffEqOp[
i] != pfEqOp[
i])
418 Anum_pg_constraint_conrelid,
423 Anum_pg_constraint_contypid,
428 Anum_pg_constraint_conname,
433 true, NULL, 3, skey);
462 Anum_pg_constraint_conname,
467 Anum_pg_constraint_connamespace,
511 char *conname = NULL;
532 if (strcmp((
char *)
lfirst(l), conname) == 0)
542 Anum_pg_constraint_conname,
547 Anum_pg_constraint_connamespace,
586 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
607 if (con->contype == CONSTRAINT_CHECK)
617 elog(
ERROR,
"cache lookup failed for relation %u",
621 if (classForm->relchecks == 0)
622 elog(
ERROR,
"relation \"%s\" has relchecks = 0",
624 classForm->relchecks--;
646 elog(
ERROR,
"constraint %u is not of a known type", conId);
677 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
689 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
697 errmsg(
"constraint \"%s\" for domain %s already exists",
730 Anum_pg_constraint_conrelid,
734 Anum_pg_constraint_contypid,
752 if (conform->connamespace == oldNspId && oldNspId != newNspId)
757 conform->connamespace = newNspId;
802 elog(
ERROR,
"cache lookup failed for constraint %u", childConstrId);
808 Assert(constrForm->coninhcount == 0);
810 elog(
ERROR,
"constraint %u already has a parent constraint",
813 constrForm->conislocal =
false;
814 constrForm->coninhcount++;
815 constrForm->conparentid = parentConstrId;
829 constrForm->coninhcount--;
830 constrForm->conislocal =
true;
834 Assert(constrForm->coninhcount == 0);
839 ConstraintRelationId,
868 Anum_pg_constraint_conrelid,
872 Anum_pg_constraint_contypid,
876 Anum_pg_constraint_conname,
892 (
errcode(ERRCODE_UNDEFINED_OBJECT),
893 errmsg(
"constraint \"%s\" for table \"%s\" does not exist",
915 bool missing_ok,
Oid *constraintOid)
929 Anum_pg_constraint_conrelid,
933 Anum_pg_constraint_contypid,
937 Anum_pg_constraint_conname,
968 elog(
ERROR,
"conkey is not a 1-D smallint array");
972 for (
i = 0;
i < numcols;
i++)
983 if (!
OidIsValid(*constraintOid) && !missing_ok)
985 (
errcode(ERRCODE_UNDEFINED_OBJECT),
986 errmsg(
"constraint \"%s\" for table \"%s\" does not exist",
1010 Anum_pg_constraint_conrelid,
1015 true, NULL, 1, &
key);
1021 if (constrForm->conindid == indexId)
1023 constraintId = constrForm->oid;
1030 return constraintId;
1050 Anum_pg_constraint_conrelid,
1054 Anum_pg_constraint_contypid,
1058 Anum_pg_constraint_conname,
1074 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1075 errmsg(
"constraint \"%s\" for domain %s does not exist",
1113 Anum_pg_constraint_conrelid,
1131 if (con->contype != CONSTRAINT_PRIMARY)
1139 if (con->condeferrable && !deferrableOk)
1143 adatum =
heap_getattr(tuple, Anum_pg_constraint_conkey,
1146 elog(
ERROR,
"null conkey for constraint %u",
1154 elog(
ERROR,
"conkey is not a 1-D smallint array");
1158 for (
i = 0;
i < numkeys;
i++)
1186 Oid *pf_eq_oprs,
Oid *pp_eq_oprs,
Oid *ff_eq_oprs,
1187 int *num_fk_del_set_cols,
AttrNumber *fk_del_set_cols)
1203 Anum_pg_constraint_conkey, &isNull);
1205 elog(
ERROR,
"null conkey for constraint %u", constrId);
1210 elog(
ERROR,
"conkey is not a 1-D smallint array");
1213 elog(
ERROR,
"foreign key constraint cannot have %d columns", numkeys);
1219 Anum_pg_constraint_confkey, &isNull);
1221 elog(
ERROR,
"null confkey for constraint %u", constrId);
1227 elog(
ERROR,
"confkey is not a 1-D smallint array");
1235 Anum_pg_constraint_conpfeqop, &isNull);
1237 elog(
ERROR,
"null conpfeqop for constraint %u", constrId);
1244 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
1253 Anum_pg_constraint_conppeqop, &isNull);
1255 elog(
ERROR,
"null conppeqop for constraint %u", constrId);
1261 elog(
ERROR,
"conppeqop is not a 1-D Oid array");
1270 Anum_pg_constraint_conffeqop, &isNull);
1272 elog(
ERROR,
"null conffeqop for constraint %u", constrId);
1278 elog(
ERROR,
"conffeqop is not a 1-D Oid array");
1284 if (fk_del_set_cols)
1287 Anum_pg_constraint_confdelsetcols, &isNull);
1290 *num_fk_del_set_cols = 0;
1294 int num_delete_cols;
1300 elog(
ERROR,
"confdelsetcols is not a 1-D smallint array");
1301 num_delete_cols =
ARR_DIMS(arr)[0];
1306 *num_fk_del_set_cols = num_delete_cols;
1331 List *grouping_columns,
1332 List **constraintDeps)
1341 if (pkattnos == NULL)
1345 groupbyattnos = NULL;
1346 foreach(gl, grouping_columns)
1351 gvar->
varno == varno &&
1360 *constraintDeps =
lappend_oid(*constraintDeps, constraintOid);
#define DatumGetArrayTypeP(X)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_add_member(Bitmapset *a, int x)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
void free_object_addresses(ObjectAddresses *addrs)
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
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_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
HeapTuple heap_copytuple(HeapTuple tuple)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
char * makeObjectName(const char *name1, const char *name2, const char *label)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lappend_oid(List *list, Oid datum)
#define AccessExclusiveLock
char * get_rel_name(Oid relid)
void pfree(void *pointer)
void namestrcpy(Name name, const char *str)
#define IsA(nodeptr, _type_)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define InvokeObjectPostCreateHookArg(classId, objectId, subId, is_internal)
#define ObjectAddressSet(addr, class_id, object_id)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
FormData_pg_class * Form_pg_class
char * ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others)
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname)
void RemoveConstraintById(Oid conId)
void RenameConstraintById(Oid conId, const char *newname)
Oid get_relation_idx_constraint_oid(Oid relationId, Oid indexId)
void ConstraintSetParentConstraint(Oid childConstrId, Oid parentConstrId, Oid childTableId)
void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs, int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols)
void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved)
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, const int16 *fkDeleteSetCols, int numFkDeleteSetCols, char foreignMatchType, const Oid *exclOp, Node *conExpr, const char *conBin, bool conIsLocal, int conInhCount, bool conNoInherit, bool is_internal)
bool ConstraintNameExists(const char *conname, Oid namespaceid)
bool check_functional_grouping(Oid relid, Index varno, Index varlevelsup, List *grouping_columns, List **constraintDeps)
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
Bitmapset * get_primary_key_attnos(Oid relid, bool deferrableOk, Oid *constraintOid)
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
Bitmapset * get_relation_constraint_attnos(Oid relid, const char *conname, bool missing_ok, Oid *constraintOid)
FormData_pg_constraint * Form_pg_constraint
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
size_t strlcpy(char *dst, const char *src, size_t siz)
#define CStringGetDatum(X)
#define DatumGetPointer(X)
#define ObjectIdGetDatum(X)
#define PointerGetDatum(X)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
#define SearchSysCacheCopy1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)