-- Attach partition child tables after pgschema apply. -- -- pgschema currently emits existing partition children as standalone CREATE TABLE -- statements when applying schema/schema.sql in CI. The tables exist, but they -- are not attached to their partitioned parents, so inserts into events or -- delivery_log fail with "no partition of relation ... found for row". Keep this -- idempotent: raw psql/schema.sql already attaches these partitions, while -- pgschema-created schemas need this repair step. DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p_past'::regclass ) THEN -- pgschema may copy parent triggers onto standalone children. Drop -- those copies before ATTACH; PostgreSQL recreates inherited parent -- triggers while attaching and rejects same-named child triggers -- (both the push-match trigger and the replica-fence floor guard). DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p_past; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p_past; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p_past; ALTER TABLE events ATTACH PARTITION events_p_past FOR VALUES FROM (MINVALUE) TO ('2026-01-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_01'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_01; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_01; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_01; ALTER TABLE events ATTACH PARTITION events_p2026_01 FOR VALUES FROM ('2026-01-01') TO ('2026-02-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_02'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_02; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_02; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_02; ALTER TABLE events ATTACH PARTITION events_p2026_02 FOR VALUES FROM ('2026-02-01') TO ('2026-03-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_03'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_03; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_03; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_03; ALTER TABLE events ATTACH PARTITION events_p2026_03 FOR VALUES FROM ('2026-03-01') TO ('2026-04-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_04'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_04; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_04; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_04; ALTER TABLE events ATTACH PARTITION events_p2026_04 FOR VALUES FROM ('2026-04-01') TO ('2026-05-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_05'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_05; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_05; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_05; ALTER TABLE events ATTACH PARTITION events_p2026_05 FOR VALUES FROM ('2026-05-01') TO ('2026-06-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p2026_06'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p2026_06; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p2026_06; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p2026_06; ALTER TABLE events ATTACH PARTITION events_p2026_06 FOR VALUES FROM ('2026-06-01') TO ('2026-07-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'events'::regclass AND inhrelid = 'events_p_future'::regclass ) THEN DROP TRIGGER IF EXISTS events_enqueue_push_match ON events_p_future; DROP TRIGGER IF EXISTS events_refresh_channel_ttl ON events_p_future; DROP TRIGGER IF EXISTS events_created_at_floor ON events_p_future; ALTER TABLE events ATTACH PARTITION events_p_future FOR VALUES FROM ('2026-07-01') TO (MAXVALUE); END IF; -- When pgschema creates partition children as standalone tables, it also -- preserves the parent's identity column on delivery_log children. PostgreSQL -- rejects attaching a child table that has its own identity column, so each -- delivery_log attach path drops that standalone identity first. Raw -- schema-created partitions are already attached, so these branches do not -- run against inherited partition columns. IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p_past'::regclass ) THEN ALTER TABLE delivery_log_p_past ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p_past FOR VALUES FROM (MINVALUE) TO ('2026-03-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p2026_03'::regclass ) THEN ALTER TABLE delivery_log_p2026_03 ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p2026_03 FOR VALUES FROM ('2026-03-01') TO ('2026-04-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p2026_04'::regclass ) THEN ALTER TABLE delivery_log_p2026_04 ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p2026_04 FOR VALUES FROM ('2026-04-01') TO ('2026-05-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p2026_05'::regclass ) THEN ALTER TABLE delivery_log_p2026_05 ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p2026_05 FOR VALUES FROM ('2026-05-01') TO ('2026-06-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p2026_06'::regclass ) THEN ALTER TABLE delivery_log_p2026_06 ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p2026_06 FOR VALUES FROM ('2026-06-01') TO ('2026-07-01'); END IF; IF NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhparent = 'delivery_log'::regclass AND inhrelid = 'delivery_log_p_future'::regclass ) THEN ALTER TABLE delivery_log_p_future ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE delivery_log ATTACH PARTITION delivery_log_p_future FOR VALUES FROM ('2026-07-01') TO (MAXVALUE); END IF; END $$;