如何更改 array_agg() 以在 PostgreSQL 中的空输入上返回空数组?

tin*_*lyx 6 postgresql aggregate array

我正在尝试编写一个 PostgreSQL array_agg() 变体,它返回空数组'{}'而不是 NULL。为了避免自定义聚合函数对性能的影响CREATE AGGRGATE,我尝试重新使用内置的array_agg_transfnarray_agg_finalfn从文档中的代码示例开始,类似于 array_agg 的初始版本可以工作(作为数据库超级用户):

CREATE AGGREGATE array_agg_z (anynonarray)
(
    sfunc = array_agg_transfn,
    stype = internal,
    finalfunc = array_agg_finalfn,
    finalfunc_extra
);
Run Code Online (Sandbox Code Playgroud)

它按预期在空输入上返回 NULL:

=> SELECT array_agg_z(i) IS NULL FROM (SELECT 0 WHERE 1 = 2) t(i);
 ?column? 
----------
 t
(1 row)
Run Code Online (Sandbox Code Playgroud)

现在,要更改array_agg_z()为在空输入上返回空数组,我尝试将其设置initcond'{}'如下:

CREATE AGGREGATE array_agg_z (anynonarray)
(
    sfunc = array_agg_transfn,
    stype = internal,
    finalfunc = array_agg_finalfn,
    initcond = '{}',
    finalfunc_extra
);
Run Code Online (Sandbox Code Playgroud)

现在它给出了一个错误:

=> SELECT array_agg_z(i) IS NULL FROM (SELECT 0 WHERE 1 = 2) t(i);
ERROR:  cannot accept a value of type internal
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

或者我是否必须破解相关的 C 源代码才能array_agg()制作此变体?

顺便说一句,这是 PostgreSQL 12 的情况。