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

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

文档 / SQL 状态码 / Class 42 语法错误或访问规则冲突

42602 invalid_name

名称无效

ERROR 已实测 参考 实测通过

条件名
invalid_name
宏名称
ERRCODE_INVALID_NAME
启用版本
7.4
状态
活跃

版本覆盖

速览

SQLSTATE 42602 是 Class 42 中的 invalid_name42602 表示名称无效。选定的 enum 路径拒绝 64 字节标签,主报文为 invalid enum label "%s",并给出长度 DETAIL;随后可以添加短标签。

含义

42602 表示名称无效。在 AddEnumLabel 中,PostgreSQL 会在修改目录前把输入的 enum 标签与 NAMEDATALEN - 1 比较。选定的 64 字节标签因此产生明确的 ERROR,主报文为 invalid enum label "%s",并给出长度 DETAIL;随后可以添加短标签。这是 enum 标签的具体路径,不能据此断言所有无效对象名称都由同一 producer 产生。

诊断

检查对象类型以及 DETAIL 中的准确长度措辞。本批在 18.6 与 10.21 观察 enum 标签路径:18.6 的源码/运行报文是 Labels must be 63 bytes or less.,10.21 是 Labels must be 63 characters or less. 仅凭这两个措辞不能推断长度机制改变;两份固定源码都把标签与 NAMEDATALEN - 1 比较。失败的 DDL 在自动提交中是 ERROR,选定会话仍为 IDLE

处理

使用限制以内的标签,或把较长的用户值存为数据。失败语句返回后再添加合法短标签;选定修复后 enum 中有 okshort。不要静默截断 enum 标签,也不要把该 enum 专用路径推广成所有名称错误。

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

invalid_enum_label PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.

触发

Create an enum and add a 64-byte label, exceeding the enum label limit.

断言

  • SQLSTATE is 42602 and the primary identifies an invalid enum label
  • The session remains IDLE
  • Adding a short label succeeds and the enum contains both labels

处置

Use an enum label within the server byte limit or model longer values as data.

清理

Drop the case schema with an owner connection.

报文

选定源码路径以明确的 ERROR 发出主报文 invalid enum label "%s"。DETAIL 在 18.6 为 Labels must be 63 bytes or less.,在 10.21 为 Labels must be 63 characters or less.,标签文本是动态值。只有客户端异常而没有服务器 SQLSTATE、主报文和长度 DETAIL 时,不能据此识别这个选定的 enum 标签子路径;其他固定 producer 可以使用同一 SQLSTATE 和不同诊断。

报文模板

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

主消息 invalid enum label "%s"
DETAIL · REL_18_6 Labels must be %d bytes or less.
DETAIL · REL_10_23 Labels must be %d characters or less.

来源:src/backend/catalog/pg_enum.c @ REL_18_6 · src/backend/catalog/pg_enum.c @ REL_10_23

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TYPE syntax_schema.syntax_enum AS ENUM ('ok');
ALTER TYPE syntax_schema.syntax_enum ADD VALUE 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
ALTER TYPE syntax_schema.syntax_enum ADD VALUE 'short';
SELECT enum_range(NULL::syntax_schema.syntax_enum)::text[];

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42602 案例 JSON作者证据。运行器清单为 verify/cases/42602/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

证据

