-- +goose Up -- Finish venue transfers and back up all databases before this coordinated upgrade. CREATE TEMP TABLE team_id_mapping ( old_id INTEGER PRIMARY KEY, new_id UUID NOT NULL UNIQUE ) ON COMMIT DROP; -- PostgreSQL 15 lacks uuidv7(); this one-time migration fills v7 time bits in a random UUID. INSERT INTO team_id_mapping (old_id, new_id) SELECT id, overlay( overlay( replace(gen_random_uuid()::text, '-', '') placing lpad(to_hex(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint), 12, '0') from 1 for 12 ) placing '7' from 13 for 1 )::uuid FROM teams; -- +goose StatementBegin CREATE FUNCTION pg_temp.team_uuid(old_id INTEGER) RETURNS UUID LANGUAGE SQL STABLE STRICT AS $$ SELECT m.new_id FROM team_id_mapping m WHERE m.old_id = $1; $$; -- +goose StatementEnd ALTER TABLE actions DROP CONSTRAINT fk_actions_team; ALTER TABLE applications DROP CONSTRAINT fk_applications_team; ALTER TABLE team_answers DROP CONSTRAINT fk_team_answers_team; ALTER TABLE game_reviews DROP CONSTRAINT game_reviews_team_id_fkey; ALTER TABLE teams ALTER COLUMN id DROP DEFAULT; ALTER TABLE teams ALTER COLUMN id TYPE UUID USING pg_temp.team_uuid(id); ALTER TABLE actions ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id); ALTER TABLE applications ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id); ALTER TABLE team_answers ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id); ALTER TABLE game_reviews ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id); ALTER TABLE actions ADD CONSTRAINT fk_actions_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE; ALTER TABLE applications ADD CONSTRAINT fk_applications_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE; ALTER TABLE team_answers ADD CONSTRAINT fk_team_answers_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE; ALTER TABLE game_reviews ADD CONSTRAINT game_reviews_team_id_fkey FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE; ALTER TABLE game_map_items ALTER COLUMN item_id TYPE TEXT USING item_id::text; UPDATE game_map_items m SET item_id = n.new_id::text FROM team_id_mapping n WHERE m.kind = 'team' AND m.item_id = n.old_id::text; DROP SEQUENCE teams_id_seq; DROP FUNCTION pg_temp.team_uuid(INTEGER); -- Old packages contain numeric team IDs. Keep gameplay and media, discard transfer registries. DELETE FROM game_returns; DELETE FROM game_exports; DELETE FROM game_imports; -- +goose Down -- +goose StatementBegin DO $$ BEGIN RAISE EXCEPTION 'Restore the pre-UUID database backup and previous application version to roll back'; END $$; -- +goose StatementEnd