Estamos migrando una aplicación de SQL Server a Postgres e intentando emular varios aspectos de la insensibilidad a mayúsculas y minúsculas de SQL Server. Hemos creado una intercalación no determinista para respaldar la comparación de claves foráneas y las comparaciones de igualdad que no distinguen entre mayúsculas y minúsculas.
Pero estamos viendo un comportamiento extraño cuando usamos ILIKE que no podemos explicar, y agradeceríamos alguna ayuda.
Para ver el comportamiento, ejecute lo siguiente en una base de datos nueva:
CREATE COLLATION IF NOT EXISTS public.ci (provider = icu, locale = 'und-u-ks-level2', deterministic = false); DROP TABLE IF EXISTS sort_test; CREATE TABLE sort_test (a text COLLATE public.ci); INSERT INTO sort_test SELECT md5(n::text) FROM generate_series(1, 10000) n; -- Removing the following line fixes the issue ANALYZE sort_test; -- This line throws "nondeterministic collations are not supported for ILIKE" SELECT * FROM sort_test WHERE a ILIKE 'c4ca4238a0%' COLLATE "und-x-icu";¿Por qué ejecutar la declaración ANALYZE rompe la declaración ILIKE?
Ese comportamiento es un error de PostgreSQL .
La razón por la que funciona sin ANALYZE es que el error se produce al aplicar el operador a los "límites del histograma" en las estadísticas. Antes de ANALYZE no hay estadísticas, por lo que no arroja ningún error.