百科 / 错误代码 / Class 55 前置状态不满足
55P04 unsafe_new_enum_value_usage
ERROR 源码确认 参考 未实测
- 条件名
unsafe_new_enum_value_usage- 宏名称
ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE- 启用版本
- 12
- 状态
- 活跃
版本覆盖
速览
55P04 保护“新加入的 enum 值必须先提交再使用”的规则。它发生在 PostgreSQL 找到仍未提交且被标记为不安全的 enum tuple 后,不是标签语法错误。
含义
固定 enum.c guard 先接受已经标记为 committed 的 tuple,再直接检查 tuple 的事务 ID;如果该值不在 EnumUncommitted() 列表中,也会接受,因为它不可能比所属类型存活更短。只有剩余的未提交新值才会报此码。因此,同一未提交事务中的 ALTER TYPE ... ADD VALUE 与使用新标签可能触发 55P04,已经提交的标签则不会触发这条 guard。
消息
- Primary 模板:
unsafe use of new value "%s" of enum type %s - Detail:本调用组没有 detail。
- Hint:
New enum values must be committed before they can be used.
两个 %s 分别是 enum 标签和格式化后的 enum 类型名,只提供诊断信息,不是值格式规则。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
unsafe use of new value "%s" of enum type %s
New enum values must be committed before they can be used.
诊断
保留 enum 标签、类型名、SQLSTATE、severity 和事务状态,检查该值是否由同一仍未提交的事务刚刚加入,以及失败使用是否是 enum input/cast 或解析为该 enum 的其他表达式。把这个 guard 与无效 enum 标签(22P02)区分开;22P04 是 COPY 文件格式条件,不是这条 enum guard。还要与重复 ADD VALUE 区分。
处理
先从 ERROR 恢复事务:执行 ROLLBACK;若 savepoint 的位置合适、能够保留此前的 ADD VALUE,则执行 ROLLBACK TO SAVEPOINT。新增值仍未提交时不能使用。如果完整回滚或回滚到 savepoint 已丢弃 ADD VALUE,就在新事务中重新执行并 COMMIT;若 savepoint 保留了它,也要先提交该事务,再在能看到已提交 catalog 行的事务中使用新标签。autocommit 下修正提交边界后重试输入,不要重复同一未提交流程。
版本
锁定目录从 12.0 记录此条件;固定源码覆盖 PostgreSQL 18.6。目录边界不表示更早不存在私有或未解析实现。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 428 行
- 上游源码 src/backend/utils/adt/enum.c 第 68 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
55P04 is unsafe_new_enum_value_usage in SQLSTATE Class 55.
-
The fixed enum tuple commit and EnumUncommitted guards support the stated commit-before-use mechanism and message.
-
The locked catalogue records 55P04 from 12.0; that boundary does not prove exact implementation introduction.
同类错误代码
Class 55 前置状态不满足 下的其他成员。