mirror of
https://github.com/HeyPuter/puter.git
synced 2026-09-12 16:25:51 +00:00
Review follow-ups on the dedup migration. mysql and postgres track no per-file applied state and re-execute every migration on each boot, so the unguarded DELETE self-joined the whole table at every process start, forever. Both now sit behind the same index-existence check that guards the ALTER, which also stops a rolling deploy deleting on one instance while another adds the index. The dedup test was a false green. `targetVersion: 67` never applies 0071 -- the loop breaks on `threshold + 1 >= targetVersion` but stamps the target anyway -- so the fixture asserted the current schema version on a database missing a migration. It now replays the real 0072 file against a fully migrated database, and a second test pins the off-by-one so nobody builds a fixture on it again.
35 lines
1.3 KiB
SQL
35 lines
1.3 KiB
SQL
-- Copyright (C) 2024-present Puter Technologies Inc.
|
|
--
|
|
-- This file is part of Puter.
|
|
--
|
|
-- Puter is free software: you can redistribute it and/or modify
|
|
-- it under the terms of the GNU Affero General Public License as published
|
|
-- by the Free Software Foundation, either version 3 of the License, or
|
|
-- (at your option) any later version.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU Affero General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU Affero General Public License
|
|
-- along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
-- Deduplicate then constrain. See sqlite/0075 for why this is lossless.
|
|
|
|
-- Guarded because postgres re-runs every file on each boot; `to_regclass` follows
|
|
-- search_path, so it resolves under a test schema too.
|
|
DO $mig15$
|
|
BEGIN
|
|
IF to_regclass('idx_jct_user_group_pair') IS NULL THEN
|
|
DELETE FROM jct_user_group
|
|
WHERE id NOT IN (
|
|
SELECT MIN(id) FROM jct_user_group GROUP BY user_id, group_id
|
|
);
|
|
END IF;
|
|
END
|
|
$mig15$;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_jct_user_group_pair
|
|
ON jct_user_group (user_id, group_id);
|