Функции ошибок в индексном выражении должны быть помечены как НЕЗАВИСИМЫЕ, а не отметка времени.

Я пытаюсь создать следующий индекс;

CREATE INDEX idx_concat_paostartno_paostartsuff ON 
    dmv_os_addbase_residential (concat(pao_start_number || pao_start_suffix));

Я получаю ошибку;

ОШИБКА: функции в индексном выражении должны быть помечены как IMMUTABLE`

Я думаю, что это смешение типов, поскольку pao_start_number - это тип bigint, а pao_start_suffix - это varchar. Я пытался решить как;

CREATE INDEX idx_concat_paostartno_paostartsuff ON  
  dmv_os_addbase_residential (concat((pao_start_number :: text) || pao_start_suffix))

но та же ошибка.

Правильно ли я определил причину ошибки и как ее устранить? Я использую Postgres 9.6


person mapping dom    schedule 26.07.2017    source источник


Ответы (2)


Ты наверное хочешь

CREATE INDEX idx_concat_paostartno_paostartsuff
   ON dmv_os_addbase_residential ((pao_start_number || pao_start_suffix));

Этот индекс можно использовать только для таких запросов, как

SELECT *
FROM dmv_os_addbase_residential
WHERE pao_start_number || pao_start_suffix <operator> <constant>;

где <operator> - одно из =, <, <=, > или >=.

person Laurenz Albe    schedule 26.07.2017
comment
Да, спасибо. Я вижу, что "CONCAT" было частью моей проблемы, почему? - person mapping dom; 26.07.2017
comment
Оператор || - это IMMUTABLE, а функция concat - STABLE. Причина в том, что concat может работать с типом any аргумента, приводя аргументы к text, и не все преобразования типов к text равны IMMUTABLE (например, приведение от timestamp with time zone к text зависит от параметра TimeZone). - person Laurenz Albe; 26.07.2017

Отметки времени с учетом часовых поясов считаются изменяемыми Postgres. Вот почему он терпит неудачу. Я нашел следующий GIST, который решил проблему для меня: https://gist.github.com/cobusc/5875282

ярлык для содержимого GIST (спасибо, cobusc):

CREATE INDEX my_index_name_idx ON my_table (date(created_ts at TIME ZONE 'UTC'));

работал на меня

person Stephan Doliov    schedule 27.04.2018