gpt4 book ai didi

postgresql - 创建 concat_ws 的不可变克隆

转载 作者:行者123 更新时间:2023-11-29 12:40:11 29 4
gpt4 key购买 nike

This blog post显示了如何在 Pg 中创建 immutable_concat 函数的示例:

CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
RETURNS text AS 'text_concat'
LANGUAGE internal IMMUTABLE

我想对 concat_ws 做同样的事情,并且相应的 text_concat_ws 确实存在,但是,以下只会使进程崩溃:

CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
RETURNS text AS 'text_concat_ws'
LANGUAGE internal IMMUTABLE

更新:immutable_concat_ws 的符号应该是(glue, *parts),一个胶水(text 或 varchar)和一个或多个部分(text,varchar 或 null ).

我在这里错过了什么?

最佳答案

首先,该函数在定义中需要两个参数,就像 Richard 已经建议的那样,您相应地更新了您的问题。

其次,您可以使用 LANGUAGE internal 使用 “any” 输入创建该函数。不过,这并不意味着您应该这样做。

concat_ws() 只是 STABLE 是有原因的。其中,datetimestamp 的文本表示取决于 locale/datestyle 设置,因此结果不是不可变的。以此为基础的索引可能会悄无声息地崩溃。仅限于 text 输入,将其声明为 IMMUTABLE 是安全的。由于您只需要 text 输入(或 varchar,它隐式转换为 text),请将其限制在您的用例中并确保安全:

CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text
LANGUAGE internal IMMUTABLE PARALLEL SAFE AS
'text_concat_ws';

创建LANGUAGE 内部 函数需要 super 用户 权限。如果那不是一个选项,那么下一个最好的事情就是 SQL 函数,例如:

在 Postgres 9.6 或更高版本(符合条件!)中将其标记为 PARALLEL SAFE 以在涉及此函数时启用并行性。 The manual:

all user-defined functions are assumed to be parallel unsafe unless otherwise marked.

抵制做这样的事情的诱惑 immutable_concat_ws('|', now()::text, 'foo')。这将在调用中重新引入所述依赖项。

相关:

关于postgresql - 创建 concat_ws 的不可变克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372666/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com