Skip to content

Commit b899cde

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 1a6d65b commit b899cde

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
@@ -1226,6 +1226,13 @@ heap_create_with_catalog(const char *relname,
12261226
relpersistence);
12271227
}
12281228

1229+
/*
1230+
* Other sessions' catalog scans can't find this until we commit. Hence,
1231+
* it doesn't hurt to hold AccessExclusiveLock. Do it here so callers
1232+
* can't accidentally vary in their lock mode or acquisition timing.
1233+
*/
1234+
LockRelationOid(relid, AccessExclusiveLock);
1235+
12291236
/*
12301237
* Determine the relation's initial permissions.
12311238
*/

0 commit comments

Comments
 (0)