You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL jsonb_agg函数报错:operator & does not exist 求助

排查与解决步骤

1. 检查目标数据库是否存在自定义jsonb_agg聚合函数

内置jsonb_agg属于pg_catalog系统模式,若异常数据库中存在同名自定义聚合函数,会覆盖内置逻辑导致错误。执行以下查询确认:

SELECT p.proname, p.prosrc, pg_get_function_arguments(p.oid)
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE proname = 'jsonb_agg' AND n.nspname NOT IN ('pg_catalog', 'information_schema');

若查询返回结果,直接删除或重命名该自定义聚合函数:

DROP AGGREGATE IF EXISTS public.jsonb_agg(jsonb); -- 替换为实际的模式与参数类型

2. 验证jsonb - text内置运算符是否正常

错误提示中的jsonb & jsonb异常,大概率是jsonb - 'a'的运算符解析出错导致。执行以下查询检查内置运算符:

SELECT oprname, oprleft::regtype, oprright::regtype, oprcode
FROM pg_operator
WHERE oprname = '-' AND oprleft = 'jsonb'::regtype AND oprright = 'text'::regtype;

若未返回结果,说明该内置运算符丢失,可从正常数据库复制定义在异常库中执行:

CREATE OPERATOR - (
    LEFTARG = jsonb,
    RIGHTARG = text,
    PROCEDURE = jsonb_delete_key,
    COMMUTATOR = NONE
);

3. 对比jsonb_agg_statef函数定义

错误指向jsonb_agg_statef状态转换函数,该函数是内置jsonb_agg的核心组件。分别在正常与异常数据库执行以下查询,对比返回的函数体与参数:

SELECT prosrc, pg_get_function_arguments(oid)
FROM pg_proc WHERE proname = 'jsonb_agg_statef';

若异常库中函数定义与正常库不符,说明函数被篡改,可从正常库复制正确定义重新创建,或通过重新初始化系统对象恢复(操作前需备份数据)。

4. 检查数据库搜索路径配置

若自定义对象所在模式的搜索优先级高于pg_catalog,会导致系统内置对象被忽略。执行以下查询查看当前搜索路径:

SHOW search_path;

确保pg_catalog位于搜索路径最前端,若不符合则修改配置:

ALTER DATABASE your_db_name SET search_path = pg_catalog, public;

修改后需重新连接数据库生效。


内容的提问来源于stack exchange,提问作者andynqd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:18:17