Skip to content

Commit c340659

Browse files
chore(db): renumber rows_version migration to 0240 (off staging's 0239)
1 parent e15064f commit c340659

3 files changed

Lines changed: 16631 additions & 0 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
ALTER TABLE "user_table_definitions" ADD COLUMN "rows_version" bigint DEFAULT 0 NOT NULL;--> statement-breakpoint
2+
3+
-- ============================================================
4+
-- Statement-level rows_version maintenance for user_table_rows.
5+
--
6+
-- rows_version is a monotonic counter keyed by the snapshot cache: a CSV stored
7+
-- under v{rows_version} stays valid until the table mutates. The bump MUST live
8+
-- in a trigger, not application code -- every row write (insert/update/delete,
9+
-- including order_key reorders, which are UPDATEs) must invalidate the snapshot,
10+
-- and a trigger is the only bypass-proof layer.
11+
--
12+
-- Mirrors the statement-level row_count triggers (migration 0224): transition
13+
-- tables let one UPDATE bump every affected table once per statement, so a bulk
14+
-- reorder or import is +1, not +N -- avoiding the per-row lock contention on the
15+
-- single definition row that 0224 removed. The NEW transition table carries the
16+
-- affected table_id for INSERT/UPDATE (table_id never changes), the OLD table for
17+
-- DELETE; both are aliased `changed_rows` so one function serves all three.
18+
-- ============================================================
19+
20+
CREATE OR REPLACE FUNCTION bump_user_table_rows_version()
21+
RETURNS TRIGGER AS $$
22+
BEGIN
23+
UPDATE user_table_definitions d
24+
SET rows_version = d.rows_version + 1
25+
FROM (SELECT DISTINCT table_id FROM changed_rows) c
26+
WHERE d.id = c.table_id;
27+
28+
RETURN NULL;
29+
END;
30+
$$ LANGUAGE plpgsql;
31+
--> statement-breakpoint
32+
33+
CREATE TRIGGER user_table_rows_version_insert_trigger
34+
AFTER INSERT ON user_table_rows
35+
REFERENCING NEW TABLE AS changed_rows
36+
FOR EACH STATEMENT
37+
EXECUTE FUNCTION bump_user_table_rows_version();
38+
--> statement-breakpoint
39+
40+
CREATE TRIGGER user_table_rows_version_update_trigger
41+
AFTER UPDATE ON user_table_rows
42+
REFERENCING NEW TABLE AS changed_rows
43+
FOR EACH STATEMENT
44+
EXECUTE FUNCTION bump_user_table_rows_version();
45+
--> statement-breakpoint
46+
47+
CREATE TRIGGER user_table_rows_version_delete_trigger
48+
AFTER DELETE ON user_table_rows
49+
REFERENCING OLD TABLE AS changed_rows
50+
FOR EACH STATEMENT
51+
EXECUTE FUNCTION bump_user_table_rows_version();

0 commit comments

Comments
 (0)