Make DDL operations play nicely with Serializable Snapshot Isolation.
Heikki Linnakangas <heikki.linnakangas@iki.fi>
Make DDL operations play nicely with Serializable Snapshot Isolation. Truncating or dropping a table is treated like deletion of all tuples, and check for conflicts accordingly. If a table is clustered or rewritten by ALTER TABLE, all predicate locks on the heap are promoted to relation-level locks, because the tuple or page ids of any existing tuples will change and won't be valid after rewriting the table. Arguably ALTER TABLE should be treated like a mass-UPDATE of every row, but if you e.g change the datatype of a column, you could also argue that it's just a change to the physical layout, not a logical change. Reindexing promotes all locks on the index to relation-level lock on the heap. Kevin Grittner, with a lot of cosmetic changes by me.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/catalog/heap.c | modified | +9 −0 |
| src/backend/catalog/index.c | modified | +13 −0 |
| src/backend/commands/cluster.c | modified | +9 −0 |
| src/backend/commands/tablecmds.c | modified | +19 −0 |
| src/backend/storage/lmgr/predicate.c | modified | +445 −76 |
| src/include/storage/predicate.h | modified | +2 −0 |
| src/include/storage/predicate_internals.h | modified | +2 −4 |