mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Detach constraints when partitions are detached
I (Álvaro) forgot to do this in eb7ed3f306
, leading to undroppable
constraints after partitions are detached. Repair.
Reported-by: Amit Langote
Author: Amit Langote
Discussion: https://postgr.es/m/c1c9b688-b886-84f7-4048-1e4ebe9b1d06@lab.ntt.co.jp
This commit is contained in:
@ -15095,6 +15095,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
||||
{
|
||||
Oid idxid = lfirst_oid(cell);
|
||||
Relation idx;
|
||||
Oid constrOid;
|
||||
|
||||
if (!has_superclass(idxid))
|
||||
continue;
|
||||
@ -15106,6 +15107,23 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
||||
IndexSetParentIndex(idx, InvalidOid);
|
||||
update_relispartition(classRel, idxid, false);
|
||||
index_close(idx, NoLock);
|
||||
|
||||
/*
|
||||
* Detach any constraints associated with the index too. Only UNIQUE
|
||||
* and PRIMARY KEY index constraints can be inherited, so no need
|
||||
* to check for others.
|
||||
*/
|
||||
if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
|
||||
continue;
|
||||
|
||||
constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
|
||||
idxid);
|
||||
if (!OidIsValid(constrOid))
|
||||
elog(ERROR, "missing pg_constraint entry of index \"%s\" of partition \"%s\"",
|
||||
RelationGetRelationName(idx),
|
||||
RelationGetRelationName(partRel));
|
||||
|
||||
ConstraintSetParentConstraint(constrOid, InvalidOid);
|
||||
}
|
||||
table_close(classRel, RowExclusiveLock);
|
||||
|
||||
|
Reference in New Issue
Block a user