Oid         relid;
 
        relid = IndexGetRelation(oldId, false);
+
+       /*
+        * As above, make sure we have lock on the index's table if it's not
+        * the same table.
+        */
+       if (relid != tab->relid)
+           LockRelationOid(relid, AccessExclusiveLock);
+
        ATPostAlterTypeParse(oldId, relid, InvalidOid,
                             (char *) lfirst(def_item),
                             wqueue, lockmode, tab->rewrite);
        Oid         relid;
 
        relid = StatisticsGetRelation(oldId, false);
+
+       /*
+        * As above, make sure we have lock on the statistics object's table
+        * if it's not the same table.  However, we take
+        * ShareUpdateExclusiveLock here, aligning with the lock level used in
+        * CreateStatistics and RemoveStatisticsById.
+        *
+        * CAUTION: this should be done after all cases that grab
+        * AccessExclusiveLock, else we risk causing deadlock due to needing
+        * to promote our table lock.
+        */
+       if (relid != tab->relid)
+           LockRelationOid(relid, ShareUpdateExclusiveLock);
+
        ATPostAlterTypeParse(oldId, relid, InvalidOid,
                             (char *) lfirst(def_item),
                             wqueue, lockmode, tab->rewrite);
 
 create table atref(b attbl check ((b).a is not null));
 alter table attbl alter column a type numeric;  -- someday this should work
 ERROR:  cannot alter table "attbl" because column "atref.b" uses its row type
+alter table atref drop constraint atref_b_check;
+create statistics atref_stat on ((b).a is not null) from atref;
+alter table attbl alter column a type numeric;  -- someday this should work
+ERROR:  cannot alter table "attbl" because column "atref.b" uses its row type
+drop statistics atref_stat;
+create index atref_idx on atref (((b).a));
+alter table attbl alter column a type numeric;  -- someday this should work
+ERROR:  cannot alter table "attbl" because column "atref.b" uses its row type
 drop table attbl, atref;
 /* End test case for bug #18970 */
 -- Test that ALTER TABLE rewrite preserves a clustered index
 
 create table attbl(a int);
 create table atref(b attbl check ((b).a is not null));
 alter table attbl alter column a type numeric;  -- someday this should work
+alter table atref drop constraint atref_b_check;
+
+create statistics atref_stat on ((b).a is not null) from atref;
+alter table attbl alter column a type numeric;  -- someday this should work
+drop statistics atref_stat;
+
+create index atref_idx on atref (((b).a));
+alter table attbl alter column a type numeric;  -- someday this should work
 drop table attbl, atref;
 
 /* End test case for bug #18970 */