百科 / 错误代码 / Class 54 程序限制超出
54011 too_many_columns
ERROR 源码确认 详解 未实测
- 条件名
too_many_columns- 宏名称
ERRCODE_TOO_MANY_COLUMNS- 启用版本
- 7.4
- 状态
- 活跃
版本覆盖
速览
54011 表示物理 tuple descriptor 或相关对象定义超过固定列数上限。源码路径决定计数对象是表属性、索引键加 INCLUDE 列、分区键、统计维度还是产生行的定义。
含义
固定消息包括实际/上限列数、表最多列数、索引最多列数、分区键上限和统计专用变体。表计数使用物理属性号:已删除列仍占 tuple descriptor 槽位,所以可见列数可能低于 relnatts。索引键与 INCLUDE、分区键和统计维度各有独立上限,虽然都使用此 SQLSTATE。
锁定的 18.6 构建中,相关常量分别是用户表属性 MaxHeapAttributeNumber = 1600、tuple 属性 MaxTupleAttributeNumber = 1664、INDEX_MAX_KEYS = 32、PARTITION_MAX_KEYS = 32 以及 STATS_MAX_DIMENSIONS = 8。这些数值属于不同 guard;服务器诊断中的实际 count 和 limit 字段仍是判断依据。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
number of columns (%d) exceeds limit (%d)
number of index columns (%d) exceeds limit (%d)
tables can have at most %d columns
cannot partition using more than %d columns
cannot use more than %d columns in an index
cannot have more than %d columns in statistics
column definition lists can have at most %d entries
诊断
从消息和上下文读取对象类型、实际数、上限和 DDL 操作。表或继承表要检查 pg_class.relnatts 与包含 attisdropped 的 pg_attribute,不能只数可见列名。索引 DDL 要把 INCLUDE 列算入,分区和 extended statistics 则检查各自的键/维度数;FROM 中函数的 column definition list 也有 54011 的行形状上限。
处理
减少或拆分对象定义,改用其他索引/分区设计,或把派生数据移到关联表。若原因是 dropped 的物理槽位,再删除可见列并不会回收它们;普通物理重写(如 VACUUM FULL 或 CLUSTER)也会在 tuple descriptor 中保留这些 dropped attribute。应新建具有目标逻辑列布局的表,在保留依赖的前提下迁移数据,再有选择地减少索引键/INCLUDE 列或统计维度并验证 DDL。显式事务中若发生 ERROR,重试前执行 ROLLBACK 或 ROLLBACK TO SAVEPOINT;自动提交只有在 schema 变更真正消除上限后才能重试。
版本
锁定目录从 7.4 记录;引用 heap、index、table、partition、statistics 和 row-shape 路径来自 PostgreSQL 18.6,未创建超大 schema。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 418 行
- 上游源码 src/backend/access/common/heaptuple.c 第 1131 行
- 上游源码 src/backend/access/common/indextuple.c 第 87 行
- 上游源码 src/backend/catalog/heap.c 第 461 行
- 上游源码 src/backend/commands/tablecmds.c 第 2567 行
- 上游源码 src/backend/commands/indexcmds.c 第 640 行
- 上游源码 src/backend/commands/statscmds.c 第 215 行
- 上游源码 src/backend/parser/parse_relation.c 第 1935 行
- 上游源码 src/include/access/htup_details.h 第 34 行
- 上游源码 src/include/pg_config_manual.h 第 63 行
- 上游源码 src/include/statistics/statistics.h 第 19 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
54011 is too_many_columns in SQLSTATE Class 54.
-
The cited PostgreSQL 18.6 source paths support the representative resource and object-state mechanisms described.
-
The table guard counts physical attributes including inherited columns, while index, partition, statistics, and function-row definitions use separate fixed arrays or dimensions.
-
The fixed 18.6 limit definitions are 1600 user table attributes, 1664 tuple attributes, 32 index keys, 32 partition-key columns, and 8 extended-statistics dimensions; these values belong to different object paths.
-
The locked catalogue records 54011 from 7.4; that boundary does not prove exact implementation introduction.
同类错误代码
Class 54 程序限制超出 下的其他成员。