diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 4181c110eb7..54575fcd287 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -433,7 +433,7 @@ static AlterTableCmd *ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, static void ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context); -static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode); +static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap); static AlteredTableInfo *ATGetQueueEntry(List **wqueue, Relation rel); static void ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets); static void ATSimpleRecursion(List **wqueue, Relation rel, @@ -5901,7 +5901,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, * modifications, and test the current data within the table * against new constraints generated by ALTER TABLE commands. */ - ATRewriteTable(tab, OIDNewHeap, lockmode); + ATRewriteTable(tab, OIDNewHeap); /* * Swap the physical files of the old and new heaps, then rebuild @@ -5934,7 +5934,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, */ if (tab->constraints != NIL || tab->verify_new_notnull || tab->partition_constraint != NULL) - ATRewriteTable(tab, InvalidOid, lockmode); + ATRewriteTable(tab, InvalidOid); /* * If we had SET TABLESPACE but no reason to reconstruct tuples, @@ -6033,10 +6033,11 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, /* * ATRewriteTable: scan or rewrite one table * - * OIDNewHeap is InvalidOid if we don't need to rewrite + * A rewrite is requested by passing a valid OIDNewHeap; in that case, caller + * must already hold AccessExclusiveLock on it. */ static void -ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) +ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) { Relation oldrel; Relation newrel; @@ -6061,7 +6062,11 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) newTupDesc = RelationGetDescr(oldrel); /* includes all mods */ if (OidIsValid(OIDNewHeap)) - newrel = table_open(OIDNewHeap, lockmode); + { + Assert(CheckRelationOidLockedByMe(OIDNewHeap, AccessExclusiveLock, + false)); + newrel = table_open(OIDNewHeap, NoLock); + } else newrel = NULL;