31 #include "utils/fmgroids.h"
50 Oid constraintNamespace,
56 const int16 *constraintKey,
61 const int16 *foreignKey,
66 char foreignUpdateType,
67 char foreignDeleteType,
68 char foreignMatchType,
101 if (constraintNKeys > 0)
106 for (i = 0; i < constraintNKeys; i++)
114 if (foreignNKeys > 0)
119 for (i = 0; i < foreignNKeys; i++)
123 for (i = 0; i < foreignNKeys; i++)
127 for (i = 0; i < foreignNKeys; i++)
131 for (i = 0; i < foreignNKeys; i++)
139 conpfeqopArray =
NULL;
140 conppeqopArray =
NULL;
141 conffeqopArray =
NULL;
149 for (i = 0; i < constraintNKeys; i++)
155 conexclopArray =
NULL;
250 if (constraintNKeys > 0)
252 for (i = 0; i < constraintNKeys; i++)
291 if (foreignNKeys > 0)
293 for (i = 0; i < foreignNKeys; i++)
325 if (foreignNKeys > 0)
338 for (i = 0; i < foreignNKeys; i++)
342 if (ppEqOp[i] != pfEqOp[i])
347 if (ffEqOp[i] != pfEqOp[i])
396 Oid objNamespace,
const char *conname)
472 char *conname =
NULL;
483 StrNCpy(modlabel, label,
sizeof(modlabel));
493 if (strcmp((
char *)
lfirst(l), conname) == 0)
525 snprintf(modlabel,
sizeof(modlabel),
"%s%d", label, ++pass);
547 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
578 elog(
ERROR,
"cache lookup failed for relation %u",
582 if (classForm->relchecks == 0)
583 elog(
ERROR,
"relation \"%s\" has relchecks = 0",
585 classForm->relchecks--;
609 elog(
ERROR,
"constraint %u is not of a known type", conId);
640 elog(
ERROR,
"cache lookup failed for constraint %u", conId);
654 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
663 errmsg(
"constraint \"%s\" for domain %s already exists",
732 if (conform->connamespace == oldNspId && oldNspId != newNspId)
737 conform->connamespace = newNspId;
792 if (strcmp(
NameStr(con->conname), conname) == 0)
797 errmsg(
"table \"%s\" has multiple constraints named \"%s\"",
808 (
errcode(ERRCODE_UNDEFINED_OBJECT),
809 errmsg(
"constraint \"%s\" for table \"%s\" does not exist",
850 if (strcmp(
NameStr(con->conname), conname) == 0)
855 errmsg(
"domain \"%s\" has multiple constraints named \"%s\"",
866 (
errcode(ERRCODE_UNDEFINED_OBJECT),
867 errmsg(
"constraint \"%s\" for domain \"%s\" does not exist",
931 if (con->condeferrable && !deferrableOk)
938 elog(
ERROR,
"null conkey for constraint %u",
946 elog(
ERROR,
"conkey is not a 1-D smallint array");
950 for (i = 0; i < numkeys; i++)
986 List *grouping_columns,
987 List **constraintDeps)
996 if (pkattnos ==
NULL)
1000 groupbyattnos =
NULL;
1001 foreach(gl, grouping_columns)
1006 gvar->
varno == varno &&
1015 *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)
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 CONSTRAINT_FOREIGN
#define IsA(nodeptr, _type_)
#define Anum_pg_constraint_conislocal
#define OperatorRelationId
void systable_endscan(SysScanDesc sysscan)
#define Anum_pg_constraint_confkey
#define Anum_pg_constraint_conindid
#define RelationGetDescr(relation)
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
#define Anum_pg_constraint_condeferred
#define PointerGetDatum(X)
#define Anum_pg_constraint_conppeqop
#define RelationRelationId
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)
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
#define FirstLowInvalidHeapAttributeNumber
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)
#define Anum_pg_constraint_conffeqop
#define Anum_pg_constraint_conname
void heap_freetuple(HeapTuple htup)
int namestrcpy(Name name, const char *str)
#define Anum_pg_constraint_coninhcount
List * lappend_oid(List *list, Oid datum)
#define OidIsValid(objectId)
#define Anum_pg_constraint_conbin
#define ConstraintTypidIndexId
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
#define SearchSysCache1(cacheId, key1)
void RenameConstraintById(Oid conId, const char *newname)
char * makeObjectName(const char *name1, const char *name2, const char *label)
#define CONSTRAINT_PRIMARY
HeapTuple systable_getnext(SysScanDesc sysscan)
void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved)
void pfree(void *pointer)
#define Anum_pg_constraint_convalidated
#define ObjectIdGetDatum(X)
#define Anum_pg_constraint_condeferrable
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
#define CStringGetDatum(X)
#define RelationGetRelationName(relation)
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
#define ereport(elevel, rest)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define Anum_pg_constraint_confdeltype
#define Anum_pg_constraint_conkey
#define Anum_pg_constraint_contypid
#define heap_getattr(tup, attnum, tupleDesc, isnull)
#define Anum_pg_constraint_confmatchtype
void ReleaseSysCache(HeapTuple tuple)
Oid simple_heap_insert(Relation relation, HeapTuple tup)
#define Anum_pg_constraint_connamespace
Relation heap_open(Oid relationId, LOCKMODE lockmode)
#define InvokeObjectPostCreateHookArg(classId, objectId, subId, is_internal)
#define Anum_pg_constraint_contype
#define Anum_pg_constraint_confupdtype
#define ConstraintNameNspIndexId
FormData_pg_constraint * Form_pg_constraint
#define HeapTupleIsValid(tuple)
#define Natts_pg_constraint
#define Anum_pg_constraint_conpfeqop
#define Assert(condition)
#define StrNCpy(dst, src, len)
void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple)
#define Anum_pg_constraint_consrc
void simple_heap_delete(Relation relation, ItemPointer tid)
void simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup)
Bitmapset * bms_add_member(Bitmapset *a, int x)
#define Anum_pg_constraint_connoinherit
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, Oid objNamespace, const char *conname)
static Datum values[MAXATTR]
FormData_pg_class * Form_pg_class
#define SearchSysCacheCopy1(cacheId, key1)
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior)
#define AccessExclusiveLock
int errmsg(const char *fmt,...)
#define Anum_pg_constraint_conrelid
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define CStringGetTextDatum(s)
#define ConstraintRelationId
#define Anum_pg_constraint_confrelid
#define HeapTupleGetOid(tuple)
#define ERRCODE_DUPLICATE_OBJECT
char * get_rel_name(Oid relid)
void RemoveConstraintById(Oid conId)
Oid CreateConstraintEntry(const char *constraintName, Oid constraintNamespace, char constraintType, bool isDeferrable, bool isDeferred, bool isValidated, Oid relId, const int16 *constraintKey, int constraintNKeys, 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, const char *conSrc, bool conIsLocal, int conInhCount, bool conNoInherit, bool is_internal)
#define Anum_pg_constraint_conexclop
#define BTEqualStrategyNumber
#define ConstraintRelidIndexId
#define DatumGetArrayTypeP(X)