文档 / SQL 状态码 / 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.
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 55000 | object_not_in_prerequisite_state | ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE |
ERROR | 7.4 |
| 对象或服务器未处于操作所需的前置状态。 | 活跃 | |||
| 55006 | object_in_use | ERRCODE_OBJECT_IN_USE |
ERROR | 7.4 |
| 对象正被使用,操作与进行中的占用冲突。 | 活跃 | |||
| 55P02 | cant_change_runtime_param | ERRCODE_CANT_CHANGE_RUNTIME_PARAM |
ERROR | 7.4 |
| 当前上下文或阶段不允许修改该运行时参数。 | 活跃 | |||
| 55P03 | lock_not_available | ERRCODE_LOCK_NOT_AVAILABLE |
ERROR | 8.0 |
| 当前等待策略下取不到锁,含 lock_timeout 到期。 | 活跃 | |||
| 55P04 | unsafe_new_enum_value_usage | ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE |
ERROR | 12 |
| 同一事务中使用了尚未提交的新增 enum 值。 | 活跃 | |||