# 54001 — statement_too_complex

> PostgreSQL SQLSTATE 54001 的来源与诊断参考。
---

# 54001

## 速览 {#at-a-glance}
`54001` 覆盖超过规划器、解析器或执行栈限制的语句。固定路径包括 4096 个 grouping set 上限和 `max_stack_depth` 检查。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `54001` |
| 条件名 | `statement_too_complex` |
| 状态 | `有效` |
| 已知存在于 | `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_STATEMENT_TOO_COMPLEX` |
| 别名 | `—` |

<!-- source facts: data/errcodes/54001.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
源码区分结构性查询上限 `too many grouping sets present (maximum 4096)` 与递归执行深度 `stack depth limit exceeded`，后者 hint 指向 `max_stack_depth`。两者修复不同。

## 诊断 {#diagnosis}
保留消息和阶段：grouping sets 应统计生成数量并简化查询；stack depth 应检查递归 SQL/函数展开，并在改设置前比较平台栈限制。

## 处理 {#response}
重写或拆分结构过大的语句；stack depth 应先消除意外递归或减少嵌套，仅在确认操作系统栈允许时调整 `max_stack_depth`，再验证重写后的语句。显式事务中若发生此 `ERROR`，重试前执行 `ROLLBACK` 或 `ROLLBACK TO SAVEPOINT`；自动提交只有在语句或 stack setting 修正后才能重试。GUC 的 rlimit 检查会在 `SET` 或配置值校验时比较平台栈上限；若 `SET` 失败，仍按发起它的事务上下文恢复。

## 版本 {#versions}
锁定目录从 7.4 记录；引用解析器和栈深度路径来自 PostgreSQL 18.6，未强制触发限制。

## 相关 {#related}
[`54000`](../54000/)、[`54011`](../54011/)、[`42601`](../42601/)

## 来源 {#sources}
[`src/backend/parser/parse_agg.c#L1166-L1172`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_agg.c#L1166)

[`src/backend/utils/misc/stack_depth.c#L100-L105`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/stack_depth.c#L100)

[`src/backend/utils/misc/stack_depth.c#L156-L168`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/misc/stack_depth.c#L156)

结构化[证据记录](../../data/evidence/54001.json)保存固定消息以及源码/运行边界。
