fix(schema): ship the two Batch-A upgrade ALTERs that 1.15.0 missed

audio_metadata (media_items) and audio_offset_seconds (reading_progress)
were declared only inside their CREATE TABLE blocks — fresh installs got
them, upgraded installs never did, because columns reach existing
databases only via the idempotent ALTER block that schema.sql re-runs on
every boot. On prod (v1.15.0) this 42703'd every media-existence check
and the archive pass (1817/1817 scan errors), and every progress save,
since the shared progress upsert names audio_offset_seconds.

Both ALTERs match the declared shapes exactly (nullable JSONB; INTEGER
CHECK (audio_offset_seconds >= 0)); idempotent, applied on every boot.

Verified against a scratch database built to the v1.14.0 shape: overlay
the patched schema -> both columns created; re-run (every boot) skips
cleanly; probes resolve reading_progress.audio_offset_seconds integer
and media_items.audio_metadata jsonb. Parse test and a real container
boot (38 tables, 6 functions verified) green.
This commit is contained in:
John O'Keefe committed 2026-10-17 22:46:01 -04:00
1 parent 45b8542e25
commit 0799cca3e6
1 file changed
+9
+9
View File
@@ -263,6 +263,10 @@ ALTER TABLE media_items ADD COLUMN IF NOT EXISTS contributors_search TEXT[];
ALTER TABLE media_items ADD COLUMN IF NOT EXISTS narrators TEXT[] NOT NULL DEFAULT '{}';
ALTER TABLE media_items ADD COLUMN IF NOT EXISTS narrators_search TEXT[] NOT NULL DEFAULT '{}';
ALTER TABLE media_items ADD COLUMN IF NOT EXISTS abridged BOOLEAN NOT NULL DEFAULT FALSE;
-- audio_metadata is declared in the CREATE TABLE above, which only fresh
-- installs ever see — this ALTER is the upgrade path for pre-A2 installs
-- (its absence 42703'd every scan and archive pass on upgraded deployments).
ALTER TABLE media_items ADD COLUMN IF NOT EXISTS audio_metadata JSONB;
-- Per-field user-override tracking (idempotent backfill for existing
-- installs; the column is also declared in the media_items table
@@ -371,6 +375,11 @@ CREATE TABLE IF NOT EXISTS reading_progress (
conflict_resolved BOOLEAN DEFAULT TRUE
);
-- audio_offset_seconds upgrade path: declared in the CREATE TABLE above
-- (Batch A) with no ALTER, so pre-A installs lacked the column and every
-- progress save — the shared upsert names it — failed with SQLSTATE 42703.
ALTER TABLE reading_progress ADD COLUMN IF NOT EXISTS audio_offset_seconds INTEGER CHECK (audio_offset_seconds >= 0);
-- Create media_ratings table
CREATE TABLE IF NOT EXISTS media_ratings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),