代码之家  ›  专栏  ›  技术社区  ›  svoop

创建concat-ws的不可变克隆

  •  1
  • svoop  · 技术社区  · 6 年前

    This blog post 显示如何创建 immutable_concat Pg的职能:

    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或空)。

    我这里缺什么?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Erwin Brandstetter    6 年前

    弗斯特 ,函数需要 定义中的参数,如Richard已经建议的,并且您相应地更新了您的问题。

    第二 ,您可以使用 "any" 输入使用 LANGUAGE internal . 但这并不意味着你应该。

    concat_ws() 只是 STABLE 这是有原因的。其中,文本表示 date timestamp 取决于区域设置/日期样式设置,因此结果不是 不变的 . 在此基础上构建的索引可能会安静地中断。限于 text 输入,声明它是安全的 IMMUTABLE . 因为你只需要 文本 输入(或) varchar ,其中隐式强制转换为 文本 )将其限制在您的用例中并确保安全:

    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') . 这将重新引入调用中所说的依赖项。

    相关:

        2
  •  1
  •   Richard Huxton    6 年前

    好吧,那么你要映射到内部的“c”函数,我必须承认,我从未做过自己的工作。

    然而, text_concat_ws 是“带分隔符”的,因此它不只是采用文本参数的可变列表-它 takes a separator THEN the variadic list of text 争论。相应地调整函数定义。

    如果您打算这样做,您可能希望将调试程序挂接到后端,或者在可行的情况下运行单个进程。

    另外-我刚刚找到了PostgreSQL源代码的doxygen接口来回答您的问题。谢谢: