On 2019/01/24 13:58, Tom Lane wrote:
> Alvaro Herrera <alvhe...@alvh.no-ip.org> 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),

Reply via email to