PG::UndefinedFunction: ERROR: function array_append(anyarray, anyelement) does not exist

5
在我的应用程序中,我们有几个测试用例配置了GitHub工作流程,即使我只对文件进行空格相关的更改,但仍然会出现以下错误。不确定为什么我的规范仍然失败,之前它一直正常工作。
An error occurred in a `before(:suite)` hook.
Failure/Error: ActiveMedian.create_function

ActiveRecord::StatementInvalid:
  PG::UndefinedFunction: ERROR:  function array_append(anyarray, anyelement) does not exist
  :       CREATE OR REPLACE FUNCTION median(anyarray)
           RETURNS float8 AS
        $$
          WITH q AS
          (
             SELECT val
             FROM unnest($***) val
             WHERE VAL IS NOT NULL
             ORDER BY ***
          ),
          cnt AS
          (
            SELECT COUNT(*) AS c FROM q
          )
          SELECT AVG(val)::float8
          FROM
          (
            SELECT val FROM q
            LIMIT  2 - MOD((SELECT c FROM cnt), 2)
            OFFSET GREATEST(CEIL((SELECT c FROM cnt) / 2.0) - ***,0)
          ) q2;
        $$
        LANGUAGE sql IMMUTABLE;

        DROP AGGREGATE IF EXISTS median(numeric);
        DROP AGGREGATE IF EXISTS median(double precision);
        DROP AGGREGATE IF EXISTS median(anyelement);
        CREATE AGGREGATE median(anyelement) (
          SFUNC=array_append,
          STYPE=anyarray,
          FINALFUNC=median,
          INITCOND='{}'
        );
# ./spec/rails_helper.rb:***54:in `seed'
# ./spec/rails_helper.rb:***:in `block (2 levels) in <top (required)>'
# ------------------
# --- Caused by: ---

# PG::UndefinedFunction:
#   ERROR:  function array_append(anyarray, anyelement) does not exist
#   ./spec/rails_helper.rb:***54:in `seed'

spec/rails_helper.rb中有一个ActiveMedian.create_function,可能导致了问题。

如果有任何线索或建议,将不胜感激。


请问您能否在问题中添加更多细节,例如 create_function、Rails、PostgreSQL,以及您已经尝试过的事情等等? - Abhinay
你使用的是哪个版本的PostgreSQL? - Laurenz Albe
你正在使用一个pg函数,所以你应该检查一下这个函数是否存在于你的测试数据库中。-- 我指的是array_append - Moussa
2个回答

9
你正在使用PostGreSQL 14,对吗?
因为在postgres 13及之前版本,这应该是可行的,可以查看在 dbfiddle中的测试结果。
我确认在postgres 14中,这不起作用,请参见dbfiddle中的测试结果。
原因在PostGres 14手册中有解释:
用户定义的对象引用了某些内置数组函数以及它们的参数类型必须被重新创建 (Tom Lane)
具体来说,array_append(), array_prepend(), array_cat(), array_position(), array_positions(), array_remove(), array_replace(), 和width_bucket() 以前接受任何数组参数,但现在接受一致性数组。因此,引用这些数组函数签名的聚合和操作符等用户定义的对象必须在升级之前删除,并在升级完成后重新创建。
要使其工作,你可以改为:
CREATE OR REPLACE FUNCTION median(anycompatiblearray)
RETURNS float8 AS
$$
...
$$ LANGUAGE sql IMMUTABLE ;

...

CREATE AGGREGATE median(anycompatible) (
  SFUNC=array_append,
  STYPE=anycompatiblearray,
  FINALFUNC=median,
  INITCOND='{}'
);

0

经过一番研究,我已通过在GitHub上更改Postgres镜像版本的方式解决了这个问题。

文件.github/workflows/build.yml

services:
      postgres:
        image: postgres:13
        ports:
          - 5432:5432
解决方案:这是Postgres 14版本的问题,为了快速解决,请将其降级到Postgres 13。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接