mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Choose FK name correctly during partition attachment
During ALTER TABLE ATTACH PARTITION, if the name of a parent's foreign key constraint is already used on the partition, the code tries to choose another one before the FK attributes list has been populated, so the resulting constraint name was "<relname>__fkey" instead of "<relname>_<attrs>_fkey". Repair, and add a test case. Backpatch to 12. In 11, the code to attach a partition was not smart enough to cope with conflicting constraint names, so the problem doesn't exist there. Author: Jehan-Guillaume de Rorthais <jgdr@dalibo.com> Discussion: https://postgr.es/m/20220901184156.738ebee5@karst
This commit is contained in:
@ -10338,16 +10338,6 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
|
||||
|
||||
/* No dice. Set up to create our own constraint */
|
||||
fkconstraint = makeNode(Constraint);
|
||||
if (ConstraintNameIsUsed(CONSTRAINT_RELATION,
|
||||
RelationGetRelid(partRel),
|
||||
NameStr(constrForm->conname)))
|
||||
fkconstraint->conname =
|
||||
ChooseConstraintName(RelationGetRelationName(partRel),
|
||||
ChooseForeignKeyConstraintNameAddition(fkconstraint->fk_attrs),
|
||||
"fkey",
|
||||
RelationGetNamespace(partRel), NIL);
|
||||
else
|
||||
fkconstraint->conname = pstrdup(NameStr(constrForm->conname));
|
||||
fkconstraint->fk_upd_action = constrForm->confupdtype;
|
||||
fkconstraint->fk_del_action = constrForm->confdeltype;
|
||||
fkconstraint->deferrable = constrForm->condeferrable;
|
||||
@ -10362,6 +10352,16 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
|
||||
fkconstraint->fk_attrs = lappend(fkconstraint->fk_attrs,
|
||||
makeString(NameStr(att->attname)));
|
||||
}
|
||||
if (ConstraintNameIsUsed(CONSTRAINT_RELATION,
|
||||
RelationGetRelid(partRel),
|
||||
NameStr(constrForm->conname)))
|
||||
fkconstraint->conname =
|
||||
ChooseConstraintName(RelationGetRelationName(partRel),
|
||||
ChooseForeignKeyConstraintNameAddition(fkconstraint->fk_attrs),
|
||||
"fkey",
|
||||
RelationGetNamespace(partRel), NIL);
|
||||
else
|
||||
fkconstraint->conname = pstrdup(NameStr(constrForm->conname));
|
||||
|
||||
indexOid = constrForm->conindid;
|
||||
constrOid =
|
||||
|
Reference in New Issue
Block a user