Ошибка "функции в выражении индекса должны быть помечены как IMMUTABLE", а не как отметка времени

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

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

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> один из =, <, <=, > или же >=,

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'));

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

Другие вопросы по тегам