提交 19184fcc 编写于 作者: A Alvaro Herrera

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
上级 fd1afdba
......@@ -15106,24 +15106,14 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
idx = index_open(idxid, AccessExclusiveLock);
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;
/* If there's a constraint associated with the index, detach it too */
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));
if (OidIsValid(constrOid))
ConstraintSetParentConstraint(constrOid, InvalidOid);
ConstraintSetParentConstraint(constrOid, InvalidOid);
index_close(idx, NoLock);
}
table_close(classRel, RowExclusiveLock);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册