# 42622 — 名称过长（name_too_long）

> PostgreSQL SQLSTATE 42622（名称过长，name_too_long）的源码证据、诊断与处理参考。
---

# 42622 — 名称过长

## 速览 {#at-a-glance}

SQLSTATE `42622` 是 Class `42` 中的 **name_too_long**。`42622` 表示名称过长。固定源码路径包括超长 SQL 标识符的扫描器 NOTICE 和二进制 `name` 接收 `ERROR`；普通文本输入也可能直接截断而不产生这两种诊断。

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

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

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

## 含义 {#meaning}

`42622` 表示名称过长，并有不止一个 producer。二进制 `name` 接收函数 `namerecv` 通过 `pq_getmsgtext` 读取外部文本，把字节数与 `NAMEDATALEN` 比较，并在复制值前以 `ERROR` 发出 `identifier too long` 和长度 DETAIL。解析器的 `truncate_identifier` 路径不同：它把超长 SQL 标识符截到多字节边界，然后由扫描器以 `warn = true` 调用时发出带 SQLSTATE `42622` 的 `NOTICE`，说明标识符将被截断。普通文本输入走独立的 `namein`，可能静默截断，不会进入 `namerecv`。

## 诊断 {#diagnosis}

先区分输入边界和 severity。二进制类型接收失败有 `identifier too long` 主报文和长度 DETAIL；SQL 标识符可能产生包含原名与截断名的 `NOTICE`；text cast 到 `name` 则可能静默截断。二进制输入要记录 format code 和 type OID，扫描器输入则记录准确 SQL 标识符和服务器 NOTICE。本批有意没有选定自然 runtime：选定版本的 text cast 会截断，不能把它当成任一源码分支的证据。固定 guard 不表示每个超长值或标识符都属于同一已观察路径。

## 处理 {#response}

在相应输入边界执行长度校验，把较长应用值存为 text 或其他合适类型。如果二进制客户端确实发送了超长 `name` 值，应在该边界修复编码器或应用 schema；如果问题是扫描器 NOTICE，就缩短或重命名 SQL 标识符并检查目录中的最终名称。不要用 `RAISE` 伪造此码，不要把静默文本截断当作证据，也不要把一种 severity/path 改报成另一种。

## 报文 {#messages}

固定扫描器分支以明确的 `NOTICE` 和 SQLSTATE `42622` 发出主报文。REL_18_6 的原始主报文模板是 `identifier "%s" will be truncated to "%.*s"`；REL_10_23 是 `identifier "%s" will be truncated to "%s"`。固定 `namerecv` 分支以明确的 `ERROR` 发出主报文 `identifier too long` 和 DETAIL `Identifier must be less than %d characters.`；`%d` 在该源码路径中是 `NAMEDATALEN`。两者都只在本页确认源码边界，文本输入路径可能静默。只有客户端异常或 NOTICE 而没有服务器 SQLSTATE 及对应扫描器/二进制上下文时，不能识别某个 `42622` 路径。

## 代表案例 {#case}

本页没有选定的自然 SQL 运行；这里只记录固定源码边界，不使用伪造触发器。

## 版本 {#versions}

本页没有选定的自然 SQL 运行；固定的 REL_18_6/REL_10_23 源码边界不能证明所有中间版本的行为。

## 相关 {#related}

- [`42601` — 语法错误](../42601/)

## 来源 {#sources}

- `src.errcodes.18.6` — fixed `errcodes.txt` definition at commit `724edf9bde9d356724ad384a2e196edc3c9f80f7`; SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt)).
- `src.name-recv-too-long.18.6` — `src/backend/utils/adt/name.c` at `REL_18_6` commit `724edf9bde9d356724ad384a2e196edc3c9f80f7`; fixed blob SHA-256 `4c4b4dc71f55ba73dbc24dd94b3385986fdb3179702b3d100cbad7ab00db7762` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/name.c#L91-L95)).
- `src.name-recv-too-long.10.23` — `src/backend/utils/adt/name.c` at `REL_10_23` commit `02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4`; fixed blob SHA-256 `7c7da791e528aafdbf26930cd4bd34386806818c19d2ee4b78bbe138b93f4a84` ([source](https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/utils/adt/name.c#L89-L93)).
- `src.identifier-truncate.18.6` / `src.identifier-truncate.10.23` — fixed parser `truncate_identifier` NOTICE 分支；blob SHA-256 `99cc6839927c19a9f85a1e5fbc8e848b376a7073477a04a0bbfe106ecdb2273f` / `3c59a33f3cb5eaa0c3932859eb15e927f459a5feb5f40ca96fef5ef74495d67c` ([18.6 source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/scansup.c#L91-L102), [10.23 source](https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/parser/scansup.c#L187-L208)).
- `src.calls.REL_18_6` / `src.calls.REL_10_23` — fixed call scans, SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf` / `00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c`.
