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)
,一种胶水(文本或varchar)和一个或多个部分(文本,varchar或null)。
我在这里想念什么?
答案 0 :(得分:1)
好的,因此您正在映射到内部的“ C”函数,我必须承认我从来没有做过自己。
但是,text_concat_ws
是带分隔符的,因此它不只是带有可变参数的文本参数列表,还包括takes a separator THEN the variadic list of text个参数。相应地调整函数定义。
如果要这样做,您可能希望将调试器挂接到后端,或者在可行的情况下以单个进程运行它。
也-我刚找到PostgreSQL源代码的doxygen接口来回答您的问题。谢谢:-)
答案 1 :(得分:1)
首先,该函数在定义中需要两个参数,就像Richard已经建议的那样,并且您相应地更新了问题。
第二,您可以使用"any"
通过LANGUAGE internal
输入创建该函数。不过,这并不意味着您应该这样做。
concat_ws()
仅是STABLE
,这是有原因的。其中date
或timestamp
的文本表示取决于语言环境/日期样式设置,因此结果不是不可变。基于此的索引可能会无提示地中断。限于text
输入,可以安全地声明为IMMUTABLE
。
由于您只需要text
输入(或varchar
,其隐式转换为text
),因此请限制在您的用例中,并且是安全的:
CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE;
抵制这样做immutable_concat_ws('|', now()::text, 'foo')
的诱惑。这将重新引入呼叫中的所述依赖性。
相关: