Oid relId, Oid oldRelId, void *arg);
 static bool ReindexRelationConcurrently(Oid relationOid, int options);
 static void ReindexPartitionedIndex(Relation parentIdx);
+static void update_relispartition(Oid relationId, bool newval);
 
 /*
  * CheckIndexCompatible
        if (OidIsValid(parentOid))
                SetRelationHasSubclass(parentOid, true);
 
+       /* set relispartition correctly on the partition */
+       update_relispartition(partRelid, OidIsValid(parentOid));
+
        if (fix_dependencies)
        {
                /*
                CommandCounterIncrement();
        }
 }
+
+/*
+ * Subroutine of IndexSetParentIndex to update the relispartition flag of the
+ * given index to the given value.
+ */
+static void
+update_relispartition(Oid relationId, bool newval)
+{
+       HeapTuple       tup;
+       Relation        classRel;
+
+       classRel = table_open(RelationRelationId, RowExclusiveLock);
+       tup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relationId));
+       Assert(((Form_pg_class) GETSTRUCT(tup))->relispartition != newval);
+       ((Form_pg_class) GETSTRUCT(tup))->relispartition = newval;
+       CatalogTupleUpdate(classRel, &tup->t_self, tup);
+       heap_freetuple(tup);
+
+       table_close(classRel, RowExclusiveLock);
+}
 
 static void validatePartitionedIndex(Relation partedIdx, Relation partedTbl);
 static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx,
                                          Relation partitionTbl);
-static void update_relispartition(Relation classRel, Oid relationId,
-                                         bool newval);
 static List *GetParentedForeignKeyRefs(Relation partition);
 static void ATDetachCheckNoForeignKeyRefs(Relation partition);
 
                                if (OidIsValid(constraintOid))
                                        ConstraintSetParentConstraint(cldConstrOid, constraintOid,
                                                                                                  RelationGetRelid(attachrel));
-                               update_relispartition(NULL, cldIdxId, true);
                                found = true;
 
                                CommandCounterIncrement();
 
                idx = index_open(idxid, AccessExclusiveLock);
                IndexSetParentIndex(idx, InvalidOid);
-               update_relispartition(classRel, idxid, false);
 
                /* If there's a constraint associated with the index, detach it too */
                constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
                if (OidIsValid(constraintOid))
                        ConstraintSetParentConstraint(cldConstrId, constraintOid,
                                                                                  RelationGetRelid(partTbl));
-               update_relispartition(NULL, partIdxId, true);
 
                pfree(attmap);
 
        }
 }
 
-/*
- * Update the relispartition flag of the given relation to the given value.
- *
- * classRel is the pg_class relation, already open and suitably locked.
- * It can be passed as NULL, in which case it's opened and closed locally.
- */
-static void
-update_relispartition(Relation classRel, Oid relationId, bool newval)
-{
-       HeapTuple       tup;
-       HeapTuple       newtup;
-       Form_pg_class classForm;
-       bool            opened = false;
-
-       if (classRel == NULL)
-       {
-               classRel = table_open(RelationRelationId, RowExclusiveLock);
-               opened = true;
-       }
-
-       tup = SearchSysCache1(RELOID, ObjectIdGetDatum(relationId));
-       newtup = heap_copytuple(tup);
-       classForm = (Form_pg_class) GETSTRUCT(newtup);
-       classForm->relispartition = newval;
-       CatalogTupleUpdate(classRel, &tup->t_self, newtup);
-       heap_freetuple(newtup);
-       ReleaseSysCache(tup);
-
-       if (opened)
-               table_close(classRel, RowExclusiveLock);
-}
-
 /*
  * Return an OID list of constraints that reference the given relation
  * that are marked as having a parent constraints.
 
 (2 rows)
 
 DROP TABLE fk;
+-- test for reported bug: relispartition not set
+-- https://postgr.es/m/CA+HiwqHMsRtRYRWYTWavKJ8x14AFsv7bmAV46mYwnfD3vy8goQ@mail.gmail.com
+CREATE SCHEMA fkpart7
+  CREATE TABLE pkpart (a int) PARTITION BY LIST (a)
+  CREATE TABLE pkpart1 PARTITION OF pkpart FOR VALUES IN (1);
+ALTER TABLE fkpart7.pkpart1 ADD PRIMARY KEY (a);
+ALTER TABLE fkpart7.pkpart ADD PRIMARY KEY (a);
+CREATE TABLE fkpart7.fk (a int REFERENCES fkpart7.pkpart);
+DROP SCHEMA fkpart7 CASCADE;
+NOTICE:  drop cascades to 2 other objects
+DETAIL:  drop cascades to table fkpart7.pkpart
+drop cascades to table fkpart7.fk
 
 UPDATE pk SET a = 90 WHERE a = 30;
 SELECT tableoid::regclass, * FROM fk;
 DROP TABLE fk;
+
+-- test for reported bug: relispartition not set
+-- https://postgr.es/m/CA+HiwqHMsRtRYRWYTWavKJ8x14AFsv7bmAV46mYwnfD3vy8goQ@mail.gmail.com
+CREATE SCHEMA fkpart7
+  CREATE TABLE pkpart (a int) PARTITION BY LIST (a)
+  CREATE TABLE pkpart1 PARTITION OF pkpart FOR VALUES IN (1);
+ALTER TABLE fkpart7.pkpart1 ADD PRIMARY KEY (a);
+ALTER TABLE fkpart7.pkpart ADD PRIMARY KEY (a);
+CREATE TABLE fkpart7.fk (a int REFERENCES fkpart7.pkpart);
+DROP SCHEMA fkpart7 CASCADE;