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
相关产品推荐
相关产品推荐

