跳转到主要内容

22036 — non_numeric_sql_json_item

PostgreSQL SQLSTATE 22036 的来源与诊断参考。

22036

速览

JSON 路径项方法收到的值不满足数值或转换约束。固定路径覆盖 .number().decimal().integer().bigint().double().boolean().abs().floor().ceiling(),以及 .string() 的相应类型检查。

字段
SQLSTATE 22036
条件名 non_numeric_sql_json_item
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_NON_NUMERIC_SQL_JSON_ITEM
别名

报文

固定 jsonpath 方法的代表性首要报文如下:

触发条件 首要报文
.abs().floor().ceiling() 收到非数值项 jsonpath item method .%s() can only be applied to a numeric value
转换方法收到的既不是字符串也不是数值项 jsonpath item method .%s() can only be applied to a string or numeric value
.boolean() 收到不支持的项 jsonpath item method .%s() can only be applied to a boolean, string, or numeric value
字符串或数值不能转换为目标类型 argument "%s" of jsonpath item method .%s() is invalid for type %s
数值转换得到 NaN 或 Infinity NaN or Infinity is not allowed for jsonpath item method .%s()
.string() 收到不支持的项 jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value

含义

jsonpath 执行器会按输入类型分派各项方法。.integer().bigint().double() 以及 .number()/.decimal() 处理字符串输入时,会使用目标输入例程或数值解析,并通过 ErrorSaveContext 或显式错误标志记录失败。已有数值项走各自分支:.number() 可直接保留数值,.integer().bigint() 使用 numeric_int4_opt_error/numeric_int8_opt_error.decimal() 再应用精度/小数位 typmod。.boolean() 直接接受布尔值,用 int4in 转换数值,用 parse_bool 解析字符串;.abs().floor().ceiling() 要求数值标量。数值和 double 路径拒绝 NaN 或 Infinity。.string() 的约束更宽,可接受布尔、字符串、数值或日期时间项;只有路径模式允许时才会解包数组。

诊断

查看首要报文中的方法名、项类型和值。区分字符串解析和已有数值项:.number() 可直接处理已有数值,.integer()/.bigint() 做数值范围检查,.decimal() 可能应用精度/小数位 typmod,.boolean() 有直接、数值和 parse_bool 分支。对象、数组或不支持的项属于类型问题。若方法拒绝非有限数值,应在调用前移除或拦截它。不要把 make_numeric_typmod_safe 的所有底层精度/小数位诊断都归为 22036,只保留已展示的 jsonpath 报错分支。不要把本码与一元算术操作数检查条件 2203B,或 JSON 路径日期时间方法 22031 混淆。

处理

修改路径以选中预期标量,在转换前规范化文档,或改用符合该值输入约束的方法。若源数据可能变化,应在调用方法前验证数值文本和有限性。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的转换和项方法路径来自 PostgreSQL 18.6。本页未声称有自然运行观察。

2203B2203122038

来源

数值项方法检查条件见 jsonpath_exec.c#L1129-1588.string() 类型约束见 #L1592-1647,只接受数值的方法见 #L2280-2310。strict/lax 与抛出/返回宏见 #L235-249。结构化证据记录绑定这些检查条件和报文;本页未运行自然案例。