# 22015 — interval_field_overflow

> PostgreSQL SQLSTATE 22015 的来源与诊断参考。
---

## 速览 {#at-a-glance}
interval 输入字段超出 interval 解码器接受的范围。PostgreSQL 18.6 将这一日期时间解析条件映射为 SQLSTATE `22015`；后续 interval 构造或算术运算可能使用其他范围码。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| 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` |
| 别名 | `—` |

<!-- source facts: data/errcodes/22015.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
固定的 `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`。

## 诊断 {#diagnosis}
阅读完整 primary，确认输入字符串、interval 字段和声明的 typmod/范围。区分字段解码时溢出，还是后续构造、缩放或除 interval 时才失败。日期时间字段诊断属于相邻的日期时间错误码，interval 除以零因子属于 `22012`。不要用一般数值溢出修复替代字段范围问题。

## 处理 {#response}
修正报文指出的 interval 字段或输入表示，使其落在操作接受的范围内；如果边界来自 interval typmod，也要复核该约束。如果失败发生在后续算术中，应按它自己的 SQLSTATE 修复。普通错误上下文中该路径抛出 `ERROR`，显式事务需先 `ROLLBACK` 或 `ROLLBACK TO SAVEPOINT` 再重试；调用方提供 `ErrorSaveContext` 时，错误会被保存，调用返回 NULL/失败而不是抛出。

## 报文 {#messages}
- 普通上下文为 `ERROR` 的 primary：`interval field value out of range: "%s"`，其中 `%s` 是原始 interval 输入。引用分支没有固定 DETAIL 或 HINT。

## 版本 {#versions}
锁定目录从 7.4 起记录该条件；固定源码覆盖 PostgreSQL 18.6。源码确认的路径是 interval 输入解码，不声称所有 interval 算术溢出都使用 `22015`。

## 相关 {#related}
[`22007`](../22007/)、[`22003`](../22003/)、[`22008`](../22008/)、[`22012`](../22012/)

## 来源 {#sources}
- [`src/backend/utils/adt/timestamp.c#L884-L967`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/timestamp.c#L884-L967) 包含 `interval_in`、typmod 范围选择、日期时间解码、`DTERR_FIELD_OVERFLOW` 重映射和后续 `itmin2interval` 范围分支。
- [`src/backend/utils/adt/datetime.c#L4195-L4266`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/datetime.c#L4195-L4266) 把 `DTERR_INTERVAL_OVERFLOW` 映射为确切的 `22015` primary，并说明 `errsave` 会填充 `ErrorSaveContext` 而不是抛错。

运行核验为 `not_run`；本页不宣称 interval 运行观察。结构化[证据记录](../../data/evidence/22015.json)保留确切报文角色和源码边界。
