mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Assign constraint name when cloning FK definition for partitions
This is for example used when attaching a partition to a partitioned table which includes foreign keys, and in this case the constraint name has been missing in the data cloned. This could lead to hard crashes, as when validating the foreign key constraint, the constraint name is always expected. Particularly, when using log_min_messages >= DEBUG1, a log message would be generated with this unassigned constraint name, leading to an assertion failure on HEAD. While on it, rename a variable in ATExecAttachPartition which was declared twice with the same name. Author: Michael Paquier Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/20181005042236.GG1629@paquier.xyz Backpatch-through: 11
This commit is contained in:
parent
6eb612fea9
commit
38921d1416
@ -574,6 +574,7 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
|
||||
|
||||
fkconstraint = makeNode(Constraint);
|
||||
/* for now this is all we need */
|
||||
fkconstraint->conname = pstrdup(NameStr(constrForm->conname));
|
||||
fkconstraint->fk_upd_action = constrForm->confupdtype;
|
||||
fkconstraint->fk_del_action = constrForm->confdeltype;
|
||||
fkconstraint->deferrable = constrForm->condeferrable;
|
||||
|
@ -14275,21 +14275,21 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
||||
RelationGetRelid(attachrel), &cloned);
|
||||
foreach(l, cloned)
|
||||
{
|
||||
ClonedConstraint *cloned = lfirst(l);
|
||||
ClonedConstraint *clonedcon = lfirst(l);
|
||||
NewConstraint *newcon;
|
||||
Relation clonedrel;
|
||||
AlteredTableInfo *parttab;
|
||||
|
||||
clonedrel = relation_open(cloned->relid, NoLock);
|
||||
clonedrel = relation_open(clonedcon->relid, NoLock);
|
||||
parttab = ATGetQueueEntry(wqueue, clonedrel);
|
||||
|
||||
newcon = (NewConstraint *) palloc0(sizeof(NewConstraint));
|
||||
newcon->name = cloned->constraint->conname;
|
||||
newcon->name = clonedcon->constraint->conname;
|
||||
newcon->contype = CONSTR_FOREIGN;
|
||||
newcon->refrelid = cloned->refrelid;
|
||||
newcon->refindid = cloned->conindid;
|
||||
newcon->conid = cloned->conid;
|
||||
newcon->qual = (Node *) cloned->constraint;
|
||||
newcon->refrelid = clonedcon->refrelid;
|
||||
newcon->refindid = clonedcon->conindid;
|
||||
newcon->conid = clonedcon->conid;
|
||||
newcon->qual = (Node *) clonedcon->constraint;
|
||||
|
||||
parttab->constraints = lappend(parttab->constraints, newcon);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user