Skip to content

Commit 0f2835e

Browse files
committed
AccessExclusiveLock new relations just after assigning the OID.
This has no user-visible, important consequences, since other sessions' catalog scans can't find the relation until we commit. However, this unblocks introducing a rule about locks required to heap_update() a pg_class row. CREATE TABLE has been acquiring this lock eventually, but it can heap_update() pg_class.relchecks earlier. create_toast_table() has been acquiring only ShareLock. Back-patch to v12 (all supported versions), the plan for the commit relying on the new rule. Reviewed (in an earlier version) by Robert Haas. Discussion: https://postgr.es/m/20240611024525.9f.nmisch@google.com
1 parent a338e41 commit 0f2835e

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

src/backend/catalog/heap.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,13 @@ heap_create_with_catalog(const char *relname,
12391239
relpersistence);
12401240
}
12411241

1242+
/*
1243+
* Other sessions' catalog scans can't find this until we commit. Hence,
1244+
* it doesn't hurt to hold AccessExclusiveLock. Do it here so callers
1245+
* can't accidentally vary in their lock mode or acquisition timing.
1246+
*/
1247+
LockRelationOid(relid, AccessExclusiveLock);
1248+
12421249
/*
12431250
* Determine the relation's initial permissions.
12441251
*/

0 commit comments

Comments
 (0)