【问题标题】:PG::UndefinedFunction: ERROR: function array_append(anyarray, anyelement) does not existPG::UndefinedFunction: 错误: 函数 array_append(anyarray, anyelement) 不存在
【发布时间】:2021-12-06 12:03:08
【问题描述】:

在我的应用程序中,我们几乎没有使用 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、postgres,以及您已经尝试过的东西等?
  • 您使用的是哪个版本的 PostgreSQL?
  • 您正在使用 pg 函数,因此您应该检查该函数是否存在于您的测试数据库中。 -- 我说的是array_append

标签: ruby-on-rails ruby postgresql github rspec


【解决方案1】:

您使用的是 PostGreSQL 14,不是吗?

因为使用 postgres 13 及之前的版本,这应该可以工作,请参阅dbfiddle 中的测试结果。

我确认这不适用于 postgres 14,请参阅dbfiddle 中的测试结果。

原因在PostGres 14 manual中有解释:

引用某些内置数组函数的用户定义对象 必须重新创建参数类型及其参数类型 (Tom Lane)

具体来说,array_append()、array_prepend()、array_cat()、 数组位置(),数组位置(),数组删除(),数组替换(), 和 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='{}'
);

【讨论】:

    【解决方案2】:

    经过一番研究,我通过在 GitHub 上更改 Postgres 图像版本解决了这个问题,如下所示。

    文件.github/workflows/build.yml

    services:
          postgres:
            image: postgres:13
            ports:
              - 5432:5432
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2013-12-15
      相关资源
      最近更新 更多