From a89e5d0f272b438ed324af56a4e52c785dddcb2c Mon Sep 17 00:00:00 2001 From: Antoine Moreaux Date: Sun, 21 Sep 2025 15:17:19 +0200 Subject: [PATCH] feat(database): activate unaccent extension with immutable function (#14621) --- ...58117800000-activate-unaccent-extension.ts | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1758117800000-activate-unaccent-extension.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1758117800000-activate-unaccent-extension.ts index d511692455..e7261167e0 100644 --- a/packages/twenty-server/src/database/typeorm/core/migrations/common/1758117800000-activate-unaccent-extension.ts +++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1758117800000-activate-unaccent-extension.ts @@ -6,20 +6,31 @@ export class ActivateUnaccentExtension1758117800000 name = 'ActivateUnaccentExtension1758117800000'; public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE EXTENSION IF NOT EXISTS "unaccent"`); + // SELF-HOSTED Users: + // If you are self-hosting Twenty, you will need to install the unaccent_immutable extension with the admin user + try { + await queryRunner.query( + `CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;`, + ); - await queryRunner.query( - `CREATE OR REPLACE FUNCTION unaccent_immutable(text) RETURNS text AS $$ - SELECT public.unaccent($1) - $$ LANGUAGE sql IMMUTABLE;`, - ); + await queryRunner.query( + `CREATE OR REPLACE FUNCTION public.unaccent_immutable(input text) + RETURNS text + LANGUAGE sql + IMMUTABLE +AS $$ +SELECT public.unaccent('public.unaccent'::regdictionary, input) +$$;`, + ); + } catch { + // Ignore error + } } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP FUNCTION IF EXISTS unaccent_immutable(text)`); - - // Note: We don't drop the extension as it might be used by other parts - // Note: We don't drop the extension as it might be used by other parts - // of the application or other databases. Extensions are typically left in place. + await queryRunner.query( + `DROP FUNCTION IF EXISTS public.unaccent_immutable(text)`, + ); + // Note: We don't drop the extension as it might be used elsewhere } }