文档 / SQL 状态码 / Class 54 程序限制超出
54000 program_limit_exceeded
ERROR 源码确认 详解 未实测
- 条件名
program_limit_exceeded- 宏名称
ERRCODE_PROGRAM_LIMIT_EXCEEDED- 启用版本
- 7.4
- 状态
- 活跃
版本覆盖
速览
54000 用于超过具体程序、表示或扩展上限。固定例子包括安全分配大小算术、关系 block 编号、数组维度/大小、cube 维度和 hstore pair 数,具体限制由源码路径决定。
含义
它不是泛化的“大值”警告:核心 mcxt.c 检查分配大小的加法和乘法,溢出时报 invalid memory allocation request size ...;关系存储拒绝 InvalidBlockNumber 对应的 block;数组构造/下标路径分别检查维度和总大小。扩展还定义自己的上限:cube 报维度不能超过 %d,hstore 报实际与最大 pair 数。限制取决于操作和源码路径。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
cube dimension limit
A cube cannot have more than %d dimensions.
number of pairs (%d) exceeds the maximum allowed (%d)
invalid memory allocation request size %zu + %zu
cannot extend file "%s" beyond %u blocks
number of array dimensions (%d) exceeds the maximum allowed (%d)
诊断
确认源码组件以及实际值/上限,判断是分配大小溢出、关系增长、数组维度/大小、cube 维度、hstore pair 还是其他组件。检查会扩张请求的表达式或生成值;分配大小溢出是请求算术问题,不能据此断言主机 RAM 已耗尽。
处理
降低请求大小、维度、block 增长或 pair 数,拆分值,或选择符合文档上限的表示;关系达到限制时先重设计或分区存储。显式事务中若发生 ERROR,重试前执行 ROLLBACK 或 ROLLBACK TO SAVEPOINT;自动提交只有在请求符合指定程序上限后才能重试。不要静默丢弃元素,也不要盲目提高无关内存参数来掩盖算术溢出。
版本
锁定目录从 7.4 记录;引用核心和扩展路径来自 PostgreSQL 18.6,未强制触发限制,也未创建超大扩展值。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 416 行
- 上游源码 contrib/cube/cube.c 第 162 行
- 上游源码 contrib/hstore/hstore_io.c 第 522 行
- 上游源码 src/backend/utils/mmgr/mcxt.c 第 1683 行
- 上游源码 src/backend/storage/smgr/md.c 第 493 行
- 上游源码 src/backend/utils/adt/arraysubs.c 第 147 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
54000 is program_limit_exceeded in SQLSTATE Class 54.
-
The cited PostgreSQL 18.6 source paths support the representative resource and object-state mechanisms described.
-
Core safe allocation-size arithmetic, relation block growth, and array subscript dimensions use 54000 independently of cube and hstore extension limits.
-
The locked catalogue records 54000 from 7.4; that boundary does not prove exact implementation introduction.
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 54000 | program_limit_exceeded | ERRCODE_PROGRAM_LIMIT_EXCEEDED |
ERROR | 7.4 |
| 超出程序固定上限,如数组维度或分配大小。 | 活跃 | |||
| 54001 | statement_too_complex | ERRCODE_STATEMENT_TOO_COMPLEX |
ERROR | 7.4 |
| 语句过于复杂,超出 grouping set 或栈深度上限。 | 活跃 | |||
| 54011 | too_many_columns | ERRCODE_TOO_MANY_COLUMNS |
ERROR | 7.4 |
| 对象定义的列数超过上限,如表属性或索引键。 | 活跃 | |||
| 54023 | too_many_arguments | ERRCODE_TOO_MANY_ARGUMENTS |
ERROR | 7.4 |
| 函数或过程的参数个数超过编译时上限。 | 活跃 | |||