-- Marks a track whose file the scanner could no longer find (#2523). -- -- NULL means present. A timestamp means the file was absent as of that scan, -- and is the point from which "how long has this been gone" is measured — which -- is what a later cleanup pass needs in order to require a grace period rather -- than deleting on a single missed stat. -- -- Deliberately a nullable timestamp rather than a boolean: "missing" is not a -- state we want to act on immediately, and the age is the only thing that makes -- an automated deletion safe to reason about. -- -- No default and no backfill. Existing rows start NULL (present) and the next -- full scan sets the mark where it belongs — a migration cannot check the -- filesystem, and guessing here would mark the whole library on a server whose -- media volume happens to be detached at upgrade time. ALTER TABLE tracks ADD COLUMN missing_since timestamptz; -- Partial index: the only query that filters on this column positively is the -- admin "what's missing" list, which is a small set. Playback and browse -- queries filter `missing_since IS NULL`, which matches nearly every row and is -- better served by a sequential scan than an index lookup. CREATE INDEX tracks_missing_since_idx ON tracks (missing_since) WHERE missing_since IS NOT NULL;