mirror of
https://github.com/postgres/postgres.git
synced 2025-05-21 15:54:08 +03:00
Simplify coding to detach constraints when detaching partition
The original coding was too baroque and led to an use-after-release mistake, noticed by buildfarm member prion. Discussion: https://postgr.es/m/21693.1548305934@sss.pgh.pa.us
This commit is contained in:
parent
fd1afdbafd
commit
19184fcc09
@ -15106,24 +15106,14 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
|||||||
idx = index_open(idxid, AccessExclusiveLock);
|
idx = index_open(idxid, AccessExclusiveLock);
|
||||||
IndexSetParentIndex(idx, InvalidOid);
|
IndexSetParentIndex(idx, InvalidOid);
|
||||||
update_relispartition(classRel, idxid, false);
|
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;
|
|
||||||
|
|
||||||
|
/* If there's a constraint associated with the index, detach it too */
|
||||||
constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
|
constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
|
||||||
idxid);
|
idxid);
|
||||||
if (!OidIsValid(constrOid))
|
if (OidIsValid(constrOid))
|
||||||
elog(ERROR, "missing pg_constraint entry of index \"%s\" of partition \"%s\"",
|
ConstraintSetParentConstraint(constrOid, InvalidOid);
|
||||||
RelationGetRelationName(idx),
|
|
||||||
RelationGetRelationName(partRel));
|
|
||||||
|
|
||||||
ConstraintSetParentConstraint(constrOid, InvalidOid);
|
index_close(idx, NoLock);
|
||||||
}
|
}
|
||||||
table_close(classRel, RowExclusiveLock);
|
table_close(classRel, RowExclusiveLock);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user