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

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

百科 / 错误代码 / Class 55 前置状态不满足

55P04 unsafe_new_enum_value_usage

ERROR 源码确认 参考 未实测

类别
Class 55 前置状态不满足
严重等级
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
HINT New enum values must be committed before they can be used.

来源:src/backend/utils/adt/enum.c @ REL_18_6

诊断

保留 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。目录边界不表示更早不存在私有或未解析实现。

来源

证据

断言

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

  • 55P04 is unsafe_new_enum_value_usage in SQLSTATE Class 55.

    核实方式Read fixed definition.

    来源src/backend/utils/errcodes.txt

  • The fixed enum tuple commit and EnumUncommitted guards support the stated commit-before-use mechanism and message.

    核实方式Read complete fixed source context.

    不覆盖Source confirmation is not natural runtime.

    来源src/backend/utils/adt/enum.c

  • The locked catalogue records 55P04 from 12.0; that boundary does not prove exact implementation introduction.

    核实方式Use catalogue boundary.

    来源src/backend/utils/errcodes.txt

同类错误代码

Class 55 前置状态不满足 下的其他成员。