-- Offline database copy only. Stop the app and preserve a verified backup first. -- Aborts if a migrated date changed after migration. On error, ROLLBACK and stop. BEGIN IMMEDIATE; CREATE TEMP TABLE timestamp_rollback_guard (ok INTEGER CHECK (ok = 1)); INSERT INTO timestamp_rollback_guard SELECT CASE WHEN (SELECT user_version FROM pragma_user_version) = 8 AND NOT EXISTS ( SELECT 1 FROM ride_timestamp_archive a LEFT JOIN rides r ON r.id = a.ride_id WHERE r.id IS NULL OR r.start_time IS NOT a.canonical_start_time OR r.end_time IS NOT a.canonical_end_time ) THEN 1 ELSE 0 END; UPDATE rides SET start_time = (SELECT original_start_time FROM ride_timestamp_archive WHERE ride_id = rides.id), end_time = (SELECT original_end_time FROM ride_timestamp_archive WHERE ride_id = rides.id) WHERE id IN (SELECT ride_id FROM ride_timestamp_archive); PRAGMA user_version = 7; DROP TABLE timestamp_rollback_guard; COMMIT; -- Keep the archive for forensic evidence. Original bad dates will be restored.