В Postgres выполнение ANALYZE изменяет поведение предложения ILIKE с COLLATE - PullRequest
3 голосов
/ 13 июля 2020

Мы переносим приложение с SQL Server на Postgres и пытаемся имитировать различные аспекты нечувствительности к регистру SQL Server. Мы создали недетерминированное сопоставление c для поддержки сопоставления внешних ключей и сравнения на равенство без учета регистра.

Но мы наблюдаем странное поведение при использовании ILIKE, которое мы не можем объяснить, и были бы признательны некоторая помощь.

Чтобы увидеть поведение, запустите в базе данных fre sh следующее:

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";

Почему выполнение оператора ANALYZE нарушает выполнение оператора ILIKE?

1 Ответ

2 голосов
/ 14 июля 2020

Такое поведение является ошибкой PostgreSQL .

Причина, по которой оно работает без ANALYZE, заключается в том, что ошибка возникает при применении оператора к «границам гистограммы» в статистике. До ANALYZE статистики нет, поэтому ошибка не выдается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...