Postgres- «ОШИБКА: выражение генерации не является неизменным» почему мое выражение не является неизменным?

#postgresql #full-text-search #immutability

Вопрос:

Я пытаюсь создать индекс для текстового поиска в Postgres, но я продолжаю получать сообщение об ошибке при создании сгенерированного столбца tsvector.

 ERROR:  generation expression is not immutable
SQL state: 42P17
 

У меня есть столбец «заголовок» текста и столбец «авторы» текста []. Я пытаюсь объединить их, чтобы создать столбец tsvector

Вот код, который выдает ошибку

 ALTER TABLE book
    ADD COLUMN tscol tsvector
        GENERATED ALWAYS AS (to_tsvector(title || ' ' || immutable_array_to_string(coalesce(authors, '{}'), ' '))) STORED;
 

Код для функции immutable_array_to_string:

 CREATE OR REPLACE FUNCTION immutable_array_to_string(text[], text) 
    RETURNS text as $ SELECT array_to_string($1, $2); $ 
LANGUAGE sql IMMUTABLE;
 

Ответ №1:

Вы звоните to_tsvector без a regconfig , поэтому используется значение по умолчанию. В таком случае функция является единственной stable . Если вы хотите, чтобы он был неизменным, вы должны пройти regconfig .

 to_tsvector('english',title || ' ' || immutable_array_to_string(coalesce(authors, '{}'), ' ')) 
 

PS: вы можете позвонить df to_tsvector , чтобы увидеть изменчивость функции с разными сигнатурами.

Комментарии:

1. Спасибо!!! Теперь я вижу свою ошибку. Также спасибо за совет df to_tsvector :)))