Postgres-“错误:生成表达式不是不可变的”为什么我的表达式不是不可变的?

Noo*_*ife 5 postgresql full-text-search immutability

我正在尝试在 Postgres 中创建用于文本搜索的索引,但在创建生成的 tsvector 列时不断收到错误。

ERROR:  generation expression is not immutable
SQL state: 42P17
Run Code Online (Sandbox Code Playgroud)

我有一个文本“标题”列和文本[]“作者”列。我正在尝试将两者结合起来创建一个 tsvector 列

这是出现错误的代码

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

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;
Run Code Online (Sandbox Code Playgroud)

JGH*_*JGH 12

您调用时to_tsvector没有使用regconfig,因此使用默认的。在这种情况下,该功能仅是stable. 如果您希望它不可变,则必须通过regconfig.

to_tsvector('english',title || ' ' || immutable_array_to_string(coalesce(authors, '{}'), ' ')) 
Run Code Online (Sandbox Code Playgroud)

PS:可以调用\df+ to_tsvector查看不同签名的函数的波动性。