跳转到主要内容

54000 — program_limit_exceeded

PostgreSQL SQLSTATE 54000 的来源与诊断参考。

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,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在请求符合指定程序上限后才能重试。不要静默丢弃元素,也不要盲目提高无关内存参数来掩盖算术溢出。

版本

锁定目录从 7.4 记录;引用核心和扩展路径来自 PostgreSQL 18.6,未强制触发限制,也未创建超大扩展值。

540115402322000

来源

contrib/cube/cube.c#L162-L166

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

结构化证据记录保存固定消息以及源码/运行边界。