↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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

百科 / SQL 状态码 / Class 55 对象未处于所需状态

55P04 unsafe_new_enum_value_usage

ERROR 源码确认 参考 未实测

类别
Class 55 对象未处于所需状态
严重等级
ERROR
条件名
unsafe_new_enum_value_usage
宏名称
ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE
最早已知存在
12.0
状态
有效

版本覆盖

  1. 18
  2. 17
  3. 16
  4. 15
  5. 14
  1. 13
  2. 12
  3. 11
  4. 10
  5. 9.6
  6. 9.5
  7. 9.4
  8. 9.3
  9. 9.2
  10. 9.1
  11. 9.0
  1. 19 beta
  2. 20 dev

版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。

速览

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

来源

证据

断言

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

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 55 对象未处于所需状态 Object Not In Prerequisite State 5 个 ↗
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.0 起已知
当前等待策略下取不到锁,含 lock_timeout 到期。 有效
55P04 unsafe_new_enum_value_usage ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE ERROR 12.0 起已知
同一事务中使用了尚未提交的新增 enum 值。 有效