From 300f9e7bcbd96fc6bb3c6e45144054e5d2f71f22 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Wed, 7 Jan 2026 20:12:43 +0000 Subject: [PATCH] fix: modify field name uniqueness constraint to only apply to UUID fields Only apply normalization (stripping _id, _uuid, etc. suffixes) to UUID fields to avoid false collisions on text fields like current_role/current_role_id. This fix was ported from constructive-db. --- .../field/indexes/databases_field_uniq_names_idx.sql | 8 +++++++- .../metaschema-schema/sql/metaschema-schema--0.15.5.sql | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/indexes/databases_field_uniq_names_idx.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/indexes/databases_field_uniq_names_idx.sql index c3995513..a3b035e6 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/indexes/databases_field_uniq_names_idx.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/indexes/databases_field_uniq_names_idx.sql @@ -7,7 +7,13 @@ BEGIN; CREATE UNIQUE INDEX databases_field_uniq_names_idx ON metaschema_public.field ( -- strip out any _id, etc., so that if you do create one and make foreign key relation, there is no conflict - table_id, DECODE(MD5(LOWER(regexp_replace(name, '^(.+?)(_row_id|_id|_uuid|_fk|_pk)$', '\1', 'i'))), 'hex') + -- only apply normalization to uuid fields (FK candidates) to avoid false collisions on text fields like current_role/current_role_id + table_id, DECODE(MD5(LOWER( + CASE + WHEN type = 'uuid' THEN regexp_replace(name, '^(.+?)(_row_id|_id|_uuid|_fk|_pk)$', '\1', 'i') + ELSE name + END + )), 'hex') ); COMMIT; diff --git a/packages/metaschema-schema/sql/metaschema-schema--0.15.5.sql b/packages/metaschema-schema/sql/metaschema-schema--0.15.5.sql index 10cfb4fa..814739bf 100644 --- a/packages/metaschema-schema/sql/metaschema-schema--0.15.5.sql +++ b/packages/metaschema-schema/sql/metaschema-schema--0.15.5.sql @@ -224,7 +224,7 @@ CREATE INDEX field_database_id_idx ON metaschema_public.field (database_id); COMMENT ON COLUMN metaschema_public.field.default_value IS '@sqlExpression'; -CREATE UNIQUE INDEX databases_field_uniq_names_idx ON metaschema_public.field (table_id, (decode(md5(lower(regexp_replace(name, '^(.+?)(_row_id|_id|_uuid|_fk|_pk)$', E'\\1', 'i'))), 'hex'))); +CREATE UNIQUE INDEX databases_field_uniq_names_idx ON metaschema_public.field (table_id, (decode(md5(lower(CASE WHEN type = 'uuid' THEN regexp_replace(name, '^(.+?)(_row_id|_id|_uuid|_fk|_pk)$', E'\\1', 'i') ELSE name END)), 'hex'))); CREATE TABLE metaschema_public.foreign_key_constraint ( id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), @@ -579,4 +579,4 @@ COMMENT ON CONSTRAINT db_fkey ON metaschema_public.unique_constraint IS '@omit m CREATE INDEX unique_constraint_table_id_idx ON metaschema_public.unique_constraint (table_id); -CREATE INDEX unique_constraint_database_id_idx ON metaschema_public.unique_constraint (database_id); \ No newline at end of file +CREATE INDEX unique_constraint_database_id_idx ON metaschema_public.unique_constraint (database_id);