54000 — program_limit_exceeded
54000
速览
54000 用于超过具体程序、表示或扩展上限。固定例子包括安全分配大小算术、关系 block 编号、数组维度/大小、cube 维度和 hstore pair 数,具体限制由源码路径决定。
| 字段 | 值 |
|---|---|
| SQLSTATE | 54000 |
| 条件名 | program_limit_exceeded |
| 状态 | 有效 |
| 已知存在于 | 7.4 |
| 锁定快照 | 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3 |
| 宏 | ERRCODE_PROGRAM_LIMIT_EXCEEDED |
| 别名 | — |
含义
它不是泛化的“大值”警告:核心 mcxt.c 检查分配大小的加法和乘法,溢出时报 invalid memory allocation request size ...;关系存储拒绝 InvalidBlockNumber 对应的 block;数组构造/下标路径分别检查维度和总大小。扩展还定义自己的上限:cube 报维度不能超过 %d,hstore 报实际与最大 pair 数。限制取决于操作和源码路径。
诊断
确认源码组件以及实际值/上限,判断是分配大小溢出、关系增长、数组维度/大小、cube 维度、hstore pair 还是其他组件。检查会扩张请求的表达式或生成值;分配大小溢出是请求算术问题,不能据此断言主机 RAM 已耗尽。
处理
降低请求大小、维度、block 增长或 pair 数,拆分值,或选择符合文档上限的表示;关系达到限制时先重设计或分区存储。显式事务中若发生 ERROR,重试前执行 ROLLBACK 或 ROLLBACK TO SAVEPOINT;自动提交只有在请求符合指定程序上限后才能重试。不要静默丢弃元素,也不要盲目提高无关内存参数来掩盖算术溢出。
版本
锁定目录从 7.4 记录;引用核心和扩展路径来自 PostgreSQL 18.6,未强制触发限制,也未创建超大扩展值。
相关
来源
contrib/hstore/hstore_io.c#L522-L525
src/backend/utils/mmgr/mcxt.c#L1683-L1718
src/backend/storage/smgr/md.c#L493-L504
src/backend/utils/adt/arraysubs.c#L147-L152
结构化证据记录保存固定消息以及源码/运行边界。