断言

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

  • 42602 is the invalid_name condition in Class 42.

    核实方式Read fixed errcodes.txt and the locked catalogue metadata.

    不覆盖Directory identity does not identify every backend path.

    来源src/backend/utils/errcodes.txt

  • The fixed source calls for 42602 include the mechanism and message boundary selected for this page.

    核实方式Trace the resolved REL_18_6 and REL_10_23 source call records at the locked commits.

    不覆盖Other calls can use the same SQLSTATE with different context or dynamic fields.

    来源src/backend/catalog/pg_enum.c · src/backend/catalog/pg_enum.c

  • The selected invalid_enum_label case passed on isolated PostgreSQL 18.6 and 10.21 targets.

    核实方式Run the shared registry case and inspect structured diagnostics, state/recovery assertions, and cleanup.

    不覆盖This covers the selected case and targets only; it does not generalize to all drivers or intermediate releases.

    来源verify/cases/42602/cases.json · verify/cases/42602/snippets.json

  • The locked catalogue records 42602; runtime scope is limited to the selected targets.

    核实方式Read generated facts and selected summaries.

    不覆盖Definition presence is not an exact behavioral introduction.

    来源src/backend/utils/errcodes.txt · raw/calls/REL_18_6.jsonl · raw/calls/REL_10_23.jsonl

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 42 语法错误或访问规则冲突 Syntax Error or Access Rule Violation 44 个
42000 syntax_error_or_access_rule_violation ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION ERROR 7.4
语法错误或访问规则违反的总类,见具体子码。 活跃
42501 insufficient_privilege ERRCODE_INSUFFICIENT_PRIVILEGE ERROR 7.4
当前角色对目标对象的权限不足。 活跃
42601 syntax_error ERRCODE_SYNTAX_ERROR ERROR 7.4
SQL 语句存在语法错误,解析器拒绝执行。 活跃
42602 invalid_name ERRCODE_INVALID_NAME ERROR 7.4
名称不合法,如 enum 标签超出长度限制。 活跃
42611 invalid_column_definition ERRCODE_INVALID_COLUMN_DEFINITION ERROR 7.4
列定义无效,如继承的父表默认值冲突。 活跃
42622 name_too_long ERRCODE_NAME_TOO_LONG ERROR 7.4
标识符或 name 值超出长度上限。 活跃
42701 duplicate_column ERRCODE_DUPLICATE_COLUMN ERROR 7.4
同一定义中重复指定了同名列。 活跃
42702 ambiguous_column ERRCODE_AMBIGUOUS_COLUMN ERROR 7.4
列引用有歧义,多个表都有该列名。 活跃
42703 undefined_column ERRCODE_UNDEFINED_COLUMN ERROR 7.4
引用的列在目标关系中不存在。 活跃
42704 undefined_object ERRCODE_UNDEFINED_OBJECT ERROR 7.4
引用的数据库对象不存在,如触发器或类型。 活跃
42710 duplicate_object ERRCODE_DUPLICATE_OBJECT ERROR 7.4
要定义的对象名已被占用,如重复 CREATE TYPE。 活跃
42712 duplicate_alias ERRCODE_DUPLICATE_ALIAS ERROR 7.4
同一查询命名空间中重复使用了表别名。 活跃
42723 duplicate_function ERRCODE_DUPLICATE_FUNCTION ERROR 7.4
同一模式下已存在同名同参数类型的函数。 活跃
42725 ambiguous_function ERRCODE_AMBIGUOUS_FUNCTION ERROR 7.4
函数调用有多个候选,无法选出最佳匹配。 活跃
42803 grouping_error ERRCODE_GROUPING_ERROR ERROR 7.4
分组查询输出了既未分组也未聚合的列。 活跃
42804 datatype_mismatch ERRCODE_DATATYPE_MISMATCH ERROR 7.4
表达式类型与目标上下文要求的类型不符。 活跃
42809 wrong_object_type ERRCODE_WRONG_OBJECT_TYPE ERROR 7.4
命令本身有效,但不能作用于该类对象。 活跃
42830 invalid_foreign_key ERRCODE_INVALID_FOREIGN_KEY ERROR 7.4
外键在被引用列上找不到合格的唯一键。 活跃
42846 cannot_coerce ERRCODE_CANNOT_COERCE ERROR 7.4
源类型到目标类型之间没有可用的 cast。 活跃
42883 undefined_function ERRCODE_UNDEFINED_FUNCTION ERROR 7.4
按名称和参数类型找不到匹配的函数或操作符。 活跃
428C9 generated_always ERRCODE_GENERATED_ALWAYS ERROR 10
向身份列或生成列赋值,这类列只接受 DEFAULT。 活跃
42939 reserved_name ERRCODE_RESERVED_NAME ERROR 7.4
对象名使用了保留名称,如模式或表空间。 活跃
42P01 undefined_table ERRCODE_UNDEFINED_TABLE ERROR 7.4
引用的表、视图或其他关系不存在。 活跃
42P02 undefined_parameter ERRCODE_UNDEFINED_PARAMETER ERROR 7.4
查询引用了解析器未知的位置参数,如 $1。 活跃
42P03 duplicate_cursor ERRCODE_DUPLICATE_CURSOR ERROR 7.4
游标或 portal 名称与已有的冲突。 活跃
42P04 duplicate_database ERRCODE_DUPLICATE_DATABASE ERROR 7.4
集群中已存在同名数据库。 活跃
42P05 duplicate_prepared_statement ERRCODE_DUPLICATE_PSTATEMENT ERROR 7.4
当前会话已有同名的服务端预备语句。 活跃
42P06 duplicate_schema ERRCODE_DUPLICATE_SCHEMA ERROR 7.4
要创建的模式名在当前数据库中已存在。 活跃
42P07 duplicate_table ERRCODE_DUPLICATE_TABLE ERROR 7.4
关系名已存在,或继承父项重复。 活跃
42P08 ambiguous_parameter ERRCODE_AMBIGUOUS_PARAMETER ERROR 7.4
参数存在但无法推导出一致而具体的类型。 活跃
42P09 ambiguous_alias ERRCODE_AMBIGUOUS_ALIAS ERROR 7.4
一个表引用对应多个关系命名空间项。 活跃
42P10 invalid_column_reference ERRCODE_INVALID_COLUMN_REFERENCE ERROR 7.4
列引用不符合该操作的契约,如 COPY 生成列。 活跃
42P11 invalid_cursor_definition ERRCODE_INVALID_CURSOR_DEFINITION ERROR 7.4
游标声明违反定义阶段规则,如 SCROLL 选项冲突。 活跃
42P12 invalid_database_definition ERRCODE_INVALID_DATABASE_DEFINITION ERROR 7.4
数据库定义无效,核心源码中未见触发路径。 活跃
42P13 invalid_function_definition ERRCODE_INVALID_FUNCTION_DEFINITION ERROR 7.4
函数、聚合或触发器声明在校验阶段失败。 活跃
42P14 invalid_prepared_statement_definition ERRCODE_INVALID_PSTATEMENT_DEFINITION ERROR 7.4
PREPARE 定义预备语句时失败。 活跃
42P15 invalid_schema_definition ERRCODE_INVALID_SCHEMA_DEFINITION ERROR 7.4
CREATE SCHEMA 的模式声明不一致被拒绝。 活跃
42P16 invalid_table_definition ERRCODE_INVALID_TABLE_DEFINITION ERROR 7.4
表定义无效,如分区键或主键规则冲突。 活跃
42P17 invalid_object_definition ERRCODE_INVALID_OBJECT_DEFINITION ERROR 7.4
对象定义无效,如继承、生成列或规则冲突。 活跃
42P18 indeterminate_datatype ERRCODE_INDETERMINATE_DATATYPE ERROR 7.4
无法推断表达式或参数的数据类型。 活跃
42P19 invalid_recursion ERRCODE_INVALID_RECURSION ERROR 8.4
递归查询结构不合法,执行前被检查拒绝。 活跃
42P20 windowing_error ERRCODE_WINDOWING_ERROR ERROR 8.4
窗口函数调用或框架边界定义不合法。 活跃
42P21 collation_mismatch ERRCODE_COLLATION_MISMATCH ERROR 9.1
参与运算的排序规则不兼容,产生冲突。 活跃
42P22 indeterminate_collation ERRCODE_INDETERMINATE_COLLATION ERROR 9.1
操作需要唯一排序规则,但无法确定。 活跃