|
|
@ -402,6 +402,8 @@ static void ATExecAlterChildConstr(List **wqueue, ATAlterConstraint *cmdcon, |
|
|
|
Relation conrel, Relation tgrel, Relation rel, |
|
|
|
Relation conrel, Relation tgrel, Relation rel, |
|
|
|
HeapTuple contuple, bool recurse, List **otherrelids, |
|
|
|
HeapTuple contuple, bool recurse, List **otherrelids, |
|
|
|
LOCKMODE lockmode); |
|
|
|
LOCKMODE lockmode); |
|
|
|
|
|
|
|
static void AlterConstrUpdateConstraintEntry(ATAlterConstraint *cmdcon, Relation conrel, |
|
|
|
|
|
|
|
HeapTuple contuple); |
|
|
|
static ObjectAddress ATExecValidateConstraint(List **wqueue, |
|
|
|
static ObjectAddress ATExecValidateConstraint(List **wqueue, |
|
|
|
Relation rel, char *constrName, |
|
|
|
Relation rel, char *constrName, |
|
|
|
bool recurse, bool recursing, LOCKMODE lockmode); |
|
|
|
bool recurse, bool recursing, LOCKMODE lockmode); |
|
|
@ -12093,23 +12095,9 @@ ATExecAlterConstraintInternal(List **wqueue, ATAlterConstraint *cmdcon, |
|
|
|
(currcon->condeferrable != cmdcon->deferrable || |
|
|
|
(currcon->condeferrable != cmdcon->deferrable || |
|
|
|
currcon->condeferred != cmdcon->initdeferred)) |
|
|
|
currcon->condeferred != cmdcon->initdeferred)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
HeapTuple copyTuple; |
|
|
|
AlterConstrUpdateConstraintEntry(cmdcon, conrel, contuple); |
|
|
|
Form_pg_constraint copy_con; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
copyTuple = heap_copytuple(contuple); |
|
|
|
|
|
|
|
copy_con = (Form_pg_constraint) GETSTRUCT(copyTuple); |
|
|
|
|
|
|
|
copy_con->condeferrable = cmdcon->deferrable; |
|
|
|
|
|
|
|
copy_con->condeferred = cmdcon->initdeferred; |
|
|
|
|
|
|
|
CatalogTupleUpdate(conrel, ©Tuple->t_self, copyTuple); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InvokeObjectPostAlterHook(ConstraintRelationId, currcon->oid, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
heap_freetuple(copyTuple); |
|
|
|
|
|
|
|
changed = true; |
|
|
|
changed = true; |
|
|
|
|
|
|
|
|
|
|
|
/* Make new constraint flags visible to others */ |
|
|
|
|
|
|
|
CacheInvalidateRelcache(rel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Now we need to update the multiple entries in pg_trigger that |
|
|
|
* Now we need to update the multiple entries in pg_trigger that |
|
|
|
* implement the constraint. |
|
|
|
* implement the constraint. |
|
|
@ -12140,27 +12128,14 @@ ATExecAlterConstraintInternal(List **wqueue, ATAlterConstraint *cmdcon, |
|
|
|
AttrNumber colNum; |
|
|
|
AttrNumber colNum; |
|
|
|
char *colName; |
|
|
|
char *colName; |
|
|
|
List *children; |
|
|
|
List *children; |
|
|
|
HeapTuple copyTuple; |
|
|
|
|
|
|
|
Form_pg_constraint copy_con; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* The current implementation only works for NOT NULL constraints */ |
|
|
|
/* The current implementation only works for NOT NULL constraints */ |
|
|
|
Assert(currcon->contype == CONSTRAINT_NOTNULL); |
|
|
|
Assert(currcon->contype == CONSTRAINT_NOTNULL); |
|
|
|
|
|
|
|
|
|
|
|
copyTuple = heap_copytuple(contuple); |
|
|
|
AlterConstrUpdateConstraintEntry(cmdcon, conrel, contuple); |
|
|
|
copy_con = (Form_pg_constraint) GETSTRUCT(copyTuple); |
|
|
|
|
|
|
|
copy_con->connoinherit = cmdcon->noinherit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CatalogTupleUpdate(conrel, ©Tuple->t_self, copyTuple); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InvokeObjectPostAlterHook(ConstraintRelationId, currcon->oid, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CommandCounterIncrement(); |
|
|
|
CommandCounterIncrement(); |
|
|
|
heap_freetuple(copyTuple); |
|
|
|
|
|
|
|
changed = true; |
|
|
|
changed = true; |
|
|
|
|
|
|
|
|
|
|
|
/* Make new constraint flags visible to others */ |
|
|
|
|
|
|
|
CacheInvalidateRelcache(rel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fetch the column number and name */ |
|
|
|
/* Fetch the column number and name */ |
|
|
|
colNum = extractNotNullColumn(contuple); |
|
|
|
colNum = extractNotNullColumn(contuple); |
|
|
|
colName = get_attname(currcon->conrelid, colNum, false); |
|
|
|
colName = get_attname(currcon->conrelid, colNum, false); |
|
|
@ -12320,6 +12295,39 @@ ATExecAlterChildConstr(List **wqueue, ATAlterConstraint *cmdcon, |
|
|
|
systable_endscan(pscan); |
|
|
|
systable_endscan(pscan); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Update the constraint entry for the given ATAlterConstraint command, and |
|
|
|
|
|
|
|
* invoke the appropriate hooks. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
static void |
|
|
|
|
|
|
|
AlterConstrUpdateConstraintEntry(ATAlterConstraint *cmdcon, Relation conrel, |
|
|
|
|
|
|
|
HeapTuple contuple) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
HeapTuple copyTuple; |
|
|
|
|
|
|
|
Form_pg_constraint copy_con; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert(cmdcon->alterDeferrability || cmdcon->alterInheritability); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
copyTuple = heap_copytuple(contuple); |
|
|
|
|
|
|
|
copy_con = (Form_pg_constraint) GETSTRUCT(copyTuple); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (cmdcon->alterDeferrability) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
copy_con->condeferrable = cmdcon->deferrable; |
|
|
|
|
|
|
|
copy_con->condeferred = cmdcon->initdeferred; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (cmdcon->alterInheritability) |
|
|
|
|
|
|
|
copy_con->connoinherit = cmdcon->noinherit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CatalogTupleUpdate(conrel, ©Tuple->t_self, copyTuple); |
|
|
|
|
|
|
|
InvokeObjectPostAlterHook(ConstraintRelationId, copy_con->oid, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Make new constraint flags visible to others */ |
|
|
|
|
|
|
|
CacheInvalidateRelcacheByRelid(copy_con->conrelid); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
heap_freetuple(copyTuple); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* ALTER TABLE VALIDATE CONSTRAINT |
|
|
|
* ALTER TABLE VALIDATE CONSTRAINT |
|
|
|
* |
|
|
|
* |
|
|
|