# 22023 — invalid_parameter_value

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

# 22023

## 速览 {#at-a-glance}
当点名的参数、选项、描述符或函数参数超出所属实现的值域时会使用本码。固定代表包括内置 GUC 解析、amcheck 描述符/选项、postgres_fdw 选项校验和正则选项检查；首要报文会指出归属和数值。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `22023` |
| 条件名 | `invalid_parameter_value` |
| 状态 | `有效` |
| 已知存在于 | `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_INVALID_PARAMETER_VALUE` |
| 别名 | `—` |

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

保留的 PostgreSQL 18.6 与 10.21 观察使用同一自动提交案例：`SET work_mem = 'not-a-memory-size'` 返回 SQLSTATE `22023` 和 `invalid value for parameter "work_mem": "not-a-memory-size"`；`SET work_mem = '1MB'` 修复，`SHOW work_mem` 返回 `1MB`。两个后端在错误和修复后均为 `IDLE`。该案例只绑定内置 GUC 路径，不代表所有 22023 归属；见[公共 case JSON](../../data/cases/22023.json)。

<!-- BEGIN SQLSTATE SNIPPET: invalid_work_mem_parameter -->
```sql
SET work_mem = 'not-a-memory-size';
SET work_mem = '1MB';
SHOW work_mem;
```
<!-- END SQLSTATE SNIPPET -->

## 代表性报文 {#messages}
这些示例共用 22023，但属于不同归属：

| 归属/路径 | 代表性首要文本 |
| --- | --- |
| 内置 GUC 解析/检查 | `parameter "%s" requires a Boolean value`；`invalid value for parameter "%s": "%s"` |
| `verify_heapam` | `relation cannot be null`；`invalid skip option` — HINT：`Valid skip options are "all-visible", "all-frozen", and "none".` |
| `postgres_fdw` | `invalid value for floating point option "%s": %s`；`invalid value for integer option "%s": %s` |
| 正则选项解析器 | `invalid regular expression option: "%.*s"` |

## 含义 {#meaning}
22023 是多个参数校验机制共用的代码，实际机制取决于报文指出的归属。内置 GUC 先把 Boolean、整数、实数、字符串或 enum 转换，检查整数/实数范围和 B/MB 或时间单位，再调用参数专属 check hook；设置上下文和权限是独立约束。`verify_heapam` 则检查必填非 NULL 描述符和枚举式 skip 值，`postgres_fdw` 解析数值/字符串选项与正值边界，regexp 函数校验 option 字母或函数参数。这些组共享 SQLSTATE，却不共享一个通用值域。

## 诊断 {#diagnosis}
先按首要报文定位命令、函数或扩展。对于 GUC，检查参数类型、允许单位/范围以及当前设置上下文；对于扩展或函数，按其自身选项和边界处理。上面的 `work_mem` 只证明错误 GUC 值与带单位修复值的一条路径，不能用来推断 amcheck、postgres_fdw、regexp 或其他参数的修复。

## 处理 {#response}
按所属参数的文档值域修正值，必要时同时修正单位和设置上下文。显式事务中的语句级 ERROR 后，必须 ROLLBACK 或 ROLLBACK TO SAVEPOINT 才能继续；自动提交客户端可重试修正后的动作。保留的自动提交案例中，同一后端在错误和修复后保持 IDLE。

## 版本 {#versions}
锁定目录从 7.4 起记录该条件；固定源码覆盖 PostgreSQL 18.6。保留的观察覆盖 PostgreSQL 18.6 与 10.21 上述 work_mem 案例。

## 相关 {#related}
[`22003`](../22003/)、[`22025`](../22025/)

## 来源 {#sources}
内置 GUC 转换/范围/check-hook 路径见 [`src/backend/utils/misc/guc.c#L3129-3320`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/guc.c#L3129) 与 [`#L6804-6990`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/guc.c#L6804)；单位表见 [`#L87-181`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/guc.c#L87)，设置上下文处理见 [`#L3342-3430`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/guc.c#L3342)，另见 [`contrib/amcheck/verify_heapam.c#L271-303`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/amcheck/verify_heapam.c#L271)、[`contrib/postgres_fdw/option.c#L149-185`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/postgres_fdw/option.c#L149)、[`src/backend/utils/adt/regexp.c#L443-446`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/regexp.c#L443)。结构化[证据记录](../../data/evidence/22023.json)保留确切报文、运行摘要和各归属边界。
