22015 — interval_field_overflow
速览
interval 输入字段超出 interval 解码器接受的范围。PostgreSQL 18.6 将这一日期时间解析条件映射为 SQLSTATE 22015;后续 interval 构造或算术运算可能使用其他范围码。
| 字段 | 值 |
|---|---|
| SQLSTATE | 22015 |
| 条件名 | interval_field_overflow |
| 状态 | 有效 |
| 已知存在于 | 7.4 |
| 锁定快照 | 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3 |
| 宏 | ERRCODE_INTERVAL_FIELD_OVERFLOW |
| 别名 | — |
含义
固定的 interval_in 路径先解析输入,再按 typmod 范围解码 interval 字段;第一次解析返回格式错误时还会尝试 ISO 8601。解码返回 DTERR_FIELD_OVERFLOW 时,interval_in 将其改为 DTERR_INTERVAL_OVERFLOW;随后 DateTimeParseError 用 ERRCODE_INTERVAL_FIELD_OVERFLOW 把原始输入放进 primary。这是 interval 字段输入边界。itmin2interval 转换失败、typmod 调整和 interval 算术有独立 guard,可能报告 22008、22003 或其他条件,不会自动变成 22015。
诊断
阅读完整 primary,确认输入字符串、interval 字段和声明的 typmod/范围。区分字段解码时溢出,还是后续构造、缩放或除 interval 时才失败。日期时间字段诊断属于相邻的日期时间错误码,interval 除以零因子属于 22012。不要用一般数值溢出修复替代字段范围问题。
处理
修正报文指出的 interval 字段或输入表示,使其落在操作接受的范围内;如果边界来自 interval typmod,也要复核该约束。如果失败发生在后续算术中,应按它自己的 SQLSTATE 修复。普通错误上下文中该路径抛出 ERROR,显式事务需先 ROLLBACK 或 ROLLBACK TO SAVEPOINT 再重试;调用方提供 ErrorSaveContext 时,错误会被保存,调用返回 NULL/失败而不是抛出。
报文
- 普通上下文为
ERROR的 primary:interval field value out of range: "%s",其中%s是原始 interval 输入。引用分支没有固定 DETAIL 或 HINT。
版本
锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。源码确认的路径是 interval 输入解码,不声称所有 interval 算术溢出都使用 22015。
相关
来源
src/backend/utils/adt/timestamp.c#L884-L967包含interval_in、typmod 范围选择、日期时间解码、DTERR_FIELD_OVERFLOW重映射和后续itmin2interval范围分支。src/backend/utils/adt/datetime.c#L4195-L4266把DTERR_INTERVAL_OVERFLOW映射为确切的22015primary,并说明errsave会填充ErrorSaveContext而不是抛错。
运行核验为 not_run;本页不宣称 interval 运行观察。结构化证据记录保留确切报文角色和源码边界。