选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

42622 name_too_long

名称过长

ERROR 源码确认 参考 未实测

条件名
name_too_long
宏名称
ERRCODE_NAME_TOO_LONG
启用版本
7.4
状态
活跃

版本覆盖

速览

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

含义

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

诊断

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

处理

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

可复现案例

在一次性实例上执行过的场景。

identifier_too_long_boundary PG 10 / 18

前置条件

  • The fixed REL_18_6 and REL_10_23 source paths are available.

触发

No ordinary SQL cast is claimed: fixed source shows 42622 in binary name receive, while text casts truncate identifiers before that path.

处置

Use a protocol path that validates the name value before retrying, or keep long user text outside the name type.

清理

No persistent objects; close the runner connection.

报文

固定扫描器分支以明确的 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 路径。

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 identifier too long
DETAIL Identifier must be less than %d characters.

来源:src/backend/utils/adt/name.c @ REL_18_6 · src/backend/utils/adt/name.c @ REL_10_23

适用范围:Only the binary name receive path is source-confirmed here.

主消息 · REL_18_6 identifier "%s" will be truncated to "%.*s"
主消息 · REL_10_23 identifier "%s" will be truncated to "%s"

来源:src/backend/parser/scansup.c @ REL_18_6 · src/backend/parser/scansup.c @ REL_10_23

适用范围:Scanner identifier path only; 18.6 and 10.23 use different formatting for the clipped second value.

代表案例

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

版本

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

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。