PG::UndefinedFunction: ERROR: function array_append(anyarray



在我的应用程序中,我们有几个测试用例配置了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可能导致问题。

如有任何指引或建议,不胜感激

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

因为对于postgres 13和之前的版本,这应该可以工作,请参见dbfiddle中的测试结果。

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

原因在PostGres 14手册中有解释:

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

,array_append (), array_preend (), array_cat(),Array_position (), array_positions(), array_remove(), array_replace(),和width_bucket()过去接受任何数组参数,但现在接受anycompatiblearray. 因此,像聚合这样的用户定义对象引用这些数组函数签名的操作符必须是升级前删除,升级完成后重新创建。

要使它工作,你可以这样做:

CREATE OR REPLACE FUNCTION median(anycompatiblearray)
RETURNS float8 AS
$$
...
$$ LANGUAGE sql IMMUTABLE ;
...
CREATE AGGREGATE median(anycompatible) (
SFUNC=array_append,
STYPE=anycompatiblearray,
FINALFUNC=median,
INITCOND='{}'
);

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

文件.github/工作流/build.yml

services:
postgres:
image: postgres:13
ports:
- 5432:5432
<<p>解决方案/strong>:这是Postgres 14版本的问题,为了快速解决,降级到Postgres 13。