2201W — invalid_row_count_in_limit_clause
2201W
速览
LIMIT 或 FETCH 行数触发了特定形式的守卫。固定路径报告 LIMIT must not be negative;解析器另行拒绝 FETCH FIRST ... WITH TIES 中字面 NULL 行数。
| 字段 | 值 |
|---|---|
| SQLSTATE | 2201W |
| 条件名 | invalid_row_count_in_limit_clause |
| 状态 | 有效 |
| 已知存在于 | 8.4.0 |
| 锁定快照 | 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_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE |
| 别名 | — |
代表性报文
代表性守卫使用以下首要文本:
| 路径 | 首要文本 |
|---|---|
| 普通 LIMIT 的负 count | LIMIT must not be negative |
FETCH FIRST ... WITH TIES 中的字面 NULL |
row count cannot be null in FETCH FIRST ... WITH TIES clause |
含义
执行器计算普通 LIMIT count 时,NULL 被解释为没有 count(LIMIT ALL),零值合法并返回零行,负值才报告 2201W。解析器另有 FETCH FIRST ... WITH TIES 裸 NULL 常量守卫;这不是所有可为空 LIMIT 表达式都采用的统一规则。OFFSET 由 2201X 处理。
诊断
先确认报文来自普通 LIMIT 求值还是 WITH TIES 解析规则,再检查表达式实际值和类型。区分无 ties 时的 NULL、with ties 的字面 NULL、零值和负值。源码的 A_Const 检查范围很窄,隐藏在表达式中的 NULL 可能通过解析器,因此应依据实际语句和报文分类。
处理
普通 LIMIT 若要不限行可使用 NULL,否则提供非负 count;WITH TIES 应提供该语法接受的非 NULL 行数。如果负 count 或解析器 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的语句。
版本
锁定目录从 8.4.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。
相关
来源
执行器对 NULL/零值/负值的处理在 src/backend/executor/nodeLimit.c#L347-405;字面 WITH TIES NULL 守卫在 src/backend/parser/parse_clause.c#L1890-1907。结构化证据记录保留两种首要角色;本页未运行自然案例。