On 2019/01/24 13:58, Tom Lane wrote:
> Alvaro Herrera <[email protected]> writes:
>> Detach constraints when partitions are detached
>
> Hm ... it looks like this fails under -DRELCACHE_FORCE_RELEASE:
Oops, sorry. This is why:
index_close(idx, NoLock);
...
+ if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
+ continue;
Attached a fix.
Thanks,
Amit
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 738c178107..98366a2d5b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -15095,6 +15095,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
{
Oid idxid = lfirst_oid(cell);
Relation idx;
+ bool detachConstraint = false;
Oid constrOid;
if (!has_superclass(idxid))
@@ -15106,14 +15107,18 @@ 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)
+ if (idx->rd_index->indisprimary || idx->rd_index->indisunique)
+ detachConstraint = true;
+
+ index_close(idx, NoLock);
+
+ if (!detachConstraint)
continue;
constrOid =
get_relation_idx_constraint_oid(RelationGetRelid(partRel),