百科 / 错误代码 / Class 22 数据异常
2201W invalid_row_count_in_limit_clause
ERROR 源码确认 参考 未实测
- 条件名
invalid_row_count_in_limit_clause- 宏名称
ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE- 启用版本
- 8.4
- 状态
- 活跃
版本覆盖
速览
LIMIT 或 FETCH 行数触发了特定形式的守卫。固定路径报告 LIMIT must not be negative;解析器另行拒绝 FETCH FIRST ... WITH TIES 中字面 NULL 行数。
代表性报文
代表性守卫使用以下首要文本:
| 路径 | 首要文本 |
|---|---|
| 普通 LIMIT 的负 count | LIMIT must not be negative |
FETCH FIRST ... WITH TIES 中的字面 NULL |
row count cannot be null in FETCH FIRST ... WITH TIES clause |
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
LIMIT must not be negative
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。未声称本页有自然运行观察。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 188 行
- 上游源码 src/backend/executor/nodeLimit.c 第 347 行
- 上游源码 src/backend/parser/parse_clause.c 第 1890 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
2201W is invalid_row_count_in_limit_clause in SQLSTATE Class 22
-
Fixed PostgreSQL 18.6 executor and parser paths distinguish ordinary LIMIT NULL/zero/negative values from the narrow literal NULL WITH TIES guard.
-
The locked catalogue records 2201W from 8.4.0 without proving an exact implementation introduction date.
同类错误代码
Class 22 数据异常 下的其他成员。
22000data_exception22001string_data_right_truncation22002null_value_no_indicator_parameter22003numeric_value_out_of_range22004null_value_not_allowed22005error_in_assignment22007invalid_datetime_format22008datetime_field_overflow22009invalid_time_zone_displacement_value2200Bescape_character_conflict2200Cinvalid_use_of_escape_character2200Dinvalid_escape_octet2200Fzero_length_character_string2200Gmost_specific_type_mismatch2200Hsequence_generator_limit_exceeded2200Lnot_an_xml_document2200Minvalid_xml_document2200Ninvalid_xml_content2200Sinvalid_xml_comment2200Tinvalid_xml_processing_instruction22010invalid_indicator_parameter_value22011substring_error22012division_by_zero22013invalid_preceding_or_following_size22014invalid_argument_for_ntile_function22015interval_field_overflow22016invalid_argument_for_nth_value_function22018invalid_character_value_for_cast22019invalid_escape_character2201Binvalid_regular_expression2201Einvalid_argument_for_logarithm2201Finvalid_argument_for_power_function2201Ginvalid_argument_for_width_bucket_function2201Xinvalid_row_count_in_result_offset_clause22021character_not_in_repertoire22022indicator_overflow22023invalid_parameter_value22024unterminated_c_string22025invalid_escape_sequence22026string_data_length_mismatch22027trim_error2202Earray_subscript_error2202Ginvalid_tablesample_repeat2202Hinvalid_tablesample_argument22030duplicate_json_object_key_value22031invalid_argument_for_sql_json_datetime_function22032invalid_json_text22033invalid_sql_json_subscript22034more_than_one_sql_json_item22035no_sql_json_item22036non_numeric_sql_json_item22037non_unique_keys_in_a_json_object22038singleton_sql_json_item_required22039sql_json_array_not_found2203Asql_json_member_not_found2203Bsql_json_number_not_found2203Csql_json_object_not_found2203Dtoo_many_json_array_elements2203Etoo_many_json_object_members2203Fsql_json_scalar_required2203Gsql_json_item_cannot_be_cast_to_target_type22P01floating_point_exception22P02invalid_text_representation22P03invalid_binary_representation22P04bad_copy_file_format22P05untranslatable_character22P06nonstandard_use_of_escape_character