Commit 38921d14 authored by Michael Paquier's avatar Michael Paquier

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
parent 6eb612fe
...@@ -574,6 +574,7 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned) ...@@ -574,6 +574,7 @@ CloneForeignKeyConstraints(Oid parentId, Oid relationId, List **cloned)
fkconstraint = makeNode(Constraint); fkconstraint = makeNode(Constraint);
/* for now this is all we need */ /* for now this is all we need */
fkconstraint->conname = pstrdup(NameStr(constrForm->conname));
fkconstraint->fk_upd_action = constrForm->confupdtype; fkconstraint->fk_upd_action = constrForm->confupdtype;
fkconstraint->fk_del_action = constrForm->confdeltype; fkconstraint->fk_del_action = constrForm->confdeltype;
fkconstraint->deferrable = constrForm->condeferrable; fkconstraint->deferrable = constrForm->condeferrable;
......
...@@ -14275,21 +14275,21 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) ...@@ -14275,21 +14275,21 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
RelationGetRelid(attachrel), &cloned); RelationGetRelid(attachrel), &cloned);
foreach(l, cloned) foreach(l, cloned)
{ {
ClonedConstraint *cloned = lfirst(l); ClonedConstraint *clonedcon = lfirst(l);
NewConstraint *newcon; NewConstraint *newcon;
Relation clonedrel; Relation clonedrel;
AlteredTableInfo *parttab; AlteredTableInfo *parttab;
clonedrel = relation_open(cloned->relid, NoLock); clonedrel = relation_open(clonedcon->relid, NoLock);
parttab = ATGetQueueEntry(wqueue, clonedrel); parttab = ATGetQueueEntry(wqueue, clonedrel);
newcon = (NewConstraint *) palloc0(sizeof(NewConstraint)); newcon = (NewConstraint *) palloc0(sizeof(NewConstraint));
newcon->name = cloned->constraint->conname; newcon->name = clonedcon->constraint->conname;
newcon->contype = CONSTR_FOREIGN; newcon->contype = CONSTR_FOREIGN;
newcon->refrelid = cloned->refrelid; newcon->refrelid = clonedcon->refrelid;
newcon->refindid = cloned->conindid; newcon->refindid = clonedcon->conindid;
newcon->conid = cloned->conid; newcon->conid = clonedcon->conid;
newcon->qual = (Node *) cloned->constraint; newcon->qual = (Node *) clonedcon->constraint;
parttab->constraints = lappend(parttab->constraints, newcon); parttab->constraints = lappend(parttab->constraints, newcon);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment