From 053f09b1812fa07d12c2d0e46fa325ba428bf36c Mon Sep 17 00:00:00 2001 From: Pontoporeia Date: Mon, 8 Jun 2026 09:48:51 +0200 Subject: [PATCH] fix(migration): deduplicate languages before LOWER() in 025_lowercase_languages.sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two rows (Néerlandais id=5, néerlandais id=3) collided when lowercased, violating the UNIQUE constraint on languages.name. Added DELETE to keep the lowest-ID row per LOWER(name) group before the UPDATE SET name = LOWER(name). --- TODO.md | 1 + app/migrations/applied/025_lowercase_languages.sql | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/TODO.md b/TODO.md index 897264e..ca38902 100644 --- a/TODO.md +++ b/TODO.md @@ -4,3 +4,4 @@ - [x] Fix `ShareLink::setPassword()`: also encrypt and store plain-text password, matching `create()` behavior - [x] Audit: confirm all remaining credential comparison sites use constant-time `hash_equals` or `password_verify` - [x] Fix `.gitignore`: anchor `vendor/` to root (`/vendor/`) so `app/public/assets/js/vendor/` (htmx, OverType, FilePond) is tracked +- [x] Fix migration `025_lowercase_languages.sql`: deduplicate languages before LOWER() to avoid UNIQUE constraint violation (`Néerlandais`/`néerlandais`) diff --git a/app/migrations/applied/025_lowercase_languages.sql b/app/migrations/applied/025_lowercase_languages.sql index 320dc33..b0b10f5 100644 --- a/app/migrations/applied/025_lowercase_languages.sql +++ b/app/migrations/applied/025_lowercase_languages.sql @@ -1,6 +1,14 @@ -- 025_lowercase_languages.sql -- Normalise les noms de langues en minuscules et recrée la vue avec ucfirst. +-- Supprimer les doublons (même nom après LOWER) en gardant l'id le plus petit +DELETE FROM languages +WHERE id NOT IN ( + SELECT MIN(id) + FROM languages + GROUP BY LOWER(name) +); + -- Normaliser les langues existantes UPDATE languages SET name = LOWER(name);