跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

PostgreSQL SQLSTATE 大典

输入 PostgreSQL SQLSTATE,快速判断错误阶段并查看诊断与恢复指引。

先输入驱动异常或服务器日志里的五位错误码。目录始终用大写 SQLSTATE 作为稳定身份;含字母的 URL 统一使用小写。搜索覆盖条件名、宏名、中文名称和已核对的报文模板。

浏览大典

入口 用途
全部错误码 去重后的完整 SQLSTATE 目录
错误类 查看某个 class 的共同语义与成员
常见错误码 面向故障排查的精选入口
主题 约束、认证、事务、超时和资源等路径
版本 按 PostgreSQL 版本查看存在情况与有证据的变化
指南 阅读诊断、恢复事务、重试和客户端处理方法

证据约定

每个收录条目都会区分目录身份、源码路径、文档行为契约和本地运行观察。只由源码确认的事实会明确标注;运行结论会绑定案例与结果。预发行版单独列在版本页面,不计入正式发布版本统计。

目录包含冻结目录中的 263 个 SQLSTATE,并为每个条目提供中英文配对页面。覆盖页分别报告完整说明、源码参考、编辑审阅和选定运行结果;只有保留案例结果时才会声明运行时诊断结论。

覆盖范围

请看覆盖范围了解版本矩阵,看方法了解采集边界、证据状态和翻译规则。

1 - 全部 SQLSTATE 错误码

根据冻结的 PostgreSQL 发布源码生成的完整 SQLSTATE 目录。

按类别、版本和内容深度筛选全部 SQLSTATE。每个错误码都链接到已审阅的中英文说明;当前内容与运行核验范围见覆盖报告

身份和证据约定请看方法页面。

错误码 类别 条件名 状态 已知存在于 正式版本 预发行 深度
00000 00 successful_completion 有效 7.4 all 16 formal all 1 preview 参考
01000 01 warning 有效 7.4 all 16 formal all 1 preview 参考
01003 01 null_value_eliminated_in_set_function 有效 7.4 all 16 formal all 1 preview 参考
01004 01 string_data_right_truncation 有效 7.4 all 16 formal all 1 preview 参考
01006 01 privilege_not_revoked 有效 8.0.0 all 16 formal all 1 preview 参考
01007 01 privilege_not_granted 有效 8.0.0 all 16 formal all 1 preview 参考
01008 01 implicit_zero_bit_padding 有效 7.4 all 16 formal all 1 preview 参考
0100C 01 dynamic_result_sets_returned 有效 7.4 all 16 formal all 1 preview 参考
01P01 01 deprecated_feature 有效 8.0.0 all 16 formal all 1 preview 参考
02000 02 no_data 有效 7.4 all 16 formal all 1 preview 参考
02001 02 no_additional_dynamic_result_sets_returned 有效 7.4 all 16 formal all 1 preview 参考
03000 03 sql_statement_not_yet_complete 有效 7.4 all 16 formal all 1 preview 参考
08000 08 connection_exception 有效 7.4 all 16 formal all 1 preview 参考
08001 08 sqlclient_unable_to_establish_sqlconnection 有效 7.4 all 16 formal all 1 preview 完整
08003 08 connection_does_not_exist 有效 7.4 all 16 formal all 1 preview 完整
08004 08 sqlserver_rejected_establishment_of_sqlconnection 有效 7.4 all 16 formal all 1 preview 参考
08006 08 connection_failure 有效 7.4 all 16 formal all 1 preview 完整
08007 08 transaction_resolution_unknown 有效 7.4 all 16 formal all 1 preview 参考
08P01 08 protocol_violation 有效 7.4 all 16 formal all 1 preview 完整
09000 09 triggered_action_exception 有效 7.4 all 16 formal all 1 preview 参考
0A000 0A feature_not_supported 有效 7.4 all 16 formal all 1 preview 完整
0B000 0B invalid_transaction_initiation 有效 7.4 all 16 formal all 1 preview 参考
0F000 0F locator_exception 有效 7.4 all 16 formal all 1 preview 参考
0F001 0F invalid_locator_specification 有效 7.4 all 16 formal all 1 preview 参考
0L000 0L invalid_grantor 有效 7.4 all 16 formal all 1 preview 参考
0LP01 0L invalid_grant_operation 有效 7.4 all 16 formal all 1 preview 参考
0P000 0P invalid_role_specification 有效 7.4 all 16 formal all 1 preview 参考
0Z000 0Z diagnostics_exception 有效 9.2.0 9.2.24 → 18.6 (14) all 1 preview 参考
0Z002 0Z stacked_diagnostics_accessed_without_active_handler 有效 9.2.0 9.2.24 → 18.6 (14) all 1 preview 参考
10608 10 invalid_argument_for_xquery 有效 18.0 18.6 all 1 preview 参考
20000 20 case_not_found 有效 8.4.0 all 16 formal all 1 preview 参考
21000 21 cardinality_violation 有效 7.4 all 16 formal all 1 preview 完整
22000 22 data_exception 有效 7.4 all 16 formal all 1 preview 参考
22001 22 string_data_right_truncation 有效 7.4 all 16 formal all 1 preview 完整
22002 22 null_value_no_indicator_parameter 有效 7.4 all 16 formal all 1 preview 参考
22003 22 numeric_value_out_of_range 有效 7.4 all 16 formal all 1 preview 完整
22004 22 null_value_not_allowed 有效 7.4 all 16 formal all 1 preview 完整
22005 22 error_in_assignment 有效 7.4 all 16 formal all 1 preview 参考
22007 22 invalid_datetime_format 有效 7.4 all 16 formal all 1 preview 完整
22008 22 datetime_field_overflow 有效 7.4 all 16 formal all 1 preview 参考
22009 22 invalid_time_zone_displacement_value 有效 7.4 all 16 formal all 1 preview 参考
2200B 22 escape_character_conflict 有效 7.4 all 16 formal all 1 preview 参考
2200C 22 invalid_use_of_escape_character 有效 7.4 all 16 formal all 1 preview 参考
2200D 22 invalid_escape_octet 有效 7.4 all 16 formal all 1 preview 参考
2200F 22 zero_length_character_string 有效 7.4 all 16 formal all 1 preview 参考
2200G 22 most_specific_type_mismatch 有效 7.4 all 16 formal all 1 preview 参考
2200H 22 sequence_generator_limit_exceeded 有效 10.0 10.23 → 18.6 (9) all 1 preview 参考
2200L 22 not_an_xml_document 有效 8.3.0 all 16 formal all 1 preview 参考
2200M 22 invalid_xml_document 有效 8.3.0 all 16 formal all 1 preview 参考
2200N 22 invalid_xml_content 有效 8.3.0 all 16 formal all 1 preview 参考
2200S 22 invalid_xml_comment 有效 8.3.0 all 16 formal all 1 preview 参考
2200T 22 invalid_xml_processing_instruction 有效 8.3.0 all 16 formal all 1 preview 参考
22010 22 invalid_indicator_parameter_value 有效 7.4 all 16 formal all 1 preview 参考
22011 22 substring_error 有效 7.4 all 16 formal all 1 preview 参考
22012 22 division_by_zero 有效 7.4 all 16 formal all 1 preview 完整
22013 22 invalid_preceding_or_following_size 有效 11.0 11.22 → 18.6 (8) all 1 preview 参考
22014 22 invalid_argument_for_ntile_function 有效 8.4.0 all 16 formal all 1 preview 参考
22015 22 interval_field_overflow 有效 7.4 all 16 formal all 1 preview 参考
22016 22 invalid_argument_for_nth_value_function 有效 8.4.0 all 16 formal all 1 preview 参考
22018 22 invalid_character_value_for_cast 有效 7.4 all 16 formal all 1 preview 参考
22019 22 invalid_escape_character 有效 7.4 all 16 formal all 1 preview 参考
2201B 22 invalid_regular_expression 有效 7.4 all 16 formal all 1 preview 参考
2201E 22 invalid_argument_for_logarithm 有效 8.0.0 all 16 formal all 1 preview 参考
2201F 22 invalid_argument_for_power_function 有效 8.0.0 all 16 formal all 1 preview 参考
2201G 22 invalid_argument_for_width_bucket_function 有效 8.0.0 all 16 formal all 1 preview 参考
2201W 22 invalid_row_count_in_limit_clause 有效 8.4.0 all 16 formal all 1 preview 参考
2201X 22 invalid_row_count_in_result_offset_clause 有效 8.4.0 all 16 formal all 1 preview 参考
22021 22 character_not_in_repertoire 有效 7.4 all 16 formal all 1 preview 参考
22022 22 indicator_overflow 有效 7.4 all 16 formal all 1 preview 参考
22023 22 invalid_parameter_value 有效 7.4 all 16 formal all 1 preview 完整
22024 22 unterminated_c_string 有效 7.4 all 16 formal all 1 preview 参考
22025 22 invalid_escape_sequence 有效 7.4 all 16 formal all 1 preview 参考
22026 22 string_data_length_mismatch 有效 7.4 all 16 formal all 1 preview 参考
22027 22 trim_error 有效 7.4 all 16 formal all 1 preview 参考
2202E 22 array_subscript_error 有效 7.4 all 16 formal all 1 preview 完整
2202G 22 invalid_tablesample_repeat 有效 9.5.0 9.5.25 → 18.6 (11) all 1 preview 参考
2202H 22 invalid_tablesample_argument 有效 9.5.0 9.5.25 → 18.6 (11) all 1 preview 参考
22030 22 duplicate_json_object_key_value 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22031 22 invalid_argument_for_sql_json_datetime_function 有效 13.0 13.23 → 18.6 (6) all 1 preview 参考
22032 22 invalid_json_text 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22033 22 invalid_sql_json_subscript 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22034 22 more_than_one_sql_json_item 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22035 22 no_sql_json_item 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22036 22 non_numeric_sql_json_item 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22037 22 non_unique_keys_in_a_json_object 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22038 22 singleton_sql_json_item_required 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
22039 22 sql_json_array_not_found 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203A 22 sql_json_member_not_found 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203B 22 sql_json_number_not_found 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203C 22 sql_json_object_not_found 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203D 22 too_many_json_array_elements 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203E 22 too_many_json_object_members 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203F 22 sql_json_scalar_required 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
2203G 22 sql_json_item_cannot_be_cast_to_target_type 有效 15.0 15.19 → 18.6 (4) all 1 preview 参考
22P01 22 floating_point_exception 有效 7.4 all 16 formal all 1 preview 参考
22P02 22 invalid_text_representation 有效 7.4 all 16 formal all 1 preview 完整
22P03 22 invalid_binary_representation 有效 7.4 all 16 formal all 1 preview 参考
22P04 22 bad_copy_file_format 有效 7.4 all 16 formal all 1 preview 参考
22P05 22 untranslatable_character 有效 7.4 all 16 formal all 1 preview 参考
22P06 22 nonstandard_use_of_escape_character 有效 8.1.0 all 16 formal all 1 preview 参考
23000 23 integrity_constraint_violation 有效 7.4 all 16 formal all 1 preview 参考
23001 23 restrict_violation 有效 7.4 all 16 formal all 1 preview 完整
23502 23 not_null_violation 有效 7.4 all 16 formal all 1 preview 完整
23503 23 foreign_key_violation 有效 7.4 all 16 formal all 1 preview 完整
23505 23 unique_violation 有效 7.4 all 16 formal all 1 preview 完整
23514 23 check_violation 有效 7.4 all 16 formal all 1 preview 完整
23P01 23 exclusion_violation 有效 9.0.0 all 16 formal all 1 preview 完整
24000 24 invalid_cursor_state 有效 7.4 all 16 formal all 1 preview 参考
25000 25 invalid_transaction_state 有效 7.4 all 16 formal all 1 preview 参考
25001 25 active_sql_transaction 有效 7.4 all 16 formal all 1 preview 完整
25002 25 branch_transaction_already_active 有效 7.4 all 16 formal all 1 preview 参考
25003 25 inappropriate_access_mode_for_branch_transaction 有效 7.4 all 16 formal all 1 preview 参考
25004 25 inappropriate_isolation_level_for_branch_transaction 有效 7.4 all 16 formal all 1 preview 参考
25005 25 no_active_sql_transaction_for_branch_transaction 有效 7.4 all 16 formal all 1 preview 参考
25006 25 read_only_sql_transaction 有效 7.4 all 16 formal all 1 preview 完整
25007 25 schema_and_data_statement_mixing_not_supported 有效 7.4 all 16 formal all 1 preview 参考
25008 25 held_cursor_requires_same_isolation_level 有效 7.4 all 16 formal all 1 preview 参考
25P01 25 no_active_sql_transaction 有效 7.4 all 16 formal all 1 preview 参考
25P02 25 in_failed_sql_transaction 有效 7.4 all 16 formal all 1 preview 完整
25P03 25 idle_in_transaction_session_timeout 有效 9.6.0 9.6.24 → 18.6 (10) all 1 preview 完整
25P04 25 transaction_timeout 有效 17.0 17.11 → 18.6 (2) all 1 preview 完整
26000 26 invalid_sql_statement_name 有效 7.4 all 16 formal all 1 preview 完整
27000 27 triggered_data_change_violation 有效 7.4 all 16 formal all 1 preview 参考
28000 28 invalid_authorization_specification 有效 7.4 all 16 formal all 1 preview 完整
28P01 28 invalid_password 有效 9.0.0 all 16 formal all 1 preview 完整
2B000 2B dependent_privilege_descriptors_still_exist 有效 7.4 all 16 formal all 1 preview 参考
2BP01 2B dependent_objects_still_exist 有效 7.4 all 16 formal all 1 preview 完整
2D000 2D invalid_transaction_termination 有效 7.4 all 16 formal all 1 preview 参考
2F000 2F sql_routine_exception 有效 7.4 all 16 formal all 1 preview 参考
2F002 2F modifying_sql_data_not_permitted 有效 7.4 all 16 formal all 1 preview 参考
2F003 2F prohibited_sql_statement_attempted 有效 7.4 all 16 formal all 1 preview 参考
2F004 2F reading_sql_data_not_permitted 有效 7.4 all 16 formal all 1 preview 参考
2F005 2F function_executed_no_return_statement 有效 7.4 all 16 formal all 1 preview 参考
34000 34 invalid_cursor_name 有效 7.4 all 16 formal all 1 preview 完整
38000 38 external_routine_exception 有效 7.4 all 16 formal all 1 preview 参考
38001 38 containing_sql_not_permitted 有效 7.4 all 16 formal all 1 preview 参考
38002 38 modifying_sql_data_not_permitted 有效 7.4 all 16 formal all 1 preview 参考
38003 38 prohibited_sql_statement_attempted 有效 7.4 all 16 formal all 1 preview 参考
38004 38 reading_sql_data_not_permitted 有效 7.4 all 16 formal all 1 preview 参考
39000 39 external_routine_invocation_exception 有效 7.4 all 16 formal all 1 preview 参考
39001 39 invalid_sqlstate_returned 有效 7.4 all 16 formal all 1 preview 参考
39004 39 null_value_not_allowed 有效 7.4 all 16 formal all 1 preview 参考
39P01 39 trigger_protocol_violated 有效 7.4 all 16 formal all 1 preview 参考
39P02 39 srf_protocol_violated 有效 7.4 all 16 formal all 1 preview 参考
39P03 39 event_trigger_protocol_violated 有效 9.5.0 9.5.25 → 18.6 (11) all 1 preview 参考
3B000 3B savepoint_exception 有效 8.0.0 all 16 formal all 1 preview 参考
3B001 3B invalid_savepoint_specification 有效 8.0.0 all 16 formal all 1 preview 参考
3D000 3D invalid_catalog_name 有效 7.4 all 16 formal all 1 preview 完整
3F000 3F invalid_schema_name 有效 7.4 all 16 formal all 1 preview 完整
40000 40 transaction_rollback 有效 7.4 all 16 formal all 1 preview 参考
40001 40 serialization_failure 有效 7.4 all 16 formal all 1 preview 完整
40002 40 transaction_integrity_constraint_violation 有效 7.4 all 16 formal all 1 preview 参考
40003 40 statement_completion_unknown 有效 7.4 all 16 formal all 1 preview 参考
40P01 40 deadlock_detected 有效 7.4 all 16 formal all 1 preview 完整
42000 42 syntax_error_or_access_rule_violation 有效 7.4 all 16 formal all 1 preview 参考
42501 42 insufficient_privilege 有效 7.4 all 16 formal all 1 preview 完整
42601 42 syntax_error 有效 7.4 all 16 formal all 1 preview 完整
42602 42 invalid_name 有效 7.4 all 16 formal all 1 preview 参考
42611 42 invalid_column_definition 有效 7.4 all 16 formal all 1 preview 参考
42622 42 name_too_long 有效 7.4 all 16 formal all 1 preview 参考
42701 42 duplicate_column 有效 7.4 all 16 formal all 1 preview 完整
42702 42 ambiguous_column 有效 7.4 all 16 formal all 1 preview 完整
42703 42 undefined_column 有效 7.4 all 16 formal all 1 preview 完整
42704 42 undefined_object 有效 7.4 all 16 formal all 1 preview 完整
42710 42 duplicate_object 有效 7.4 all 16 formal all 1 preview 完整
42712 42 duplicate_alias 有效 7.4 all 16 formal all 1 preview 参考
42723 42 duplicate_function 有效 7.4 all 16 formal all 1 preview 参考
42725 42 ambiguous_function 有效 7.4 all 16 formal all 1 preview 参考
42803 42 grouping_error 有效 7.4 all 16 formal all 1 preview 完整
42804 42 datatype_mismatch 有效 7.4 all 16 formal all 1 preview 完整
42809 42 wrong_object_type 有效 7.4 all 16 formal all 1 preview 参考
42830 42 invalid_foreign_key 有效 7.4 all 16 formal all 1 preview 参考
42846 42 cannot_coerce 有效 7.4 all 16 formal all 1 preview 参考
42883 42 undefined_function 有效 7.4 all 16 formal all 1 preview 完整
428C9 42 generated_always 有效 10.0 10.23 → 18.6 (9) all 1 preview 完整
42939 42 reserved_name 有效 7.4 all 16 formal all 1 preview 完整
42P01 42 undefined_table 有效 7.4 all 16 formal all 1 preview 完整
42P02 42 undefined_parameter 有效 7.4 all 16 formal all 1 preview 完整
42P03 42 duplicate_cursor 有效 7.4 all 16 formal all 1 preview 完整
42P04 42 duplicate_database 有效 7.4 all 16 formal all 1 preview 完整
42P05 42 duplicate_prepared_statement 有效 7.4 all 16 formal all 1 preview 完整
42P06 42 duplicate_schema 有效 7.4 all 16 formal all 1 preview 完整
42P07 42 duplicate_table 有效 7.4 all 16 formal all 1 preview 完整
42P08 42 ambiguous_parameter 有效 7.4 all 16 formal all 1 preview 完整
42P09 42 ambiguous_alias 有效 7.4 all 16 formal all 1 preview 完整
42P10 42 invalid_column_reference 有效 7.4 all 16 formal all 1 preview 参考
42P11 42 invalid_cursor_definition 有效 7.4 all 16 formal all 1 preview 参考
42P12 42 invalid_database_definition 有效 7.4 all 16 formal all 1 preview 参考
42P13 42 invalid_function_definition 有效 7.4 all 16 formal all 1 preview 参考
42P14 42 invalid_prepared_statement_definition 有效 7.4 all 16 formal all 1 preview 参考
42P15 42 invalid_schema_definition 有效 7.4 all 16 formal all 1 preview 参考
42P16 42 invalid_table_definition 有效 7.4 all 16 formal all 1 preview 参考
42P17 42 invalid_object_definition 有效 7.4 all 16 formal all 1 preview 参考
42P18 42 indeterminate_datatype 有效 7.4 all 16 formal all 1 preview 完整
42P19 42 invalid_recursion 有效 8.4.0 all 16 formal all 1 preview 参考
42P20 42 windowing_error 有效 8.4.0 all 16 formal all 1 preview 参考
42P21 42 collation_mismatch 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
42P22 42 indeterminate_collation 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
44000 44 with_check_option_violation 有效 7.4 all 16 formal all 1 preview 完整
53000 53 insufficient_resources 有效 7.4 all 16 formal all 1 preview 参考
53100 53 disk_full 有效 7.4 all 16 formal all 1 preview 完整
53200 53 out_of_memory 有效 7.4 all 16 formal all 1 preview 完整
53300 53 too_many_connections 有效 7.4 all 16 formal all 1 preview 完整
53400 53 configuration_limit_exceeded 有效 9.2.0 9.2.24 → 18.6 (14) all 1 preview 完整
54000 54 program_limit_exceeded 有效 7.4 all 16 formal all 1 preview 完整
54001 54 statement_too_complex 有效 7.4 all 16 formal all 1 preview 完整
54011 54 too_many_columns 有效 7.4 all 16 formal all 1 preview 完整
54023 54 too_many_arguments 有效 7.4 all 16 formal all 1 preview 完整
55000 55 object_not_in_prerequisite_state 有效 7.4 all 16 formal all 1 preview 完整
55006 55 object_in_use 有效 7.4 all 16 formal all 1 preview 完整
55P02 55 cant_change_runtime_param 有效 7.4 all 16 formal all 1 preview 参考
55P03 55 lock_not_available 有效 8.0.0 all 16 formal all 1 preview 完整
55P04 55 unsafe_new_enum_value_usage 有效 12.0 12.22 → 18.6 (7) all 1 preview 参考
57000 57 operator_intervention 有效 7.4 all 16 formal all 1 preview 参考
57014 57 query_canceled 有效 7.4 all 16 formal all 1 preview 完整
57P01 57 admin_shutdown 有效 7.4 all 16 formal all 1 preview 完整
57P02 57 crash_shutdown 有效 7.4 all 16 formal all 1 preview 参考
57P03 57 cannot_connect_now 有效 7.4 all 16 formal all 1 preview 完整
57P04 57 database_dropped 有效 9.0.4 all 16 formal all 1 preview 参考
57P05 57 idle_session_timeout 有效 14.0 14.24 → 18.6 (5) all 1 preview 完整
58000 58 system_error 有效 9.2.0 9.2.24 → 18.6 (14) all 1 preview 参考
58030 58 io_error 有效 7.4 all 16 formal all 1 preview 完整
58P01 58 undefined_file 有效 7.4 all 16 formal all 1 preview 完整
58P02 58 duplicate_file 有效 7.4 all 16 formal all 1 preview 参考
58P03 58 file_name_too_long 有效 18.0 18.6 all 1 preview 完整
72000 72 snapshot_too_old 已移除 9.6.0 9.6.24 → 16.15 (8) 完整
F0000 F0 config_file_error 有效 7.4 all 16 formal all 1 preview 完整
F0001 F0 lock_file_exists 有效 7.4 all 16 formal all 1 preview 完整
HV000 HV fdw_error 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV001 HV fdw_out_of_memory 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV002 HV fdw_dynamic_parameter_value_needed 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV004 HV fdw_invalid_data_type 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV005 HV fdw_column_name_not_found 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV006 HV fdw_invalid_data_type_descriptors 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV007 HV fdw_invalid_column_name 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV008 HV fdw_invalid_column_number 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV009 HV fdw_invalid_use_of_null_pointer 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00A HV fdw_invalid_string_format 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00B HV fdw_invalid_handle 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00C HV fdw_invalid_option_index 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00D HV fdw_invalid_option_name 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00J HV fdw_option_name_not_found 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00K HV fdw_reply_handle 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00L HV fdw_unable_to_create_execution 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00M HV fdw_unable_to_create_reply 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00N HV fdw_unable_to_establish_connection 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00P HV fdw_no_schemas 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00Q HV fdw_schema_not_found 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV00R HV fdw_table_not_found 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV010 HV fdw_function_sequence_error 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV014 HV fdw_too_many_handles 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV021 HV fdw_inconsistent_descriptor_information 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV024 HV fdw_invalid_attribute_value 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV090 HV fdw_invalid_string_length_or_buffer_length 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
HV091 HV fdw_invalid_descriptor_field_identifier 有效 9.1.0 9.1.24 → 18.6 (15) all 1 preview 参考
P0000 P0 plpgsql_error 有效 8.0.0 all 16 formal all 1 preview 参考
P0001 P0 raise_exception 有效 8.0.0 all 16 formal all 1 preview 完整
P0002 P0 no_data_found 有效 8.2.0 all 16 formal all 1 preview 参考
P0003 P0 too_many_rows 有效 8.2.0 all 16 formal all 1 preview 参考
P0004 P0 assert_failure 有效 9.5.0 9.5.25 → 18.6 (11) all 1 preview 完整
XX000 XX internal_error 有效 7.4 all 16 formal all 1 preview 参考
XX001 XX data_corrupted 有效 7.4 all 16 formal all 1 preview 完整
XX002 XX index_corrupted 有效 7.4 all 16 formal all 1 preview 完整

2 - SQLSTATE 错误类

按 SQLSTATE 前两位浏览 PostgreSQL 条件。

错误类按 SQLSTATE 的前两位分组。class 只表示大致的条件家族,不能据此断定所有成员具有相同的严重性、事务后果或重试行为。

生成的成员列表链接到每个错误码唯一的规范页面。class 只是目录身份,具体机制和恢复方式仍看错误码页面。

类别 名称 成员
00 成功完成 00000
01 警告 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01
02 无数据 02000, 02001
03 SQL语句尚未完成 03000
08 连接异常 08000, 08001, 08003, 08004, 08006, 08007, 08P01
09 触发动作异常 09000
0A 不支持的特性 0A000
0B 无效的事务发起 0B000
0F 定位器异常 0F000, 0F001
0L 无效授权者 0L000, 0LP01
0P 无效角色规范 0P000
0Z 诊断异常 0Z000, 0Z002
10 XQuery错误 10608
20 未找到 Case 20000
21 基数冲突 21000
22 数据异常 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06
23 完整性约束冲突 23000, 23001, 23502, 23503, 23505, 23514, 23P01
24 游标状态无效 24000
25 事务状态无效 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 25P04
26 SQL语句名称无效 26000
27 触发数据变更冲突 27000
28 授权规范无效 28000, 28P01
2B 依赖权限描述符仍存在 2B000, 2BP01
2D 事务终止无效 2D000
2F SQL例程异常 2F000, 2F002, 2F003, 2F004, 2F005
34 游标名称无效 34000
38 外部例程异常 38000, 38001, 38002, 38003, 38004
39 外部例程调用异常 39000, 39001, 39004, 39P01, 39P02, 39P03
3B 保存点异常 3B000, 3B001
3D 目录名称无效 3D000
3F 模式名称无效 3F000
40 事务回滚 40000, 40001, 40002, 40003, 40P01
42 语法错误或访问规则冲突 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22
44 WITH CHECK OPTION 冲突 44000
53 资源不足 53000, 53100, 53200, 53300, 53400
54 程序限制超出 54000, 54001, 54011, 54023
55 前置状态不满足 55000, 55006, 55P02, 55P03, 55P04
57 操作员干预 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05
58 系统错误 58000, 58030, 58P01, 58P02, 58P03
72 快照失败 72000
F0 配置文件错误 F0000, F0001
HV 外部数据包装器错误 HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091
P0 PL/pgSQL错误 P0000, P0001, P0002, P0003, P0004
XX 内部错误 XX000, XX001, XX002

3 - 常见错误码

面向故障排查精选的 SQLSTATE 入口。

这里按常见排查路径提供编辑精选入口,不代表生产环境频率排名;每一行说明该条目帮助回答的具体问题,并保留其审阅状态。

错误码 条件名 入口说明
23505 unique_violation 重复键、约束冲突与幂等写入。
23503 foreign_key_violation 外键修复与依赖顺序。
23502 not_null_violation 必填值缺失与输入校验。
23514 check_violation CHECK 约束与不变量失败。
23P01 exclusion_violation 排除约束与范围冲突。
40P01 deadlock_detected 死锁诊断、回滚与锁顺序。
40001 serialization_failure 可串行化重试与新事务快照。
25P02 in_failed_sql_transaction 错误后必须处理的失败事务状态。
42P01 undefined_table 关系不存在与 search_path 诊断。
42601 syntax_error 语句执行前的语法错误。
42501 insufficient_privilege 权限检查与授权失败。
28P01 invalid_password 密码认证与连接建立。
57014 query_canceled 取消、statement_timeout 与后续操作。
53300 too_many_connections 连接上限与接入失败。
2202E array_subscript_error 数组维度、拼接与类型规则。
01000 warning 警告分发与非错误诊断。
P0001 raise_exception 应用定义的 PL/pgSQL 异常。
XX000 internal_error 内部错误的安全边界与升级处理。

4 - 主题

从运维问题出发查找对应的 SQLSTATE 路径。

主题包括约束冲突、认证与授权、事务重试、锁与超时、对象解析以及资源或系统故障。主题只指向错误码页面,不为同一个条件建立第二个身份。

主题 错误码
约束与冲突 23505, 23503, 23502, 23514, 23P01, 23000, 23001
认证与权限 28P01, 28000, 42501
事务、锁与重试 40P01, 40001, 25P02, 25006, 57014
语法与对象解析 42601, 42P01, 42P02, 42701, 42703, 42883
资源与连接 53300, 53000, 53100, 53200, 57P01, 57P03, 58000
数据与类型边界 2202E, 22003, 22007, 22P02

5 - PostgreSQL 版本

比较各版本中的 SQLSTATE 定义与有文档依据的变化。

生成的表格会把正式 PostgreSQL 发布版与最新预发行快照分开。存在表示冻结源码中找到了该定义;这本身不等于证明运行时路径或精确的引入版本。

版本 渠道 错误码数 证据
9.0.23 正式版本 199 locked source
9.1.24 正式版本 228 locked source
9.2.24 正式版本 232 locked source
9.3.25 正式版本 232 locked source
9.4.26 正式版本 232 locked source
9.5.25 正式版本 236 locked source
9.6.24 正式版本 238 locked source
10.23 正式版本 240 locked source
11.22 正式版本 241 locked source
12.22 正式版本 257 locked source
13.23 正式版本 258 locked source
14.24 正式版本 259 locked source
15.19 正式版本 260 locked source
16.15 正式版本 260 locked source
17.11 正式版本 260 locked source
18.6 正式版本 262 locked source
19beta3 预发行 262 locked source

6 - 指南

阅读 PostgreSQL 诊断、恢复事务状态以及选择客户端边界的通用方法。

先读协议诊断

先确认协议消息类型。PostgreSQL 用 ErrorResponse 表示错误,用 NoticeResponse 表示通知;两者都携带以零字节结束的带标识字段。C 是不可本地化的 SQLSTATE,M 是主消息,D/H 分别是可选 detail 与 hint。S 可能本地化,V 是服务器提供时的未本地化 severity。schema(s)、table(t)、column(c)、constraint(n)、position(P)、context(W)、源码文件(F)、行号(L)和 routine(R)等字段都是有条件的;有就保留,没有就不要推断。参见 PostgreSQL 18 错误与通知字段消息格式

目录类别只是分类。决定语句是否失败前,要先读取实际协议严重性和消息类型。WARNINGNOTICE 可以作为通知送达,同时命令仍然完成;ERROR 作为错误送达,通常会改变显式事务状态。成功的 CommandComplete 只有命令标签,不携带 ErrorResponse SQLSTATE。把服务器版本和操作一起保留,因为相同 SQLSTATE 可能对应不同源码路径。

恢复正确的事务边界

自动提交为每条语句建立独立事务边界。语句错误后,连接通常仍可执行下一条语句。显式事务中的未处理 ERROR 会使事务进入失败状态;之后普通命令会被 PostgreSQL 以 25P02 拒绝,直到回滚。25P02 是后续观察,不是第一条错误的替代品。实际边界应参照 ROLLBACKSAVEPOINT 文档。

如果一个已经存在的保存点包围了可选内部单元,则执行 ROLLBACK TO SAVEPOINT name,然后继续外层事务或释放保存点;保存点以前的工作会保留。没有这样的保存点时,ROLLBACK 会结束失败事务,重试必须从新事务开始。已接受的 25P02 案例 展示根错误 23505、后续 25P02 和恢复;23505 证据 记录更窄的保存点边界。

PL/pgSQL 的 EXCEPTION 块提供另一种窄边界。进入处理器前,块内变更会回滚;块以前的外层变更保留。处理器中,SQLSTATESQLERRM 表示当前异常;GET STACKED DIAGNOSTICS 可读取 RETURNED_SQLSTATE、主消息、detail、hint、context 和对象字段。参见错误捕获堆叠诊断RAISE。处理器应只包围能够安全分类的操作;WHEN OTHERS 不应抹掉原始字段。

只有在结果边界明确时才重试完整单元

重试是业务决策,不是 SQLSTATE 类别的属性。若序列化失败或死锁等原因具有瞬时性且操作可安全重复,应从新快照重试整个事务。不要只重放最后一条语句,因为前面的读取、写入、锁、通知或外部调用可能共同构成一个业务单元。客户端超时或在收到结果前失联时,服务器可能已经提交但客户端没有响应,完成状态不确定;对外部可见操作应使用幂等键、持久业务键或状态查询后再重复。

遇到权限错误、对象不存在或无效数据时,先检查并修复权限、对象或输入,再判断修正后的操作是否安全。已经完成命令的警告不应触发自动重放。保留第一条诊断和事务状态;随后出现的 25P02 应作为后果记录。退避和尝试次数上限可以控制负载,却不能使非幂等操作变得安全。服务器明确报告超时或取消表示操作失败;客户端在获知结果前失联则属于完成状态不确定的另一类情况。

关联应用与服务器日志

在格式化消息前,记录 SQLSTATE、未本地化 severity、主消息、detail、hint、对象名称、position/context、服务器版本、可用时的 backend PID,以及客户端事务状态。添加应用请求或幂等键和时间戳,便于在服务器日志中找到同一操作。PID、session 标识和 query ID 是关联线索,不能替代协议字段。

CSV 和 JSON 服务器日志是结构化输出,但形状不等同于 ErrorResponse。PostgreSQL 18 的 csvlog 列包含 severity、SQLSTATE、message、detail、hint、context、query、源码位置、application name、backend type 和 query ID。jsonlog 输出 JSON,并可能省略 null 字段;处理器应忽略未来新增字段。按日志文档配置 log_destinationlogging_collector,再按 PID/session/request 关联,不要假定 CSV 列名或 JSON 键名与协议字段相同。

PL/pgSQL 与自定义条件

RAISE 可以报告 DEBUGLOGINFONOTICEWARNINGEXCEPTIONEXCEPTION 通常中止当前事务,其他级别只发送消息。它可以指定条件名或五字符 SQLSTATE,并通过 USING 设置 MESSAGEDETAILHINTSCHEMATABLECOLUMNDATATYPECONSTRAINT。PostgreSQL 允许使用除 00000 外、由数字和大写 ASCII 字母组成的任意五字符代码,包括自定义代码。末三位全为零的代码是类别码,只能用整个类别捕获。参见 RAISE 语法

命名处理器匹配指定条件及其别名;类处理器范围更宽。WHEN OTHERS 捕获除 QUERY_CANCELEDASSERT_FAILURE 以外的所有错误条件;通知级消息不是异常,因此不会被它捕获。PL/pgSQL 主动抛出的自定义代码只能证明该函数有意报告,不能证明 core、contrib、FDW、ECPG 或 driver 自然产生同一代码。

客户端如何暴露诊断

下表固定到已检查的发行版或主文档;不声称本项目对六个客户端都做过运行测试。

客户端 检查版本/来源 暴露的诊断 应保留的边界
libpq PostgreSQL 18.6,commit 724edf9b PQresultErrorField 从错误或警告 PGresult 读取字段;PQstatus 描述连接状态。 启动失败可能没有 PGresult;结果字段 API 不是通用启动错误 API,应分开记录连接文本和服务器日志。
psycopg 3.3.5,tag 解析到 commit ea542c95 Error 暴露 sqlstatediagpgconnpgresult;同一源码构造具名 SQLSTATE 异常类。 连接错误可能是 sqlstate=None,失败查询则可能有结果诊断。
PostgreSQL JDBC pgjdbc REL42.7.8,commit 9a5492d9 PSQLException.javaServerErrorMessage.getSQLState() 映射到 JDBC getSQLState(),并保留服务器消息。 客户端和传输异常也会被包装;要同时看异常类型和 server-message 是否存在。
pgx/pgconn pgx v5.7.6,commit a2fca037 errors.go 为服务器错误定义 PgError.SQLState() 连接、context 和解析错误是其他 Go error 类型或包装;使用 errors.As
node-postgres / pg-protocol node-postgres pg@8.16.3,commit 8f8e7315 messages.tsparser.tsE/N 字段解析为数据库错误和通知消息。 code、severity、detail、hint、对象字段来自服务器诊断;socket 错误是独立 JavaScript error,可能没有 SQLSTATE。
Npgsql Npgsql v10.0.0,commit a1802184 PostgresException.cs 暴露 SqlState诊断指南 区分通知和异常类型。 NpgsqlException 可以包装网络/客户端失败;通知通过 Notice 事件到达,不是命令错误。

跨客户端看,具名异常类、常量和包装类型只是便利映射;跨客户端证据仍是协议 SQLSTATE 和字段。客户端错误消息或 null SQLSTATE 不会覆盖服务器日志中确认的代码。已有 psycopg 3.3.5/libpq 18.6 启动记录中 driver 为 null、服务器为 28P01/53300,只证明这一栈的边界,不能外推到其他五个客户端。

7 - 覆盖范围

大典的版本、语言、内容深度和证据覆盖情况。

覆盖报告会分别统计正式版本定义、预发行快照、中英文配对页面、编辑深度、源码确认和运行案例。生成页面数量不能代替有效的参考内容。

  • 规范正式快照:展示 16 个;完整正式历史扫描 351 个;正式 SQLSTATE 并集:263 个。
  • 预发行快照:1 个;预发行并集:262 个,其中仅预发行 0 个。
  • 双语页面对:263;当前英文到中文的实际修订绑定:263。
  • 内容深度:深入 82、参考 181、占位 0;审阅:已审阅 263、待复核 0。
  • 选定运行观察(按代码、摘要、用例编号去重):181;通过 165,不适用 16,失败 0,未运行 0。
  • 来源使用状态(按至少有该状态的 code 计数,可重叠):仅有目录定义 222、源码路径已确认 193、观察到运行时 66、明确未知 183;未知记录按历史 128、自然运行 173、发出路径 12、其他 8 分开(这些是记录数,不是 code 数,不把历史或自然运行未知解释成发出路径未知);别名 6 个(涉及 6 个 code)。
  • 运行观察按代码、摘要、用例编号去重;目标表中的记录适用性(通过/不适用)与其中每个边界断言的结果分别保留。
目标 通过 不适用 失败 未运行
latest (18.6; server_version_num=180006) 82 6 0 0
pg10 (10.21; server_version_num=100021) 79 9 0 0
pg14 (14.24; server_version_num=140024) 1 0 0 0
pg15 (15.19; server_version_num=150019) 1 0 0 0
pg16 (16.15; server_version_num=160015) 1 0 0 0
pg17 (17.11; server_version_num=170011) 1 1 0 0

8 - 方法

SQLSTATE 大典的范围、来源锁定、证据状态和翻译维护方法。

范围与锁定输入

大典从 PostgreSQL 发布定义开始,分开记录目录身份、源码实现、官方文档和本地运行观察。锁定 manifest 包含 351 个正式 tag、一个 PostgreSQL 19 Beta 3 预览、19 个定义 blob、263 个代码并集和 44 个类别。公开版本展示矩阵更小,只含 16 个正式大版本快照(9.0–18)和该预览;不能把它当成完整 tag 历史。PostgreSQL 18.6 固定为 REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7,定义路径是 src/backend/utils/errcodes.txt;PostgreSQL 19 Beta 3 是独立预览,固定在 3638289fb57bdabec00deda98ee9624a35f5d66a

正式历史存在 18.4→18.6 的 tag 缺口。pre-9 收集覆盖 7.0 至 8.4.22 的 191 个 tag,其中 7.4–8.4 有定义文件,7.0–7.3 只有候选路径探测。旧路径缺失是来源缺口,不是代码不存在的证明。known_present_by 是存在边界;只有相邻源码同时证明两侧时才记录精确引入或移除。

证据状态

每条结论都记录所支持的源码路径和固定发布版、tag 或 commit。definition_only 只证明目录身份和历史,不证明报告该码的路径;source_path_confirmed 指向具体调用或实现上下文;observed_runtime 必须有真实运行记录、适用的通过断言和实际 SQLSTATE,源码扫描与跳过案例不能自动升级为运行覆盖。unknown 表示范围尚未解析,不表示绝对缺失。

词法源码候选在采纳前必须回到 C 上下文阅读。私有调用扫描是有界研究输入,不是面向读者的证明。core、contrib、extension、自定义函数、ECPG、driver 和远端服务器路径分开记录。ECPG 或客户端可以复用 PostgreSQL 定义的代码,FDW 或驱动也可能转发远端代码,但这不能证明 server core 在同一操作中报告该代码;反过来,core 路径也不能证明每个 wrapper 或客户端都暴露全部字段。

官方 PO 文本可以确认固定 commit、消息 domain 和占位符边界,但不能证明中文运行输出。locale、driver 行为、服务器版本和消息送达必须分别观察。内部消息和动态字段保留源码条件;翻译或格式化后的字符串永远不是稳定协议键。

运行与恢复边界

运行观察使用隔离的版本化目标,并保留足以识别案例和版本的环境与结构化结果。通过的观察只覆盖所断言的案例和版本;not_runnot_applicable、source-only 以及 driver 为 null 的 SQLSTATE 都明确保留。启动认证或资源失败发生在 SQL 事务之外;即使启动异常没有 driver SQLSTATE,服务器日志也可能记录 SQLSTATE。显式事务中,根错误和后续 25P02 是两条观察;保存点处理器、PL/pgSQL 异常块和完整事务重试具有不同范围。

PL/pgSQL 故意抛出的自定义代码可以展示协议送达和处理器匹配,却不能证明 core、contrib、FDW、ECPG 或 driver 自然报告同一代码。这类观察应标明是故意行为,不应当作自然子系统行为。

翻译与维护

英文是源页面。每个中文页面保留锚点、SQLSTATE 身份、事实、引用、诊断字段和恢复边界,并用自然中文完整传达。中文 front matter 保存英文页面规范化 {title, description, body} 的确定性 UTF-8 SHA-256;英文标题、描述或正文变化后,中文页会过期,直到完成翻译并刷新 revision。生成事实块有明确边界,可从 data/errcodes 刷新;作者正文和证据分开维护。

有价值的维护变更应同时更新固定源码引用、证据状态和两种语言页面。不能从改名的条件、旧 PO 条目、通用 API 签名或客户端 wrapper 推断新的运行机制。公开目录和证据视图只是已接受记录的展示层,不是证据生产过程。

主要记录

公开的版本矩阵目录证据索引运行案例索引展示已接受的投影。维护者使用 reports/CATALOGUE.mdreports/SOURCE-SCAN.mdreports/RUNTIME-BOUNDARIES.mdreports/RUNTIME.md 查阅底层记录;这些报告路径是仓库位置,不是公开页面链接。来源 manifest lock 为 sources/manifest.lock.json(SHA-256 1727a275f336988ff96b4f9990a4ca253080f73fc5d316e7def165c8cf3708a8);pre-9 lock 为 sources/pre9-manifest.lock.json(SHA-256 77bedf102d109972e91ff1b61841d78a38da7c7c049e428782392761a4ce7cd6)。

9 - 00000 — successful_completion

PostgreSQL SQLSTATE 00000 表示成功完成,不是通常意义上的错误条件。

00000 — successful_completion

速览

00000 是成功完成 SQLSTATE。PostgreSQL 错误机制在没有设置更具体代码且级别低于 WARNING 时默认选择它;成功命令不需要错误消息。

字段
SQLSTATE 00000
条件名 successful_completion
状态 有效
已知存在于 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_SUCCESSFUL_COMPLETION
别名

含义

elog.cerrstart 按消息级别选择默认 SQLSTATE;低于 WARNING 时设置 ERRCODE_SUCCESSFUL_COMPLETION。这是错误机制中的源码级默认值,不是应用错误机制,也不表示普通命令会携带 ErrorResponse

消息与诊断

命令完成通常由成功结果和命令标签表示,不携带 ErrorResponse SQLSTATE。在固定的 elog 路径中,只有没有更具体代码且消息级别低于 WARNING 时,错误机制才把 00000 作为默认值初始化。诊断消息必须同时保留实际协议消息类型和严重性;00000 不是 ERROR 的默认码,也不会把成功结果变成 ErrorResponse

诊断

先检查客户端结果状态和命令标签。如果客户端把 00000 与失败状态或 ErrorResponse 一起报告,应调查来源和客户端 API 的状态处理,不能把它解释为通常成功,也不要凭空寻找错误 detail。

处理

将成功命令结果按完成处理。若 NoticeResponse 携带 00000,应把通知与命令结果分开记录;只有两者冲突时才调查客户端状态处理。不要仅因出现此代码就重试成功命令。

版本

锁定目录从 9.0.23 到 18.6 以及 19 Beta 3 均有 00000known_present_by 为 7.4。18.6 固定的 elog.c 路径显示低于 WARNING 时的默认赋值;这不是每个客户端协议的运行实测。

01000 是警告类;02000 是无数据条件;P0002 是 PL/pgSQL 的 no_data_found

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • elog.c — 固定路径,SHA-256 766d30a426ba1d9597657bd46fb890da3e37e4ae53a83d1245bf082ed9433c33
  • 结构化证据 — 固定来源、消息和运行边界。

10 - 01000 — warning(警告)

PostgreSQL 使用 SQLSTATE 01000 表示通用警告(warning)条件。应先区分目录分类与实际 WARNING 或 NOTICE 严重级别,再按产生该消息的子系统诊断。

速览

01000 是类别 01 Warning 中的通用警告(warning)条件。它只是目录分类,不对应某一个固定子系统或固定报文。PostgreSQL 源码目录明确说明,不应把这个类别用于失败条件。

这个五字符代码必须和协议严重级别及完整诊断一起读取。在 ErrorResponseNoticeResponse 中,S 是可能经过本地化的严重级别,V 是未本地化的严重级别。因此,当产生消息的代码显式提供了该代码时,SQLSTATE 仍可以是 01000,而消息严重级别可能是 WARNINGNOTICEINFO 或其他提示级别。

在常见的默认路径中,PostgreSQL 将 ereport(WARNING, ...) 映射为 01000,将不低于 ERROR 的级别映射为 XX000,将更低的级别映射为 00000。显式的 errcode() 可以覆盖这个默认值。因此,目录中的 W 标记有参考价值,但单凭它不能证明线上协议消息一定是实际的 WARNING

代表性案例 generic_warning_boundary 在 PostgreSQL 18.6 和 10.21 上均通过。它用 PL/pgSQL RAISE WARNING 核验默认的 01000 分发,实际收到 WARNING 提示,并保持自动提交连接可继续使用。它没有实测异步 NOTIFY、hstore、XID 或 MultiXact 警告路径。

字段
SQLSTATE 01000
条件名 warning
状态 有效
已知存在于 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_WARNING
别名

锁定目录在 PostgreSQL 7.4 的 pre-9.0 正式源码中已经观察到该代码,并确认它存在于 9.0.23 至 18.6 的每个正式快照及 19 Beta 3 预览快照。pre-9.0 源码扫描覆盖 7.4 至 8.4.22;7.0 至 7.3 仍有候选源码缺口。因此,7.4 是已知存在边界,不是精确引入版本。

含义与触发路径

锁定的 18.6 定义是在类别 01 下的 01000 W ERRCODE_WARNING warning。默认严重级别映射位于 elog.cERROR 或更高级别从 ERRCODE_INTERNAL_ERROR 开始,WARNING 级别从 ERRCODE_WARNING 开始,更低级别从 ERRCODE_SUCCESSFUL_COMPLETION 开始。随后构造错误消息时还可以替换这个初始代码。

若干真实路径会使用通用警告(warning)代码:

  • 异步通知队列会报告 NOTIFY queue is %.0f%% full。如果找到最老的监听事务,还会附带指出 PID 的详细信息,并提示结束该事务。这是队列压力警告,不是数组、权限或约束失败。
  • 事务 ID 和 MultiXact 回卷保护会报告某个数据库必须在剩余多少事务或 MultiXact ID 用完前执行 VACUUM。提示会指向全库 VACUUM,以及旧预备事务或陈旧复制槽。
  • SPI 清理路径会显式提供 ERRCODE_WARNING,报告非空 SPI 栈,并提示检查遗漏的 SPI_finish。这里的代码是显式指定的,即使严重级别同样是 WARNING

这些源码确认的例子说明,报文、详细信息、提示、源码上下文和操作比单独的 01000 更有行动价值。其他类别 01 条件(如 010030100C)拥有自己的 SQLSTATE,不应全部折叠成这个通用代码。

报文与诊断

可执行的代表性案例是注册表中的 generic_warning_boundary

DO $$ BEGIN RAISE WARNING 'calibration warning'; END $$;
SELECT 1;

PostgreSQL 18.6 和 10.21 都通过提示通道送出这条警告,得到 SQLSTATE 01000、严重级别 WARNING 和主报文 calibration warning。后续的 SELECT 1 成功,连接状态为 IDLE。这是实际的 RAISE WARNING 分发核验,不是上面分别列出的 NOTIFY 队列、hstore 兼容、事务 ID 或 MultiXact 路径的运行时证据。

诊断

从驱动或协议中记录 C/sqlstateSVMDH,并同时记录语句、数据库、后端 PID 和时间戳。带有提示处理器的客户端还应记录提示,而不只是异常:WARNING 级别的 NoticeResponse 可以在不抛出语句异常的情况下送达。若有 V,请保留本地化严重级别与未本地化值。

当客户端或服务器日志中看不到消息时,检查 SHOW client_min_messagesSHOW log_min_messages。这些设置控制送达与记录阈值,不会改变根因。对于重复出现的警告(warning),使用 SQLSTATE 和稳定的报文模板搜索日志,再检查对应子系统:

  • NOTIFY queue ... full 应检查长期存活的监听事务及 DETAIL 中的 PID。
  • XID 或 MultiXact 回收警告应在回卷保护变成真实失败之前检查事务年龄、预备事务和复制槽。
  • 非空 SPI 栈应指向扩展或服务器端 SPI 生命周期管理。

不能仅凭 01000 推断事务已经中止、连接已经损坏或数据已经损坏。代表性警告让会话保持可用,但后续语句可能因独立原因失败,函数或客户端操作也可能施加自己的控制流。

处理

以报文中的子系统和提示作为修复目标。结束或修复占住通知队列或旧事务回收边界的事务;检查复制槽和预备事务后执行提示的全库维护;或者修复扩展的 SPI 所有权。调查时保留原始诊断。

实际的 WARNING 或更低级别提示本身不会把显式事务置为中止,通常也会让连接保持可继续使用。应验证下一条命令及事务状态,不要从代码本身猜测结果。如果随后出现 ERROR,请按照那个错误的 SQLSTATE 处理,并根据其事务契约使用 ROLLBACK 或合适的保存点恢复。

提高 client_min_messageslog_min_messages 可以减少噪声,但不会修复队列、事务回收边界或 SPI 生命周期。只有理解了底层信号后才应考虑抑制它。

版本

目录记录 01000 存在于锁定的 7.4–8.4.22 pre-9.0 正式源码,以及 9.0.23 至 18.6 的所有正式目录快照和 19 Beta 3 预览快照。同 tag 的 REL8_1_4 errcodes.sgml 表已经用较早的 1000 写法列出条件名 warning,因此至少可以确认 8.1.4 已有该条件名。7.0–7.3 仍有候选源码缺口,因此 7.4 观察结果只是存在边界,不是精确引入版本。18.6 源码快照固定在 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7

协议严重级别字段以及 client_min_messages/log_min_messages 控制项以 PostgreSQL 18 文档为依据。上面的代表性源码路径是 18.6 观察结果,不表示每个旧版本中的所有报文模板都完全不变。

00000successful_completion 是低级别完成消息的默认代码。01003null_value_eliminated_in_set_function0100Cdynamic_result_sets_returned 是更具体的类别 01 条件。XX000internal_error 是没有显式代码的 ERROR 的默认代码,不能与 warning 混用。25P02in_failed_sql_transaction 描述的是前一个错误已经中止事务后拒绝后续命令,不能把它当成每个 01000 消息的后果。

来源

本页的结构化证据记录在公开证据 JSON中。源码和文档记录均使用固定 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留通过的提示注册表和精确 run ID。

11 - 01003 — null_value_eliminated_in_set_function

PostgreSQL SQLSTATE 01003 表示集合函数消除 NULL 值的警告;固定核心扫描没有找到发射路径。

01003 — null_value_eliminated_in_set_function

速览

01003 是警告类别条件,名称描述集合函数消除 NULL 值。没有解析出 18.6 核心与 contrib 报告组,因此不能确认具体 PostgreSQL 聚合、消息或客户端严重性路径。

字段
SQLSTATE 01003
条件名 null_value_eliminated_in_set_function
状态 有效
已知存在于 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_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION
别名

含义

定义名称描述集合函数中的 NULL 消除,但固定源码扫描没有定位 PostgreSQL 发射器。来源可能是服务器扩展、客户端或其他实现。

消息与诊断

没有解析出 18.6 消息变体。应保留原始警告文本、语句、聚合或集合函数上下文,以及发出它的服务器或客户端来源。

诊断

先定位发出代码的来源;仅凭 SQLSTATE 无法确定是哪一个聚合或驱动行为。确认来源报告的是 warning、notice 还是只有诊断代码,并把 NULL 消除与查询无行区分开。

处理

如果实际实现文档支持某个设置或表达式调整,应只做该定向修改并验证结果。不要笼统地抑制或重试所有警告。

版本

01003 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。这是定义存在事实,不是当前服务器发射路径的确认。

01004 是字符串截断警告;02000 是无数据;00000 是成功完成。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

12 - 01004 — string_data_right_truncation

PostgreSQL SQLSTATE 01004 表示警告类别的字符串右截断条件;固定核心扫描没有找到发射路径。

01004 — string_data_right_truncation

速览

01004 的名称描述作为警告报告的右截断。没有解析出 18.6 核心与 contrib 报告组,因此不能指定某个转换、编码、客户端或消息。

字段
SQLSTATE 01004
条件名 string_data_right_truncation
状态 有效
已知存在于 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_WARNING_STRING_DATA_RIGHT_TRUNCATION
别名

含义

定义名称描述作为 warning 条件的右截断。没有解析出的调用组时,实际截断行为、数据是否保留以及来源仍未知。

消息与诊断

没有解析出 18.6 消息变体。应保留值和列上下文、声明长度与接收长度(若有)、编码、来源版本及完整诊断。

诊断

定位实际发出代码,并按其长度和编码规则比较传输值。区分保留截断值的 warning 与拒绝语句的 error;SQLSTATE 本身不能决定这种行为。

处理

按来源实现支持的长度或编码调整,并验证数据是否被有意截断。信息可能已经丢失时,不要原样重试输入。

版本

01004 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。现有证据确认目录事实,不确认当前核心发射路径。

01003 涉及 NULL 消除;01008 涉及零位填充;22001 是独立的错误类别字符串截断。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

13 - 01006 — privilege_not_revoked

PostgreSQL SQLSTATE 01006 在 REVOKE 没有撤销或没有完全撤销请求权限时以 WARNING 发出。

01006 — privilege_not_revoked

速览

PostgreSQL 18.6 在 src/backend/catalog/aclchk.cREVOKE 路径确认发出 01006。它报告权限变化为空或不完整;命令可以完成,同时发送 warning。

字段
SQLSTATE 01006
条件名 privilege_not_revoked
状态 有效
已知存在于 8.0.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_WARNING_PRIVILEGE_NOT_REVOKED
别名

含义

确认的 18.6 实现是 ACL 命令中的 REVOKE 路径,区分没有撤销权限和没有完全撤销权限,并分别使用列级和对象级模板。

消息与诊断

18.6 固定路径的主消息模板为:no privileges could be revoked for column "%s" of relation "%s"no privileges could be revoked for "%s"not all privileges could be revoked for column "%s" of relation "%s"not all privileges could be revoked for "%s"。确认组没有 detail 或 hint。

诊断

记录目标是列还是对象,以及解析后的关系/对象名。在固定 aclchk.c 函数中,this_privileges 是请求权限集合与有效 grantor 可用 grant option 的交集。REVOKE warning 在该掩码为零时是 none,在 !all_privs 且掩码不同于请求时是 partial;这个 warning 分支不会检查 grantee 的旧 ACL。分别检查有效授权者、grant option、请求权限,再检查最终 ACL。WARNING 与会中止命令的 ERROR 不同。

处理

将命令结果和 warning 分开处理。如果目标访问变化没有完成,修正角色、对象或权限并检查 ACL;不改变造成不匹配的条件而重复 REVOKE 可能得到同一 warning。

版本

01006 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 8.0.0。18.6 的固定 warning 路径确认当前消息,不表示所有历史版本措辞相同。

01007 是对应的未授予权限 warning;42501 是权限 error;01000 是警告类。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • aclchk.c — 固定路径,SHA-256 9700258318959b47c42edb423418fb511dd3a008023e732f601eecf4c80868f8
  • 结构化证据 — 固定来源、消息和运行边界。

14 - 01007 — privilege_not_granted

PostgreSQL SQLSTATE 01007 在 GRANT 没有授予或没有完全授予请求权限时以 WARNING 发出。

01007 — privilege_not_granted

速览

PostgreSQL 18.6 在 src/backend/catalog/aclchk.cGRANT 路径确认发出 01007。它报告授予为空或不完整,本身不表示 GRANT 以 error 失败。

字段
SQLSTATE 01007
条件名 privilege_not_granted
状态 有效
已知存在于 8.0.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_WARNING_PRIVILEGE_NOT_GRANTED
别名

含义

确认的 18.6 实现是 ACL 命令中的 GRANT 路径,区分没有授予权限和没有完全授予权限,并分别使用列级和对象级模板。

消息与诊断

18.6 固定路径的主消息模板为:no privileges were granted for column "%s" of relation "%s"no privileges were granted for "%s"not all privileges were granted for column "%s" of relation "%s"not all privileges were granted for "%s"。确认组没有 detail 或 hint。

诊断

记录目标是列还是对象,以及确切关系/对象名。在固定 aclchk.c 函数中,this_privileges 是请求权限集合与有效 grantor 可用 grant option 的交集。GRANT warning 在该掩码为零时是 none,在 !all_privs 且掩码不同于请求时是 partial;这个 warning 分支不会检查 grantee 的旧 ACL。分别检查有效授权者、grant option、请求权限,再检查最终 ACL。区分部分 WARNING 与权限 ERROR

处理

检查 ACL 结果,并修正操作涉及的角色、目标、权限或授予选项。只有在理解权限不匹配后,重新执行相同 GRANT 才有意义。

版本

01007 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 8.0.0。18.6 路径确认当前消息和严重级别,不表示历史措辞一致。

01006 是未撤销权限 warning;42501 是权限 error;01000 是警告类。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • aclchk.c — 固定路径,SHA-256 9700258318959b47c42edb423418fb511dd3a008023e732f601eecf4c80868f8
  • 结构化证据 — 固定来源、消息和运行边界。

15 - 01008 — implicit_zero_bit_padding

PostgreSQL SQLSTATE 01008 表示隐式零位填充警告;固定核心扫描没有找到发射路径。

01008 — implicit_zero_bit_padding

速览

01008 的名称描述隐式零位填充的警告类别条件。没有解析出 18.6 核心与 contrib 报告组,因此不能确认具体位串转换或消息。

字段
SQLSTATE 01008
条件名 implicit_zero_bit_padding
状态 有效
已知存在于 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_WARNING_IMPLICIT_ZERO_BIT_PADDING
别名

含义

定义名称描述隐式零位填充警告。固定源码扫描没有定位会产生它的转换或接口。

消息与诊断

没有解析出 18.6 消息变体。应保留来源、源和目标位串类型、声明长度及完整诊断。

诊断

定位实际类型转换或驱动路径,并按声明位长比较其填充规则。不要从普通字符串截断或查询无行推断出零位填充。

处理

若填充不是预期行为,使用来源实现支持的显式位长或转换形式并验证结果。warning 代码不表示语句已经回滚。

版本

01008 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。现有证据只确认定义存在。

01004 涉及字符串截断;01003 涉及 NULL 消除;22021 是编码 error 类。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

16 - 0100C — dynamic_result_sets_returned

PostgreSQL SQLSTATE 0100C 表示动态结果集返回警告;固定核心扫描没有找到发射路径。

0100C — dynamic_result_sets_returned

速览

0100C 的名称描述动态结果集返回的警告类别条件。没有解析出 18.6 核心与 contrib 报告组,因此不能确认服务器来源、结果集数量或消息。

字段
SQLSTATE 0100C
条件名 dynamic_result_sets_returned
状态 有效
已知存在于 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_WARNING_DYNAMIC_RESULT_SETS_RETURNED
别名

含义

定义名称描述动态结果集返回警告。固定源码扫描没有确认来源或结果集协议。

消息与诊断

没有解析出 18.6 消息变体。应保留产生它的例程或接口、结果集数量和顺序、客户端 API,以及完整 warning/notice 诊断。

诊断

确认来源是否是支持动态结果集的过程或客户端接口。没有源码或协议证据时,不要把普通 SQL 批次的多个结果当成此条件。

处理

按实际接口契约消费或声明结果集,或有意调整该契约。一般事务重试不能解决结果集处理问题。

版本

0100C 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。这是目录证据,不是 18.6 核心发射路径确认。

02001 表示没有额外动态结果集;01000 是警告类;00000 是成功完成。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

17 - 01P01 — deprecated_feature

PostgreSQL SQLSTATE 01P01 用 WARNING 宣布已弃用功能;PostgreSQL 18.6 有固定的 MD5 密码路径。

01P01 — deprecated_feature

速览

PostgreSQL 18.6 在设置密码的操作产生或保留 MD5 verifier 时以 WARNING 发出 01P01。这是仍可继续的命令上的弃用通知,不是所有旧功能的通用失败码。

字段
SQLSTATE 01P01
条件名 deprecated_feature
状态 有效
已知存在于 8.0.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_WARNING_DEPRECATED_FEATURE
别名

含义

确认的 18.6 实现是 src/backend/libpq/crypt.c 的设置密码路径,在最终 verifier 为 MD5 时发出 warning。触发依据是最终存储的 verifier 形式,例如 password_encryption = 'md5' 下的明文输入,或作为输入传入已有的 md5... verifier;它不是 pg_hba.conf 的认证方法,已有 SCRAM verifier 本身也不会触发此 warning。

消息与诊断

固定路径主消息为 setting an MD5-encrypted password;detail 为 MD5 password support is deprecated and will be removed in a future release of PostgreSQL.;hint 为 Refer to the PostgreSQL documentation for details about migrating to another password type.

诊断

检查设置密码会话中的 SHOW password_encryption、输入是明文还是已有的 md5... verifier,并在有权限时检查角色最终 verifier。保留完整 warning,因为 detail 和 hint 指出了受影响的方法及迁移方向。不要把 pg_hba.conf 的认证方法当成触发条件,也不要把已有 SCRAM verifier 推断为此 warning 的原因。

处理

按官方密码认证文档将受影响角色迁移到 SCRAM;对于明文输入,先将 password_encryption 设为 scram-sha-256,再重置密码,并验证客户端兼容性。不要把旧 MD5 verifier 原样作为迁移步骤。warning 本身不要求原样重试设置密码命令。

版本

01P01 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 8.0.0。固定的 MD5 路径和措辞仅确认 18.6;其他弃用功能或旧措辞需要独立来源。

01000 是警告类;28P01 是密码无效 error;00000 是成功完成。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • crypt.c — 固定路径,SHA-256 d0c7579210827dbaec466f1c064a3d1ea2f7f7bfbf8b40b2e79fb4769cb406a9
  • 结构化证据 — 固定来源、消息和运行边界。

18 - 02000 — no_data

PostgreSQL SQLSTATE 02000 表示无数据条件;PostgreSQL 18.6 在 amcheck 有 DEBUG 诊断,但不是每个零行 SELECT 都会抛出它。

02000 — no_data

速览

02000 在 18.6 的 contrib/amcheck/verify_nbtree.c 中有确认的 DEBUG1/DEBUG2 内部索引检查路径。下面详列的三个组都确认是 DEBUG1;这些诊断不同于普通查询无行,也不是通用客户端错误。

字段
SQLSTATE 02000
条件名 no_data
状态 有效
已知存在于 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_NO_DATA
别名

含义

确认的 18.6 实现位于 contrib/amcheck/verify_nbtree.c,索引一致性诊断在 DEBUG1DEBUG2 使用 ERRCODE_NO_DATA。这是内部诊断用途,不是普通 SELECT 无行语义。本证据具体展开三个代表性组;源码中的其他路径不在这组选定消息内。

消息与诊断

本次选定的固定消息组为:

  • DEBUG1、内部 errmsg_internalharmless fast root mismatch in index "%s",内部 detail 为 Fast root block %u (level %u) differs from true root block %u (level %u).。源码明确把它标为 harmless。
  • DEBUG1、内部 errmsg_internalblock %u of index "%s" concurrently deleted。这个分支的确认组没有 detail 或 hint。
  • DEBUG1、普通 errmsg/errdetail/errhintindex uniqueness can not be checked for index tid=(%u,%u) in index "%s",detail 为 It doesn't have visible heap tids and key is equal to the tid=(%u,%u)%s (points to heap tid=(%u,%u)).,hint 为 VACUUM the table and repeat the check.。VACUUM hint 只属于这个组。

诊断

若代码来自 amcheck,记录检查、索引、block/TID 上下文和服务器日志严重级别。fast-root mismatch 已被源码标为 harmless,应结合上下文记录,不要自动当作损坏修复。对于并发删除,应关联并发操作或快照,待相关活动稳定后再决定是否重跑。对于 uniqueness-uncheckable 组,应检查指定索引,并只在该组给出提示时执行 VACUUM 后重跑。应用无行处理应检查实际命令结果或过程条件;PL/pgSQL 的 NO_DATA_FOUNDP0002,不是 02000 的通用同义词。

处理

按分支处理:不要把 harmless fast-root 诊断自动变成修复;并发删除要调查并发状态;只有 uniqueness-uncheckable 组给出该提示时,才先执行 VACUUM 再重跑。不要要求每个 DEBUG 发现都做维护,也不要仅因 SQLSTATE 属于 02 类就给普通 SELECT 加无行异常或重试。

版本

02000 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。18.6 证据覆盖 amcheck DEBUG 路径;其他来源需要独立源码证据。

P0002 是 PL/pgSQL no_data_found02001 涉及额外动态结果集;00000 是成功完成。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • verify_nbtree.c — 固定路径,SHA-256 a59ae7540a990e5a70e8eb9cedbcad7c62e3e86b1ad426142c8931ee188b752d
  • 结构化证据 — 固定来源、消息和运行边界。

19 - 02001 — no_additional_dynamic_result_sets_returned

PostgreSQL SQLSTATE 02001 表示没有额外动态结果集;固定核心扫描没有找到发射路径。

02001 — no_additional_dynamic_result_sets_returned

速览

02001 是关于额外动态结果集的无数据类条件,不是普通查询无行。没有解析出 18.6 核心与 contrib 报告组。

字段
SQLSTATE 02001
条件名 no_additional_dynamic_result_sets_returned
状态 有效
已知存在于 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_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED
别名

含义

定义名称表示额外动态结果集已经耗尽,但固定源码扫描没有确认实现路径。

消息与诊断

没有解析出 18.6 消息变体。应保留产生它的过程/接口、结果集位置、客户端 API 和完整诊断。

诊断

定位产生该代码的动态结果集契约,并确认调用方是否确实请求了下一个结果集。不要用普通行数检查或 PL/pgSQL NO_DATA_FOUND 处理替代它。

处理

按实际接口处理结果集序列结束,或修正调用方期待的数量。不变的事务重试不会产生另一个结果集。

版本

02001 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。对固定 18.6 扫描而言,这只是定义证据。

0100C 涉及动态结果集返回;P0002 是 PL/pgSQL no-data-found;02000 是一般无数据条件。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

20 - 03000 — sql_statement_not_yet_complete

PostgreSQL SQLSTATE 03000 表示 SQL 语句尚未完整;固定核心扫描没有解析出发射器。

03000 — sql_statement_not_yet_complete

速览

03000 是 error 类条件,名称表示 SQL 语句尚未完整。没有解析出 18.6 核心与 contrib 报告组,因此不能指定解析器、协议或客户端来源。

字段
SQLSTATE 03000
条件名 sql_statement_not_yet_complete
状态 有效
已知存在于 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_SQL_STATEMENT_NOT_YET_COMPLETE
别名

含义

定义名称表示 SQL 语句不完整。固定源码扫描没有确认是解析器、协议层还是客户端库发出。

消息与诊断

没有解析出 18.6 消息变体。应保留确切语句边界、客户端 API 或解析器、服务器/驱动版本和完整诊断。

诊断

确认代码来自语句分帧或协议层,再检查该层如何判断需要更多输入。没有实际 SQLSTATE 来源时,不要从任何语法错误、多语句批次或客户端超时推断此条件。

处理

按实际解析器或协议契约补完整语句,或修正发送了不完整单元的客户端分帧。重复发送同一不完整输入不能使它完整。

版本

03000 在锁定目录 9.0.23 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 7.4。现有 18.6 证据确认定义,但没有解析出的发射路径。

42601 是语法 error;08P01 涉及协议违规;00000 是成功完成。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba.
  • 结构化证据 — 固定来源、消息和运行边界。

21 - 08000 — 连接异常(connection_exception)

PostgreSQL SQLSTATE 08000(连接异常,connection_exception)的源码证据、诊断与处理参考。

08000 — 连接异常

速览

SQLSTATE 08000 是 Class 08 中的 connection_exception。连接异常是一个宽泛的连接管理条件。固定 PostgreSQL 路径中,postgres_fdw 会在中止清理失败、外部服务器连接不可再用时使用它;单纯的客户端拒绝连接不足以证明此码。

字段
SQLSTATE 08000
条件名 connection_exception
状态 有效
已知存在于 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_CONNECTION_EXCEPTION
别名

含义

连接异常是一个宽泛的连接管理条件。固定 PostgreSQL 路径中,postgres_fdw 会在中止清理失败、外部服务器连接不可再用时使用它;单纯的客户端拒绝连接不足以证明此码。

诊断

检查服务器日志、外部服务器名、后端 PID、事务结果和 FDW 清理路径。将报文与 08001(无法建立连接)和 08006(已有连接失败)区分;客户端库可能返回另一种异常,甚至没有 SQLSTATE。

处理

修复外部连接或清理条件,按具体路径结束失败事务;只有确认远端结果后,才重试完整且安全的业务单元。不要把普通网络异常改标为 08000。

报文

固定的 postgres_fdw 分支以 ERROR 发出主报文 connection to server "%s" cannot be used due to abort cleanup failure,外部服务器名是动态值。这个源码变体比普通客户端 socket 拒绝更具体。

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.fdw-connection.18.6contrib/postgres_fdw/connection.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 67fc002657f2c7df6d93cbf99c933cbc103907d1857ed77aedbb85099ea4dda0 (source).
  • src.fdw-connection.10.23contrib/postgres_fdw/connection.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 8a8b053e4ef599d95d0709744aa1dd5bb20047af9dc29b3f42cfba5785e525c5 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

22 - 08001 — 无法建立 SQL 连接(sqlclient_unable_to_establish_sqlconnection)

PostgreSQL SQLSTATE 08001(无法建立 SQL 连接,sqlclient_unable_to_establish_sqlconnection)的源码证据、诊断与处理参考。

08001 — 无法建立 SQL 连接

速览

SQLSTATE 08001 是 Class 08 中的 sqlclient_unable_to_establish_sqlconnection08001 是服务器端无法建立客户端连接时使用的 SQLSTATE。选定的 dblink_connect 路径 ERROR 主报文为 could not establish connection,拒绝端口原因放在动态 DETAIL 中;这与 dblink 句柄不存在的 08003,以及启动阶段的 28000、28P01、3D000 不同。

字段
SQLSTATE 08001
条件名 sqlclient_unable_to_establish_sqlconnection
状态 有效
已知存在于 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_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION
别名

含义

服务器端 dblink_connect 路径在 libpq 无法打开目标远端端点时发出此码。固定诊断为 ERROR,主报文是 could not establish connection,端点和操作系统原因放在动态 DETAIL 中。它描述的是建立命名远端句柄,与句柄不存在的 08003,以及会话尚未建立就被拒绝的 28000 或 3D000 不同。

源码并不自行格式化 DETAIL:dblink.c 通过 errdetail_internal("%s", msg) 传递 libpq 已经组装好的错误字符串。因此,下面选定运行中的 18.6 拒绝端口文本(含主机、端口和 Connection refused)以及 10.21 的 libpq 文本都只是运行观察,不是 PostgreSQL 固定的 08001 模板。

诊断

记录目标主机、端口、认证参数和完整 DETAIL。选定的 18.6/10.21 运行中,拒绝连接后本地自动提交会话保持 IDLE;随后用真实 dblink 句柄连到运行器实例,执行远端 SELECT 1,再显式断开。它证明本地恢复和句柄清理,不证明任何远端业务事务已经完成。

先判断失败阶段再重试。TCP 拒绝、DNS/TLS 失败和认证拒绝都可能由 libpq 通过这个 dblink 路径返回,必须查看动态 DETAIL,不能只按代码分类。若调用位于显式本地事务中,ERROR 可能使事务在 ROLLBACK(或 ROLLBACK TO SAVEPOINT)前不可继续;选定案例中的自动提交 IDLE 不能推广到显式事务。dblink 句柄属于创建它的后端,应在同一会话或同一个连接池成员中检查和修复。

处理

修正端点或连接参数,建立新句柄并先验证无副作用的远端探针,再发送业务操作。若失败请求可能已经越过远端边界,重试前先对账;单凭 08001 不能重放非幂等操作。

自动提交时,修正端点后可以把建连当作新的语句重试,所有者会话仍可能可用。显式事务中应先恢复本地事务,再建立并探测新句柄;只有周围工作明确设计为可继续时,保存点才适合使用。若远端操作可能已经到达目标而本地只收到错误,重放前先核对结果。

实测诊断

固定的 dblink_connect 路径以 ERROR 发出主报文 could not establish connection,并通过 errdetail_internal("%s", msg) 传递动态 libpq 字符串。选定的 18.6 运行中该值为 connection to server at "127.0.0.1", port 1 failed: Connection refused 及 libpq 的后续提示;10.21 运行中则以 could not connect to server: Connection refused 开头。这些是运行特定值,不是固定 SQLSTATE 模板。其他 producer 可能使用不同文本;只有客户端异常而没有服务器诊断,不能据此认定此 SQLSTATE。

这个 dblink 路径的严重级别固定为 ERROR。选定本地会话使用自动提交,所以错误后仍为 IDLE;不要把这个状态推广到外层显式事务,或推广到未能确认结果的远端事务。

代表案例

此 SQL 块创建 dblink,尝试连接运行器本地的拒绝端口,然后探测所有者会话。触发点是服务器端 dblink 建连,不会在远端事务中执行工作。

runner_hostrunner_portrunner_dbrunner_user 是运行器占位参数,手工复制时不能照字面使用。应替换为可访问的目标和有权连接它的登录角色;安装/使用 dblink 以及远端登录都需要相应权限。若要复现选定的恢复观察,应在同一个所有者后端中按案例的自动提交边界执行这些语句。

CREATE EXTENSION IF NOT EXISTS dblink;
SELECT dblink_connect('missing_remote', 'host=127.0.0.1 port=1 dbname=postgres connect_timeout=1');
SELECT dblink_connect('working_remote', 'host=runner_host port=runner_port dbname=runner_db user=runner_user connect_timeout=5');
SELECT * FROM dblink('working_remote', 'SELECT 1') AS result(value integer);
SELECT dblink_disconnect('working_remote');
SELECT 1;

18.6 运行记录 SQLSTATE 为 08001,主报文 could not establish connection;错误后所有者会话为 IDLE。修复打开句柄返回 OK,远端返回 1,断开返回 OK;最终探针返回 1,状态 IDLE。10.21 也通过同样断言。

可下载的案例与证据投影分别是 08001 案例 JSON作者证据。运行器清单为 verify/cases/08001/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.dblink-connect.18.6contrib/dblink/dblink.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 e4cfaec3a0a1e5d23fded584725e0f6cf7a17321ad99e5fe046e8b7f97416f15 (source).
  • src.dblink-connect.10.23contrib/dblink/dblink.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 2d542cc722ba361bd59990aaed7fe7c0f8e147155df5e5fcd56ee03b4dd27c61 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

23 - 08003 — 连接不存在(connection_does_not_exist)

PostgreSQL SQLSTATE 08003(连接不存在,connection_does_not_exist)的源码证据、诊断与处理参考。

08003 — 连接不存在

速览

SQLSTATE 08003 是 Class 08 中的 connection_does_not_exist08003 表示当前 dblink 后端会话中不存在指定名称的连接句柄。它是句柄生命周期错误,不能证明远端服务器无法建立连接(08001)或已有 socket 失败(08006)。选定路径先断开 missing_remote,再证明可以打开、查询并断开真实句柄。

字段
SQLSTATE 08003
条件名 connection_does_not_exist
状态 有效
已知存在于 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_CONNECTION_DOES_NOT_EXIST
别名

含义

此条件来自 dblink 句柄查找,发生在执行任何远端 SQL 之前:当前后端没有与请求相符的命名连接。主报文按 connection "%s" not available 组装,因此名称指向本地句柄生命周期,而不是远端可达性。句柄缺失与 08001 建连失败、以及已有连接丢失的 08006 是不同问题。

句柄查找只发生在一个 PostgreSQL 后端中。连接池可能让两个客户端使用相同的应用层连接名,但它们的 dblink 句柄表并不共享;在一个后端创建 working_remote,不能修复另一个后端的 missing_remote。固定路径没有 DETAIL 或 HINT,因此首先要保留被引用的句柄名和发起调用的会话。

诊断

检查准确的 dblink 名称以及拥有它的会话或连接池连接。主报文动态组装为 connection "missing_remote" not available;选定自动提交运行中的查找错误后仍为 IDLE,修复句柄返回远端 1dblink_disconnect 返回 OK

要把句柄查找失败和 socket 丢失分开。如果当前后端从未打开该名称,检查句柄创建路径和连接池分配;如果它曾打开而后续远端调用失败,则先收集该调用的诊断,再决定是否断开重建。在显式本地事务中,这个 dblink ERROR 遵循通常的事务中止边界,必须回滚或回到有意建立的保存点后才能执行无关语句。选定的 IDLE 是自动提交情形的结果。

处理

在实际使用句柄的同一会话中创建它,或明确将不存在的句柄断开定义为幂等操作。真实远端操作结束后先核对结果,再关闭或重建句柄;不要因为一个会话忘记 dblink 名称就重连整个连接池。

自动提交时,在同一个后端完成打开、探测和断开就是完整生命周期。显式事务中应先恢复本地事务,再在同一后端重建句柄;新句柄成功并不能证明之前的远端操作已经提交。应在连接池诊断中记录句柄名和所有权,避免重连后把工作悄悄移到另一个会话。

实测诊断

固定的句柄查找路径以 ERROR 发出主报文 connection "%s" not available;请求的句柄名称是动态值,没有固定 DETAIL 或 HINT。只有客户端异常而没有这条服务器诊断,不能据此认定 08003。

因此,选定的主报文 connection "missing_remote" not available 是具体的名称查找结果,不是远端可达性测试。固定的 ERROR 在显式事务中可能使事务进入 INERROR;选定所有者为自动提交,所以错误后仍是 IDLE

代表案例

此 SQL 块要求 dblink 断开从未打开的句柄,然后探测同一会话。

runner_hostrunner_portrunner_dbrunner_user 是运行器占位参数。手工执行时应替换为所有者具有 dblink 和远端连接权限的目标与登录角色。句柄属于当前会话:缺失查找、打开/探测和断开必须在同一后端中执行;选定案例使用自动提交。

CREATE EXTENSION IF NOT EXISTS dblink;
SELECT dblink_disconnect('missing_remote');
SELECT dblink_connect('working_remote', 'host=runner_host port=runner_port dbname=runner_db user=runner_user connect_timeout=5');
SELECT * FROM dblink('working_remote', 'SELECT 1') AS result(value integer);
SELECT dblink_disconnect('working_remote');
SELECT 1;

18.6 运行记录 SQLSTATE 为 08003,主报文 connection "missing_remote" not available;错误后所有者会话为 IDLE。修复打开句柄返回 OK,远端返回 1,断开返回 OK;最终探针返回 1,状态 IDLE。10.21 也通过同样断言。

可下载的案例与证据投影分别是 08003 案例 JSON作者证据。运行器清单为 verify/cases/08003/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.dblink-not-available.18.6contrib/dblink/dblink.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 e4cfaec3a0a1e5d23fded584725e0f6cf7a17321ad99e5fe046e8b7f97416f15 (source).
  • src.dblink-not-available.10.23contrib/dblink/dblink.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 2d542cc722ba361bd59990aaed7fe7c0f8e147155df5e5fcd56ee03b4dd27c61 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

24 - 08004 — 服务器拒绝建立 SQL 连接(sqlserver_rejected_establishment_of_sqlconnection)

PostgreSQL SQLSTATE 08004(服务器拒绝建立 SQL 连接,sqlserver_rejected_establishment_of_sqlconnection)的源码证据、诊断与处理参考。

08004 — 服务器拒绝建立 SQL 连接

速览

SQLSTATE 08004 是 Class 08 中的 sqlserver_rejected_establishment_of_sqlconnection08004 是 SQL 标准中“服务器拒绝建立连接”的名称。固定的 PostgreSQL 18.6 与 10.23 核心调用扫描没有解析出该码的 PostgreSQL ereport 路径。

字段
SQLSTATE 08004
条件名 sqlserver_rejected_establishment_of_sqlconnection
状态 有效
已知存在于 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_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION
别名

含义

08004 是 SQL 标准中“服务器拒绝建立连接”的名称。固定的 PostgreSQL 18.6 与 10.23 核心调用扫描没有解析出该码的 PostgreSQL ereport 路径。

诊断

用服务器 ErrorResponse 和认证日志识别具体条件。本范围内 PostgreSQL 路径使用 28000、28P01 等更具体的码;只有客户端异常、没有服务器字段时,不能据此认定 08004。

处理

修复实际认证、授权或端点问题后建立新连接。本页只记录定义与源码边界,不用客户端 RAISE 或伪造登录失败来冒充自然机制。

报文

本范围没有确认 08004 的固定主报文模板;现有定义/源码记录不足以建立固定文本。只有客户端异常而没有匹配的服务器诊断时,不能据此认定 08004

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6src/backend/utils/errcodes.txt at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

25 - 08006 — 连接失败(connection_failure)

PostgreSQL SQLSTATE 08006(连接失败,connection_failure)的源码证据、诊断与处理参考。

08006 — 连接失败

速览

SQLSTATE 08006 是 Class 08 中的 connection_failure08006 表示已有连接发生故障。固定路径包括 postgres_fdw 的取消/连接丢失处理以及 COPY 失败处理;它们没有一个适用于所有路径的主报文或严重级别,本批也有意不做普通 socket 的伪案例。

字段
SQLSTATE 08006
条件名 connection_failure
状态 有效
已知存在于 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_CONNECTION_FAILURE
别名

含义

固定源码路径说明了为什么本类没有统一报文。在 postgres_fdw 中,取消请求失败时,在处理已有外部连接的过程中发出 WARNING;这是取消路径的诊断,本身不证明客户端会话已经终止。在 COPY 路径中,带有未完成事务的客户端 EOF 以 ERROR 报告,而较旧的 COPY-to-stdout 路径在输出连接丢失时以 FATAL 报告。严重级别和发生阶段都是含义的一部分,不能把它们合并成“socket 断了”。

ERROR 分支若发生在显式事务中,仍连接着的会话可能进入 INERROR,调用者应先 ROLLBACK 或回到合适的保存点再执行无关 SQL。FATAL 分支会结束后端连接,不存在可以发送 ROLLBACK 的会话。已经读到 EOF 的客户端也可能根本没有 SQLSTATE。这里的证据确认这些源码分支,但没有声称每次普通网络断开都会发出 08006。

分支指引

固定分支 它说明什么 首先检查什么
postgres_fdw 取消 WARNING 已建立的外部连接上,取消请求无法发送或无法读取结果。 保留动态 libpq 文本、FDW 操作和本地事务状态;WARNING 本身不说明本地会话已关闭。
COPY 客户端 EOF ERROR 服务器在 COPY 相关连接仍有未完成事务时检测到 EOF。 触发该分支的客户端 socket 已经到达 EOF,不能在其上发送 ROLLBACK 或复用;应重新连接并核对 COPY 结果。
COPY-to-stdout FATAL 固定的 10.23 路径在 COPY 期间丢失输出连接,并使用 fatal 级别。 丢弃后端连接并核对已经发送或接收的数据;不能执行会话级回滚。
普通客户端 EOF 对端在固定服务器分支之外消失。 结合驱动/socket 和服务器日志;不要仅凭客户端 null SQLSTATE 指定 08006。

诊断

关联后端 PID、操作、服务器日志字段和客户端异常。客户端断 socket 可能得到 null SQLSTATE,而服务器端 FDW 或 COPY 路径可能发出带路径特定文本的 08006。决定是否重试前,区分 08001(尚未建立连接)、08007/40003(完成结果不确定)和语句尚未执行成功的普通错误。

要同时检查严重级别和生命周期。WARNING 表示 FDW 取消分支中本地会话可能仍然存活;ERROR 要检查 INERROR 还是 IDLE,必要时恢复事务;FATAL 表示后端已消失。如果客户端在 ErrorResponse 之前只读到 EOF,没有 SQLSTATE 是线路交换丢失的正常证据,不能据此认定 08006。

处理

丢弃连接池标记为损坏的连接,核对远端或非幂等操作的结果,并在明确幂等策略后重试完整操作。本页只确认固定源码边界;没有用 RAISE、超时或普通断 socket 冒充实测 08006。

对另一个仍保持连接的 ERROR 情形,应先回滚失败的显式事务(或回滚到围绕该操作有意建立的保存点),再决定能否重试完整操作。这个一般事务规则不能证明 COPY 客户端 EOF socket 可复用:源码分支已经检测到该客户端连接的 EOF。FATAL 或已经丢失的 socket 则要建立新会话,并在任何重放前核对结果。自动提交不会让远端或 COPY 操作自动具备幂等性,它只改变本地事务边界。

报文

固定分支包含以下不同诊断:

  • postgres_fdw 取消路径的 WARNINGcould not send cancel request: %s,其中 libpq 错误文本是动态值。
  • 同一 FDW 路径的 WARNINGcould not get result of cancel request: %s,返回的连接错误文本是动态值。
  • 固定 10.23 COPY 路径的 FATALconnection lost during COPY to stdout
  • 固定 18.6/10.23 COPY 客户端 EOF 路径的 ERRORunexpected EOF on client connection with an open transaction

证据将这些变体分开记录;普通客户端断 socket 得到的 null SQLSTATE 不能被提升为 08006。

即使报文都提到连接,ERRORFATAL 也有不同的恢复契约。COPY 客户端 EOF 的 ERROR 分支检测到客户端 socket 已经消失;它不建立可复用 socket,也不提供在该连接上发送 ROLLBACK 的路径。后者属于 COPY-to-stdout 路径,会关闭后端。本批没有自然 08006 运行,因此这些差异来自固定源码路径和文档规定的事务边界,而不是合成的 socket 实验。

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.fdw-connection-failure.18.6contrib/postgres_fdw/connection.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 67fc002657f2c7df6d93cbf99c933cbc103907d1857ed77aedbb85099ea4dda0 (source).
  • src.copy-connection-failure.10.23src/backend/commands/copy.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 0edb032be1ce8d8c90efc28e504aa9e298a2cd26cd374c85da6da0e33ed0915c (source).
  • src.copy-client-eof.18.6src/backend/commands/copyfromparse.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 bc42754023579cd782a3cb3f144ad2c2c3d3aa46119eb7567fcdb05f2d445571 (source).
  • src.copy-client-eof.10.23src/backend/commands/copy.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 0edb032be1ce8d8c90efc28e504aa9e298a2cd26cd374c85da6da0e33ed0915c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

26 - 08007 — 事务结果未知(transaction_resolution_unknown)

PostgreSQL SQLSTATE 08007(事务结果未知,transaction_resolution_unknown)的源码证据、诊断与处理参考。

08007 — 事务结果未知

速览

SQLSTATE 08007 是 Class 08 中的 transaction_resolution_unknown08007 表示事务结果未知。固定 PostgreSQL 18.6 与 10.23 调用扫描没有解析出该码的核心抛出点。

字段
SQLSTATE 08007
条件名 transaction_resolution_unknown
状态 有效
已知存在于 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_TRANSACTION_RESOLUTION_UNKNOWN
别名

含义

08007 表示事务结果未知。固定 PostgreSQL 18.6 与 10.23 调用扫描没有解析出该码的核心抛出点。

诊断

COMMIT 附近的网络故障可能让客户端无法判断服务器是否已提交,但这种不确定性不会自动变成 08007 ErrorResponse。应检查服务器日志、事务标识和业务对账记录。

处理

在完成结果核对前将结果视为未知;决定是否重做前,先用请求键或业务结果查询核对。不要用 RAISE 或超时伪造该条件。

报文

本范围没有确认 08007 的固定主报文模板;现有定义/源码记录不足以建立固定文本。只有客户端异常而没有匹配的服务器诊断时,不能据此认定 08007

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6src/backend/utils/errcodes.txt at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

27 - 08P01 — 协议违规(protocol_violation)

PostgreSQL SQLSTATE 08P01(协议违规,protocol_violation)的源码证据、诊断与处理参考。

08P01 — 协议违规

速览

SQLSTATE 08P01 是 Class 08 中的 protocol_violation08P01 表示前端/后端消息违反线路协议。选定原始 TCP 案例先完成启动并观察 ReadyForQuery(Z),再在合法帧中发送未知前端字节 Y,收到 C=08P01、S=FATAL、主报文 invalid frontend message type 89,并在客户端关闭 socket 前读到服务器 EOF。

字段
SQLSTATE 08P01
条件名 protocol_violation
状态 有效
已知存在于 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_PROTOCOL_VIOLATION
别名

含义

服务器协议解析器先接受启动交换,随后在派发 SQL 前拒绝未知的前端消息类型。选定路径为 FATAL invalid frontend message type 89,之后服务器发送 EOF;因此它是受影响 socket 的同步边界,不是 SQL 解析错误。

关键边界在于线路状态,而不是 SQL 文本。客户端可以已经到达 ReadyForQuery,却在下一条消息中发送错误类型,选定案例正是如此;启动帧损坏或代理改变帧边界也可能更早失败,并且可能没有可用会话。选定运行覆盖未知消息分派分支;下面的固定源码证据还覆盖不同的 Bind 和 message-buffer 解析分支,其他传输故障必须依据自身的 ErrorResponse 或日志判断。

08P01 并不意味着固定的严重级别或 socket 结果。在固定的 extended-query 路径中,Bind 消息的 parameter-format 数量或参数数量不匹配时报告 ERROR;顶层循环中止当前命令,等待协议规定的 Sync,然后才继续下一个 ReadyForQuery。固定的 message-buffer 读取器在缺少字节、字符串无效或报文尾部有数据时也使用 ERROR。这些可恢复的协议错误不同于未知消息类型:后者是 FATAL 边界,因为服务器不能再信任消息同步状态。

诊断

检查驱动或代理的协议版本、消息类型、帧长度、启动模式和连接所有权。选定证据中的 collector 是收集原始协议 ErrorResponse(C/S/M 及服务器 EOF)的对象,不是 csvlog/jsonlog。服务器关闭产生 FATAL 的 socket,案例不会复用它;独立的运行器连接能执行 SELECT 1 并保持 IDLE。这是线路协议边界,不是 SQL 语法,也不是客户端自行创建的 SQLSTATE。

按阶段解释恢复:

  • 启动完成前没有会话级事务,驱动可能只有连接异常;如果服务器发过响应,应保留原始线路记录。
  • 启动到达 Z 后,未知前端消息会在已建立后端中被拒绝,但选定分支是 FATAL,随后服务器关闭该 socket。即使客户端在协议失步前已经开始工作,也不能在这个 socket 上发送 ROLLBACK
  • 经过连接池或代理时,要比较所有者实际发送的字节与服务器期望的协议版本和帧格式。另一条连接上的 SELECT 1 只证明可达,不证明在途请求已经提交。

先根据主报文识别分支,再选择恢复动作。bind message has ... parameter formatsbind message supplies ... parameters 指向 extended-query 数量契约;no data left in messageinsufficient data left in messageinvalid string in messageinvalid message format 指向报文主体或边界损坏。这些源码定义的 ERROR 变体在驱动仍能保持帧边界时可能通过 Sync 恢复;带 FATALinvalid frontend message type ... 则表示选定 socket 已经失效。

处理

收到 FATAL 或服务器 EOF 时,关闭并丢弃受影响的 socket,修正协议或代理帧后重新连接。extended-query 的 ERROR 应让驱动发送协议有效的 Sync 并等待 ReadyForQuery,然后检查事务状态;Sync 不会回滚失败的显式事务,状态为 E 时仍须执行 ROLLBACK 或回到有意建立的保存点。若非幂等请求在途中,重放前先核对结果。独立探针只证明新连接可用。

将选定案例视为会话终止分支:读到服务器 EOF 后建立新连接,并且只重做已核对且具幂等性的操作。如果违规发生在会话建立前,应先修正启动或代理配置。只有客户端解析器异常或 socket 关闭而没有服务器 C 字段,不能把事件标成 08P01

不要自行拼接字节,也不要把事务当作已经提交。若驱动无法保持报文边界或不实现 Sync 契约,应丢弃连接并核对请求结果。这一源码流程不改变选定未知字节运行:该案例的 FATAL socket 必须丢弃。

报文

固定的协议解析路径以 FATAL 发出主报文 invalid frontend message type %d,其中字节数值是动态的。选定的 Y 字节记录为 89。SQLSTATE 的依据是原始 ErrorResponse,而不是客户端异常。

其他固定源码分支以 ERROR 发出以下主报文模板:

  • bind message has %d parameter formats but %d parameters
  • bind message supplies %d parameters, but prepared statement "%s" requires %d
  • no data left in message
  • insufficient data left in message
  • invalid string in message
  • invalid message format

这些 Bind 和 message-buffer 变体在本页中是源码证据,不是新增运行观察,也不会全部终止 socket。

选定的线路顺序是:启动交换 → Z ReadyForQuery → 合法帧中的类型字节 Y(十进制 89)→ ErrorResponse C=08P01S=FATALM=invalid frontend message type 89 → 服务器 EOF。collector 直接收集这些协议字段和 EOF,既不是 csvlog/jsonlog 记录,也不是后续独立探针。

代表案例

SQL 探针用于检查独立连接。真实触发是运行器拥有的 TCP 握手后发送未知前端消息字节,不能只用 SQL 表达。

SELECT 1;

18.6 服务器记录为 C=08P01、S=FATAL、主报文 invalid frontend message type 89;启动到达 Z,服务器 EOF 断言为 True,独立探针返回 1,状态 IDLE。因此没有复用触发错误的连接。

可下载的案例与证据投影分别是 08P01 案例 JSON作者证据。运行器清单为 verify/cases/08P01/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.protocol-invalid-frontend.18.6src/backend/tcop/postgres.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061 (source).
  • src.protocol-invalid-frontend.10.23src/backend/tcop/postgres.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 badfe30749794afa80a799dcdbd142fd4e4732ac1c913002d365549ae5313497 (source).
  • src.postgres-bind.10.23src/backend/tcop/postgres.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 badfe30749794afa80a799dcdbd142fd4e4732ac1c913002d365549ae5313497 (source).
  • src.pqformat.10.23src/backend/libpq/pqformat.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 637923dbf2b9d9a0610350784f3b1d7d36a545cd8a6bd2cbe6272d9549873a91 (source).
  • src.postgres-sync.10.23src/backend/tcop/postgres.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 badfe30749794afa80a799dcdbd142fd4e4732ac1c913002d365549ae5313497 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

28 - 09000 — triggered_action_exception

PostgreSQL SQLSTATE 09000 的源码与诊断参考。

09000

速览

SQLSTATE 09000 是 ERROR 级别的触发动作条件。在固定的 PostgreSQL 18.6 扫描中,已确认的报告路径位于 contrib/spi 触发器函数:它们检查触发器参数、目标列类型、被引用元组以及 SPI 返回码。因此该代码与这些已安装的触发器函数及其表/触发器配置有关,不能把它当成所有触发器失败的统称。

字段
SQLSTATE 09000
条件名 triggered_action_exception
状态 有效
已知存在于 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_TRIGGERED_ACTION_EXCEPTION
别名

含义

已确认的路径包括 autoinc.cinsert_username.cmoddatetime.crefint.c。消息变体包括 "%s" has no attribute "%s"attribute "%s" of "%s" must be type INT4... TEXT 以及 ... TIMESTAMP or TIMESTAMPTZ。参照完整性路径还会报告 tuple references non-existent key,并带有 Trigger "%s" found tuple referencing non-existent key in "%s". detail;SPI 失败可报告 SPI_execp returned %dRESTRICT 动作还可报告 "%s": tuple is referenced in "%s"。这些模板中的关系、参数、属性、触发器和返回码来自具体失败路径。

消息

固定变体包括 "%s" has no attribute "%s"attribute "%s" of "%s" must be type INT4TEXTTIMESTAMP or TIMESTAMPTZ。参照完整性路径还会报告 tuple references non-existent key,并带有 Trigger "%s" found tuple referencing non-existent key in "%s". detail;SPI 失败可报告 SPI_execp returned %dRESTRICT 动作还可报告 "%s": tuple is referenced in "%s"。这些模板中的关系、参数、属性、触发器和返回码来自具体失败路径。

诊断

先确认已安装的触发器函数和操作阶段,再把关系及触发器参数与该函数的文档契约对照。出现属性/类型消息时检查所点名的列及其类型;出现 refint 变体时检查触发器名、被引用关系以及元组或键的关系。出现 SPI_execp returned %d 时保留返回码,并检查返回该码的 SPI 调用。固定扫描没有证明所有 09000 报告都使用同一条消息。

处理

根据消息修正触发器定义、参数列表、列类型、被引用键或 SPI 侧失败原因,确认修改后再执行触发操作。不要盲目重放写入来修复它:触发器可能已经在报错前完成部分工作,正确恢复边界取决于外层事务。若函数来自扩展或本地代码,应先检查该实现及其版本,再决定应用层的重试行为。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

0A000, 2F000

来源

autoinc.cinsert_username.cmoddatetime.crefint.c 及其参照限制分支展示固定的报告路径;SPI 触发器文档说明扩展接口。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

29 - 0A000 — 不支持的功能(feature_not_supported)

PostgreSQL SQLSTATE 0A000(不支持的功能,feature_not_supported)的源码证据、诊断与处理参考。

0A000 — 不支持的功能

速览

SQLSTATE 0A000 是 Class 0A 中的 feature_not_supported0A000 表示服务器识别了功能或选项,但当前上下文不支持。选定 hash 索引路径请求 id ASC,得到 access method "hash" does not support ASC/DESC options,去掉排序后同一索引成功。这是访问方法能力判断,不是 42501 权限不足或 42601 解析失败。

字段
SQLSTATE 0A000
条件名 feature_not_supported
状态 有效
已知存在于 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_FEATURE_NOT_SUPPORTED
别名

含义

选定的 ComputeIndexAttrs 路径拒绝 hash 访问方法的排序选项,尽管索引请求本身语法有效。关键区别是能力限制与语法错误:id ASC 能到达访问方法检查并产生确切 ERROR,而去掉排序后的同一键可以接受。

这是所选访问方法的属性,不是列类型或表内容的属性。命令解析器已经接受索引定义,随后 ComputeIndexAttrs 检查该访问方法能否满足排序要求;本路径中的 hash 索引不支持这个选项,而 btree 等访问方法可以有不同能力。其他 0A000 producer 可能拒绝不同功能,因此必须结合完整主报文和命令上下文判断。

诊断

记录完整主报文,确认访问方法、选项、命令上下文和版本。错误语句后自动提交会话保持 IDLE;通过 pg_index.indisvalid 确认修复索引有效。其他 0A000 路径可能有不同对象和恢复行为。

先核对对象名称再解释结果。案例中前面的表和索引都未限定 schema,依赖 search_path;最后 regclass 查询中的 feature_schema.hash_index 只是实际索引的 schema-qualified 占位值。确认这些名称指向刚创建的对象,再把访问方法和选项与其能力进行比较。权限错误(42501)或解析错误(42601)应走不同诊断分支。

处理

只移除或替换不支持的选项,或选择支持该选项的访问方法,并核对最终对象语义。不要把所有 0A000 都当成升级要求,也不要静默丢弃用户请求的功能。

选定自动提交案例中的 ERROR 后,可以在同一会话继续执行修正后的 CREATE INDEX。显式事务中应先用 ROLLBACK 或有意建立的保存点恢复本地事务,再执行无关 DDL;恢复后要用满足原始语义要求的访问方法和选项重建索引。不要假定替代索引仍然提供被拒绝定义所要求的排序保证。

实测诊断

固定的索引命令路径以 ERROR 发出主报文 access method "%s" does not support ASC/DESC options,其中访问方法名称是动态值。这是选定的 hash 索引变体;其他不支持的功能可能使用不同 0A000 报文和恢复边界。

选定分支中的动态值为 hash,服务器没有固定 DETAIL 或 HINT。运行在自动提交会话中观察到错误后状态为 IDLE;这不是所有 0A000 producer 的通用属性,也不能推广到同一命令位于显式事务中的情形。

代表案例

此 SQL 块创建表,尝试不支持排序选项的 hash 索引,创建修复后的索引,并检查 pg_index.indisvalid

最后 regclass 查询中的 feature_schema.hash_index 是占位写法,应替换为前面实际创建的、带 schema 的关系。前面三条语句使用未限定的 feature_tablehash_index,依赖当前 search_path;手工执行时应有意设置该路径,或把表和索引创建在验证查询所写的 schema 中并使用一致的限定名。

CREATE TABLE feature_table (id integer NOT NULL, payload text);
CREATE INDEX hash_index ON feature_table USING hash (id ASC);
CREATE INDEX hash_index ON feature_table USING hash (id);
SELECT indisvalid FROM pg_index WHERE indexrelid = 'feature_schema.hash_index'::regclass;

18.6 运行记录 SQLSTATE 为 0A000,主报文 access method "hash" does not support ASC/DESC options;断言的错误后状态为 IDLE,随后探针/修复成功。18.6 与 10.21 的断言和清理均通过。

可下载的案例与证据投影分别是 0A000 案例 JSON作者证据。运行器清单为 verify/cases/0A000/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.indexcmds-asc-desc.18.6src/backend/commands/indexcmds.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 0bdae365f207ab82865806c5983cac94c5c062e7a61ab7c883ccb7e2015fad36 (source).
  • src.indexcmds-asc-desc.10.23src/backend/commands/indexcmds.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 97766ba385fea1ba642e5b077fd5ce7cbb9f9faff177bcece0de2fc3e2904b23 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

30 - 0B000 — invalid_transaction_initiation

PostgreSQL SQLSTATE 0B000 的源码边界与诊断参考。

0B000

速览

SQLSTATE 0B000 是 SQL 标准的 Invalid Transaction Initiation 类别。锁定的 PostgreSQL 18.6 定义包含该条件,但已解析的 core/contrib 调用扫描没有找到报告此代码的 PostgreSQL 调用组。应把它当作身份和调查入口,而不是某个 BEGIN、保存点或客户端命令必然产生它的证明。

字段
SQLSTATE 0B000
条件名 invalid_transaction_initiation
状态 有效
已知存在于 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_INVALID_TRANSACTION_INITIATION
别名

含义

该类别描述使用此 SQLSTATE 的实现以无效方式启动或建立事务。它与服务器实际返回的事务状态代码是两回事。PostgreSQL 的目录条目本身不能证明当前后端路径、扩展、ECPG 层或驱动会为某个命令使用 0B000。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

在解释名称前记录准确的 SQLSTATE、消息类型、严重性、命令阶段和客户端库。确认失败发生在启动、显式事务命令、保存点操作,还是转发远端结果的包装层。如果实际代码是 25001 或其他事务状态代码,就按该代码及其服务器消息诊断,不要从类别名称替换成 0B000。

处理

按实际事务状态诊断处理:结束或修正无效的事务命令,并且只有在服务器和应用状态确实要求时才开启新事务。若路径由包装器或驱动负责,应先检查其固定实现及远端 SQLSTATE,再改变事务处理方式。有界源码结果不足以为 0B000 提供通用重试或 PostgreSQL 原生修复步骤。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

25001, 25P02

来源

固定的errcodes 定义确认目录条目;事务管理文档说明 PostgreSQL 的事务边界。锁定的 core/contrib 调用扫描未找到已解析的 0B000 报告调用组。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

31 - 0F000 — locator_exception

PostgreSQL SQLSTATE 0F000 的源码边界与诊断参考。

0F000

速览

SQLSTATE 0F000 是 Locator Exception 类别码,不是一条具体的 locator 失败消息。PostgreSQL 18.6 定义中存在该代码,但锁定的 core/contrib 扫描没有解析出 0F000 报告调用组。客户端、嵌入式 SQL 层、扩展或远端实现仍可能暴露这一标准类别,因此必须先确认实际产生者,再采用 locator 相关处置。

字段
SQLSTATE 0F000
条件名 locator_exception
状态 有效
已知存在于 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_LOCATOR_EXCEPTION
别名

含义

末三位为 000,所以 0F000 是类别级条件。它可以归拢 0F001 等 locator 成员,但自身不能指出具体句柄、描述符或 locator 操作。PostgreSQL 的定义行可用于分类,而固定扫描没有解析出原生报告边界。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

保留实际返回的成员 SQLSTATE,并记录客户端或服务器组件、操作以及 locator/描述符身份。在该组件的固定源码或协议映射中查找报告路径。不要从类别名称推断 locator 句柄,也不要把查询返回零行当成 locator exception。

处理

只有在实际产生者的文档支持时,才根据该组件指出的具体 locator 或描述符问题修正其生命周期、声明或引用对象。若结果来自远端转发,应保留远端错误并遵循其所有者的恢复规则。单凭该类别无法建立 PostgreSQL 原生重试规则。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

0F001, 0A000

来源

固定的errcodes 定义确认类别;SQLSTATE 附录说明条件类别。锁定的 core/contrib 扫描没有解析出原生 0F000 报告调用组。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

32 - 0F001 — invalid_locator_specification

PostgreSQL SQLSTATE 0F001 的源码边界与诊断参考。

0F001

速览

SQLSTATE 0F001 是 0F 类别中的 Invalid Locator Specification 成员。锁定的 PostgreSQL 定义记录了 SQL 标准身份,但已解析的 PostgreSQL 18.6 core/contrib 扫描没有找到报告调用。不能把条件名扩展成 PostgreSQL 大对象、游标、FDW 句柄或某个驱动 API 的断言。

字段
SQLSTATE 0F001
条件名 invalid_locator_specification
状态 有效
已知存在于 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_L_E_INVALID_SPECIFICATION
别名

含义

当实际产生者采用该 SQLSTATE 时,这个成员表示 locator 规格无效。固定目录没有指出当前 PostgreSQL 后端中的 locator 表示形式或哪一种操作会无效。成员码比 0F000 更具体,但仍需要结合产生者和消息解释。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

记录完整诊断和阶段:解析/准备、执行、描述符查找,还是客户端调用。确认负责 locator 的实现,并查看其固定文档或源码中允许的 locator 语法和生命周期。如果 PostgreSQL 返回其他代码,就保留那个代码;不能把 0F001 当作兜底分类。

处理

按实际产生者的规则修正 locator 规格或其所属句柄;只有确认没有完成外部可见工作且操作可安全重复时,才重做失败语句。若错误来自转发或客户端边界,应修复该边界,不要仅凭条件名改变 PostgreSQL 事务策略。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

0F000, 0A000

来源

固定的errcodes 定义确认成员和宏;SQLSTATE 附录提供公开类别表。锁定的 core/contrib 扫描未找到已解析的 0F001 报告路径。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

33 - 0L000 — 授权者无效(invalid_grantor)

PostgreSQL SQLSTATE 0L000(授权者无效,invalid_grantor)的源码证据、诊断与处理参考。

0L000 — 授权者无效

速览

SQLSTATE 0L000 是 Class 0L 中的 invalid_grantor。固定的 aclparse 路径把它用于旧 ACL item 文本省略 /grantor 后缀时的向后兼容警告,并将授权者回退为 BOOTSTRAP_SUPERUSERID。这是 ACL 文本解析路径,不是 bootstrap 或 ACL 初始化阶段,也不是普通“权限不足”或无效 GRANT 操作路径。

字段
SQLSTATE 0L000
条件名 invalid_grantor
状态 有效
已知存在于 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_INVALID_GRANTOR
别名

含义

0L000invalid_grantor。在 aclparse 中,ACL item 没有 /grantor 后缀时会走向后兼容回退:解析器把授权者设为 BOOTSTRAP_SUPERUSERID,并发出带 SQLSTATE 0L000WARNING。它可以发生在普通 ACL 文本解析过程中,并不表示 bootstrap 初始化。若有斜线却没有后续名称,同一解析器会改为以 22P02a name must follow the "/" sign 报错。

诊断

出现此警告时,检查正在解析的 ACL 文本以及是否含有授权者后缀。缺少斜线与斜线后为空是不同输入:前者走 0L000 兼容警告,后者走 22P02。普通 GRANT 应根据具体对象或权限报错诊断,例如 0LP01 或 42501。

处理

如果文本由本方控制,应补写有效授权者并复核最终 ACL。不要把该警告当成 bootstrap 初始化失败的证据。本页只记录源码路径,没有选择自然 SQL 的 0L000 触发案例。

报文

固定的省略授权者分支以 WARNING0L000 发出主报文 defaulting grantor to user ID %u,用户 ID 是动态值。相邻的斜线后无名称分支以 ERROR22P02 发出主报文 a name must follow the "/" sign。只有客户端异常而没有服务器诊断时,不能据此认定 0L000

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定 REL_18_6/REL_10_23 的 aclparse 源码比较不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.aclparse-grantor-fallback.18.6src/backend/utils/adt/acl.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 623f2dd01c1d393d3b224c7622dc2ec946faced444c1f5fd5e396e037903a5b0 (source). 这是 aclparse 省略授权者的兼容分支。
  • src.aclparse-grantor-fallback.10.23src/backend/utils/adt/acl.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 3cfe29c06d211130552d2aab88f61dcdd9a5287c9ab8c450d48562056b32829e (source). 这是 aclparse 省略授权者的兼容分支。
  • src.aclparse-slash-missing-name.10.23 — 同一固定 acl.c 文件的 338–344 行记录 / 后没有名称时的独立 22P02 分支(source)。
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

34 - 0LP01 — 无效的授权操作(invalid_grant_operation)

PostgreSQL SQLSTATE 0LP01(无效的授权操作,invalid_grant_operation)的源码证据、诊断与处理参考。

0LP01 — 无效的授权操作

速览

SQLSTATE 0LP01 是 Class 0L 中的 invalid_grant_operation0LP01 表示 GRANT 或 REVOKE 对对象或权限类型无效。选定的序列案例请求 INSERT,服务器通过动态报文组合出 invalid privilege type INSERT for sequence;随后授予 USAGE 成功。

字段
SQLSTATE 0LP01
条件名 invalid_grant_operation
状态 有效
已知存在于 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_INVALID_GRANT_OPERATION
别名

含义

0LP01 表示 GRANT 或 REVOKE 对对象或权限类型无效。选定的序列案例请求 INSERT,服务器通过动态报文组合出 invalid privilege type INSERT for sequence;随后授予 USAGE 成功。

诊断

检查对象类型、权限矩阵、目标角色、所有权,以及语句是否属于列权限或默认权限形式。选定错误是 ERROR,但自动提交会话保持 IDLE;修复后的权限查询返回 true。

处理

按对象支持的权限重写语句并核对 ACL。序列应按意图选择 USAGESELECTUPDATE;不要扩大授权,也不要原样重试。

实测诊断

结构化证据保留原始报文模板或动态组装边界。对于本页,只有客户端异常而没有服务器诊断时,不能据此认定 0LP01

代表案例

此 SQL 块创建序列,尝试无效的 INSERT 权限,授予 USAGE,并检查临时角色的有效权限。

CREATE SEQUENCE grant_sequence;
GRANT INSERT ON SEQUENCE grant_sequence TO role;
GRANT USAGE ON SEQUENCE grant_sequence TO role;
SELECT has_sequence_privilege(role_literal, 'grant_sequence', 'USAGE');

18.6 运行记录 SQLSTATE 为 0LP01,主报文 invalid privilege type INSERT for sequence;断言的错误后状态为 IDLE,随后探针/修复成功。18.6 与 10.21 的断言和清理均通过。

可下载的案例与证据投影分别是 0LP01 案例 JSON作者证据。运行器清单为 verify/cases/0LP01/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.acl-invalid-grant-dynamic.18.6src/backend/catalog/aclchk.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 9700258318959b47c42edb423418fb511dd3a008023e732f601eecf4c80868f8 (source).
  • src.acl-invalid-grant-dynamic.10.23src/backend/catalog/aclchk.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 3a4330bd55ea8c0ec12324d7046ec31d64c920f99196235b84612d6cd1a4b26c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

35 - 0P000 — 角色规范无效(invalid_role_specification)

PostgreSQL SQLSTATE 0P000(角色规范无效,invalid_role_specification)的源码证据、诊断与处理参考。

0P000 — 角色规范无效

速览

SQLSTATE 0P000 是 Class 0P 中的 invalid_role_specification。在 ENABLE_SSPI 下,固定的 Windows SSPI 路径在把 SAM 账户名转换为 UPN 时以服务器 LOG 分支使用它;它不是普通的“角色不存在”登录结果,也不是客户端 ErrorResponse。

字段
SQLSTATE 0P000
条件名 invalid_role_specification
状态 有效
已知存在于 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_INVALID_ROLE_SPECIFICATION
别名

含义

0P000invalid_role_specification。固定的 pg_SSPI_make_upn 路径构造 DOMAIN\user,调用 Windows TranslateName 得到 user@realm;转换失败、结果没有 @,或 realm/账户无法放入目标缓冲区时记录 0P000。这些是 ENABLE_SSPI 下的服务器 LOG 分支,不是客户端 ErrorResponse,也不是普通角色缺失结果。

诊断

确认失败路径确实是 Windows SSPI,并结合服务器日志检查 SAM 账户/域名及配置的 realm 或 UPN 映射。TranslateName 失败(包括结果不含 @)记录 could not translate name;realm 过长记录 realm name too long;转换后的账户过长记录 translated account name too long。使用 trust 认证的临时实例无法忠实演示这一外部身份边界;启动 ErrorResponse 也可能是 28000 或 28P01。

处理

修复 SSPI 账户/realm 映射或 Windows 名称转换配置后建立新连接。应把这些服务器日志诊断与启动认证响应、SQL 角色不存在和密码失败分开。

报文

固定 SSPI 源码以 LOG 和 SQLSTATE 0P000 记录以下主报文模板:could not translate namerealm name too longtranslated account name too long。这些是服务器日志记录;只有客户端异常或没有匹配服务器日志的启动 ErrorResponse,都不能证明 0P000

代表案例

本页没有选定的自然 SQL 运行。结构化证据记录的是源码或定义边界;客户端 RAISE 不能代表服务器机制。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页没有选定的自然 SQL 运行;固定 REL_18_6/REL_10_23 的 SSPI 源码比较不能当作实测结果,也不能据此推断所有中间版本的行为。

来源

  • src.auth-name-translation.18.6src/backend/libpq/auth.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 94252cb1e2c49b0ddb15f6596d0abf8056c84493de07cc81439da4c5b07018f1 (source).
  • src.auth-name-translation.10.23src/backend/libpq/auth.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 15418faa6d6ee1b2a4ad1e50ebc9b34c2daf4799f7062df425e33dbf777ade61 (source).
  • src.auth-sspi-upn.10.23src/backend/libpq/auth.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 15418faa6d6ee1b2a4ad1e50ebc9b34c2daf4799f7062df425e33dbf777ade61 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

36 - 0Z000 — diagnostics_exception

PostgreSQL SQLSTATE 0Z000 的源码边界与诊断参考。

0Z000

速览

SQLSTATE 0Z000 是 Diagnostics Exception 类别。在 PostgreSQL 固定源码中,具体的 PL/pgSQL 路径属于成员 0Z002;类别行本身不是独立的报告调用组。观察到 diagnostics 成员时可以用 0Z000 分类,但诊断必须保留成员码和对应消息。

字段
SQLSTATE 0Z000
条件名 diagnostics_exception
状态 有效
已知存在于 9.2.0
锁定快照 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_DIAGNOSTICS_EXCEPTION
别名

含义

该类别覆盖访问诊断状态时产生的错误。pl_exec.c 中已确认的成员路径在 GET STACKED DIAGNOSTICS 或无参数 RAISE 位于活动异常处理器之外时报告 0Z002。这个成员证据只解释一条 PostgreSQL 路径,不能把所有 diagnostics API 失败都说成 0Z000 报告。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

先读取成员码和消息。对于 0Z002,检查语句是否处在拥有堆叠错误的 EXCEPTION 处理器内;普通函数控制流和处理器范围比类别名称更关键。如果是其他成员或产生者,就沿该组件的源码追踪,并保留其诊断字段。

处理

把依赖堆叠状态的 GET STACKED DIAGNOSTICS 和无参数 RAISE 放进对应的活动 PL/pgSQL 异常处理器。如果要在处理器外抛出新错误,应提供明确的条件/消息,而不是尝试复用堆叠状态。保留成员错误,不要因为它属于 0Z 类就自动重试失败例程。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 9.2.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

0Z002, P0001

来源

固定的errcodes 定义确认类别。具体成员路径是 GET STACKED DIAGNOSTICS无参数 RAISEPL/pgSQL 错误捕获文档定义处理器边界。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

37 - 0Z002 — stacked_diagnostics_accessed_without_active_handler

PostgreSQL SQLSTATE 0Z002 的源码与诊断参考。

0Z002

速览

SQLSTATE 0Z002 在 PL/pgSQL 代码试图使用堆叠异常状态、但不存在拥有该状态的活动异常处理器时报告。PostgreSQL 18.6 已确认两条路径:GET STACKED DIAGNOSTICS cannot be used outside an exception handlerRAISE without parameters cannot be used outside an exception handler,两者均为 ERROR。

字段
SQLSTATE 0Z002
条件名 stacked_diagnostics_accessed_without_active_handler
状态 有效
已知存在于 9.2.0
锁定快照 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_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER
别名

含义

第一条路径保护 GET STACKED DIAGNOSTICS;第二条路径保护本应重新抛出当前异常的无参数 RAISE。共同边界是 PL/pgSQL 的 EXCEPTION 处理器,而不是 SQL 的 BEGIN/COMMIT 事务块。该成员码比 0Z000 类别更具体。

消息

固定消息是 GET STACKED DIAGNOSTICS cannot be used outside an exception handlerRAISE without parameters cannot be used outside an exception handler

诊断

定位失败的 PL/pgSQL 语句及最近的 EXCEPTION 块。GET STACKED DIAGNOSTICS 读取正在处理的异常,无参数 RAISE 重新抛出该异常;处理器外不存在可用的堆叠状态。保留准确消息和 routine context,因为事务状态错误或新的显式 RAISE 属于不同原因。

处理

把诊断读取或重新抛出移到活动异常处理器中;如果当前没有正在处理的异常,就使用带明确条件/消息的 RAISE。处理器应保持足够窄,并在离开前保留 RETURNED_SQLSTATE、消息、detail 和 hint。该路径支持的是代码修正,而不是事务重试。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 9.2.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

0Z000, P0001

来源

固定的 PL/pgSQL 执行器源码报告 GET STACKED DIAGNOSTICS 变体,RAISE 路径报告无参数变体。PL/pgSQL 诊断文档说明堆叠字段。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

38 - 10608 — invalid_argument_for_xquery

PostgreSQL SQLSTATE 10608 的源码与诊断参考。

10608

速览

SQLSTATE 10608 是 XQuery 类别中表示参数无效的 ERROR 条件。PostgreSQL 18.6 已确认后端 XML 路径会因 XPath 表达式为空、行路径过滤器为空或列路径过滤器为空而报告它。contrib/xml2 源码也引用该宏,但引用本身不能证明存在另一条报告消息。

字段
SQLSTATE 10608
条件名 invalid_argument_for_xquery
状态 有效
已知存在于 18.0
锁定快照 18.6, 19beta3
ERRCODE_INVALID_ARGUMENT_FOR_XQUERY
别名

含义

固定后端调用在 src/backend/utils/adt/xml.c 中分别报告 empty XPath expressionrow path filter must not be empty stringcolumn path filter must not be empty string。这些是 XML/XPath 处理中的参数校验失败。核心报告并不意味着所有 XPath/XSLT 或扩展参数错误都使用 10608。

消息

固定消息是 empty XPath expressionrow path filter must not be empty stringcolumn path filter must not be empty string

诊断

确认哪个 XML 操作提供了参数,并判断为空的是 XPath 表达式、行路径过滤器还是列路径过滤器。保留准确消息和输入形状;对于 xml2 或其他扩展,应单独检查扩展调用路径,因为宏引用不是报告调用组。比较行为时记录服务器版本:锁定目录将 10608 的已知下界置于 PostgreSQL 18.0。

处理

按照 XML 函数要求提供非空表达式或过滤器,先验证修正后的输入,再重复语句。若操作由扩展负责,应遵循扩展的参数规则。这是输入修复;不改变空参数而重试无法解决已确认的路径。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 18.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

22023, 0A000

来源

固定后端 xml.c报告空 XPath 变体,行/列过滤器检查报告其他变体。contrib/xml2/xpath.cxslt_proc.c包含宏引用。参见 XML 函数文档。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

39 - 20000 — case_not_found

PostgreSQL SQLSTATE 20000 的源码与诊断参考。

20000

速览

SQLSTATE 20000 在 PL/pgSQL 的 CASE 语句没有匹配任何 WHEN 且没有 ELSE 时报告。PostgreSQL 18.6 的消息是 case not found,hint 为 CASE statement is missing ELSE part.。该条件属于过程式 CASE 语句路径,不是普通查询返回零行的结果。

字段
SQLSTATE 20000
条件名 case_not_found
状态 有效
已知存在于 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_CASE_NOT_FOUND
别名

含义

执行器路径位于 src/pl/plpgsql/src/pl_exec.cexec_stmt_case。它执行搜索式或简单过程式 CASE 语句,在到达缺失 ELSE 的分支时报告 20000。SQL CASE 表达式语义不同,因此应先确认语句形式和例程源码,再修改查询。

消息

固定消息是 case not found;hint 为 CASE statement is missing ELSE part.

诊断

找到 routine context 指出的 PL/pgSQL 例程和 CASE 语句。列出选择值或谓词的可能结果,确认每个预期路径都有 WHEN,再检查是否遗漏 ELSE。不要用行数检查或 SELECT INTO STRICT 的诊断替代这个条件。

处理

增加实现预期回退行为的 ELSE 分支,或使 WHEN 谓词覆盖所有可能值,并用代表性选择值验证例程。如果缺失分支代表无效业务输入,应由该分支有意报告应用条件。修改例程后,只有确认周围事务的副作用已回滚或业务操作具备幂等性时,才重新执行事务。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 8.4.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

02000, P0001

来源

固定的 PL/pgSQL 执行器包含消息和 hint。PL/pgSQL CASE 语句文档说明缺少 ELSE 时的行为。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

40 - 21000 — 基数冲突(cardinality_violation)

PostgreSQL SQLSTATE 21000:基数冲突的来源与诊断参考。

21000 — 基数冲突

速览

21000 表示操作得到的行数不符合基数契约。最常见的是标量子查询返回多行;它与 23505 不同,不要求存在唯一索引冲突。

字段
SQLSTATE 21000
条件名 cardinality_violation
状态 有效
已知存在于 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_CARDINALITY_VIOLATION
别名

含义

把标量子查询当作表达式时,最多只能返回一行;执行器看到第二行就报告 21000,零行则产生 NULL。同一错误也用于命令级基数冲突:ON CONFLICT DO UPDATE 的多个候选行可能再次命中同一目标行,MERGE 的多个源行也可能匹配同一目标行;这些路径有各自的报文和提示。

诊断

先保存 sqlstatemessage_primaryhint 和语句上下文。根据业务键增加确定性谓词,或在确实要把多行合成一个值时使用聚合;不要随意加 LIMIT 1,否则可能静默选择任意行。对 ON CONFLICT,按仲裁索引或唯一键去重候选源行;对 MERGE,保证源到目标的匹配对每个目标至多一行。应检查实际源行和键映射,不能把它泛化成普通重复键错误。

处理

显式事务中先回滚失败事务,再执行修正后的完整操作。ON CONFLICTMERGE 的多行来源必须先确定基数;原样重放同一批数据仍会重复触发确定性的冲突。自动提交下本案例错误后连接仍为 IDLE,这不能替代外层事务或 PL/pgSQL 处理器的边界。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 21000;primary more than one row returned by a subquery used as an expression;status_after_error IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 21000;primary more than one row returned by a subquery used as an expression;status_after_error IDLE

代表案例

运行器从 verify/cases/21000/snippets.json(SHA-256 6d820e94518ffca97f407956fdc2df104d47b14263d3117ff59dbc4409774dc2)读取下列片段,并为临时 schema 替换表名;完整 setup、断言与清理见 案例导出

-- create
CREATE TABLE source_rows(id integer PRIMARY KEY);
-- seed
INSERT INTO source_rows VALUES (1), (2);
-- trigger
SELECT (SELECT id FROM source_rows ORDER BY id) AS only_id;
-- valid
SELECT (SELECT id FROM source_rows WHERE id = 1) AS only_id;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自上述共享 registry;结构化证据 · 案例导出

作者证据 ID:identity, scalar-subquery, dml-conflict, runtime。选定运行记录:runtime.21000-batch1-latest-20260909.latest, runtime.21000-batch1-pg10-20260909.pg10

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的 9.0–18.6 正式快照中均存在。固定源码证据确认 18.6 的标量子查询、ON CONFLICTMERGE 路径;选定运行只覆盖 18.6 与 10.21 的标量子查询。

对比 23505 唯一约束冲突23503 外键冲突23000 完整性约束总类

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.nodeSubplan.18.6 (SHA-256 c356a9812691f875974c1f476efa987015ba19e70a4be833a43b692f3554dc47)
  • src.nodeModifyTable.18.6 (SHA-256 0fc3cb180b3443f216142954e43d8ed5f84713d75094ce8cd2785ad8f604bd68)
  • doc.syntax.18.6 (SHA-256 449b0c500fccca068d0f8a1db2a5ebb5430eb83e33f12c6cb310a01a7437b635) · 官方文档

41 - 22000 — data_exception

PostgreSQL SQLSTATE 22000 的源码与诊断参考。

22000

速览

固定 array_append 路径要求数组参数为空或一维,否则报告维度错误;其他 Data Exception 路径有各自的消息。

字段
SQLSTATE 22000
条件名 data_exception
状态 有效
已知存在于 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_DATA_EXCEPTION
别名

含义

固定 array_append 路径要求数组参数为空或一维,否则报告维度错误;其他 Data Exception 路径有各自的消息。

报文

已确认的 guard 以 ERROR 严重性报告 primary:argument must be empty or one-dimensional array。该源码路径没有独立的 DETAIL 或 HINT。本页只有源码证据,没有自然运行观察。

诊断

先看完整消息、array_append 调用和参数类型。已确认的路径拒绝既非空又非一维的数组参数;其他 Data Exception 路径需按各自消息定位。

处置

修正数组形状或改用接受目标维度的函数契约,先校验参数再执行。这是 ERROR:显式事务中要回滚整个事务,或回滚到调用前建立的保存点后再继续。不要把所有 Data Exception 当成同一种修复;本页没有运行案例。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

42 - 22001 — string_data_right_truncation

PostgreSQL SQLSTATE 22001 的源码与诊断参考。

22001

速览

固定 varchar 路径报告 value too long for type character(%d);hstore、varbit 等路径会使用各自的具体变体。

字段
SQLSTATE 22001
条件名 string_data_right_truncation
状态 有效
已知存在于 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_STRING_DATA_RIGHT_TRUNCATION
别名

共享案例创建 varchar_limits(value varchar(3)),用 'too-long' 触发 22001,再插入修复值 'ok' 并查询存储值。应在自动提交下逐条发送这些语句:触发语句预期失败,之后再执行修复语句。案例运行器在结束阶段负责清理对象。

CREATE TABLE varchar_limits (value varchar(3));
INSERT INTO varchar_limits VALUES ('too-long');
INSERT INTO varchar_limits VALUES ('ok');
SELECT value FROM varchar_limits;

校准实测 character varying(3) 拒绝超长值并报告 value too long for type character varying(3);修正值 ok 成功,运行器的两条自动提交会话均回到 IDLE

报文

固定 character 和 varchar guard 以 ERROR 严重性报告 primary 模板 value too long for type character(%d)value too long for type character varying(%d)。hstore 与 varbit 路径使用各自的 primary:string too long for hstore keystring too long for hstore valuebit string too long for type bit varying(%d)。这些源码组没有独立 DETAIL 或 HINT;本次运行只观察了上面的 varchar 模板。

含义

当值无法满足字符串类型的长度契约时会出现 22001。PostgreSQL 按字符数而不是字节数计算 character(n)character varying(n),因此 value too long for type character(%d) 中的 %d 指向响应里的 typmod。固定 varchar.c 是服务器端检查;hstore 键值和 bit string 有各自的路径和消息。

值进入类型的方式也会改变边界。varchar()bpchar() 都接收 isExplicit 标志:赋值/输入转换遇到超出的非空格字符会报错,而显式 cast 到有界类型可以按 PostgreSQL 字符类型规则截断;超出的尾随空格和非空格字符处理不同。修改存储或校验前应先明确这个选择。

诊断

保存 schema_nametable_namecolumn_namedatatype_nameroutine 和完整 message。先从目录确认目标类型和 typmod,再按字符数而不是字节数测量实际值。区分赋值/插入、显式 cast,以及 hstore/bit 路径,因为它们的截断行为并不完全相同。

常见 varchar 路径要检查超出宽度的后缀是否全是尾随空格。只有尾随空格超出时可能适用字符类型的截断规则;有意义的非空格数据应视为契约被拒绝。固定源码消息说明的是类型宽度问题,不是一般编码或网络错误。

处置

选择能保留数据契约的修复:校验并拒绝超长输入,有意扩大列/类型,或只在业务明确允许时显式 cast 截断。截断前保存原值和目标 typmod;静默裁剪标识符、键或审计文本可能写入与调用方意图不同的内容。本次固定案例使用自动提交,失败语句结束后会话仍为 IDLE;显式事务中应先回滚整个事务,或回滚到语句前建立的保存点,再重试修正值。修正输入或 schema 后重新转换,并核对保存后的字符长度。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22003 是数值/范围越界,22007 是日期时间格式错误,22004 是独立的 NULL 契约。

来源

固定 character(n) 检查见 varchar.c#L300-L313character varying(n) 检查见 varchar.c#L633-L640。PostgreSQL 18 的字符类型文档说明了字符数限制、尾随空格和显式 cast。结构化证据记录固定了源码 SHA,并区分 hstore/varbit 变体。

43 - 22002 — null_value_no_indicator_parameter

PostgreSQL SQLSTATE 22002 的源码与诊断参考。

22002

速览

22002 是面向 ECPG 指示变量的 null_value_no_indicator_parameter。本次固定源码扫描没有解析出原生报告组。

字段
SQLSTATE 22002
条件名 null_value_no_indicator_parameter
状态 有效
已知存在于 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_NULL_VALUE_NO_INDICATOR_PARAMETER
别名

含义

22002 是面向 ECPG 指示变量的 null_value_no_indicator_parameter。本次固定源码扫描没有解析出原生报告组。

报文

有界调用扫描没有确认固定 PostgreSQL primary、DETAIL、HINT 或严重性。runtime_verificationnot_run;若客户端或 ECPG 实现报告该码,应从其自身诊断上下文取得确切报文。

诊断

定位实际选择 22002 的 ECPG、预处理器或客户端路径,检查指示变量契约;不能从服务器列的 NULL 直接推断。

处置

在实际 ECPG 接口中补充指示变量处理或修正客户端绑定,并与普通列 NOT NULL 和 PL/pgSQL NULL 条件分开。本页只有源码边界,不推断服务器事务恢复规则。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000, 22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

44 - 22003 — numeric_value_out_of_range

PostgreSQL SQLSTATE 22003 的源码与诊断参考。

22003

速览

22003 是 numeric_value_out_of_range。固定源码中的数值转换会报告 integer out of range,其他范围检查路径保留各自的操作上下文。

字段
SQLSTATE 22003
条件名 numeric_value_out_of_range
状态 有效
已知存在于 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_NUMERIC_VALUE_OUT_OF_RANGE
别名

共享案例把 2147483648 cast 为 integer 以捕获范围错误,再把可表示的 2147483647 作为修复值。应分开发送两条 SELECT;第一条预期失败,之后再执行修复表达式。会话和清理由运行器负责,无需建立 schema。

SELECT '2147483648'::integer;
SELECT '2147483647'::integer;

校准实测整数输入 2147483648 被拒绝并报告 value "2147483648" is out of range for type integer2147483647 成功。PostgreSQL 18.6 使用 pg_strtoint32_safe,REL_10_23 源码路径使用 pg_atoi;运行器的两条自动提交会话均回到 IDLE

报文

固定整数输入 guard 以 ERROR 严重性报告 primary:value "%s" is out of range for type %s。其他已确认源码路径使用 value overflows numeric format(numeric 阶乘)和 integer out of rangewidth_bucket 结果转换)。引用的源码组没有独立 DETAIL 或 HINT;本次运行只观察了整数输入模板。

含义

22003 表示所选操作无法表示某个数值或范围。固定目录成员既用于整数转换,也用于精确 numeric 溢出和子系统检查;代表性消息包括 integer out of rangevalue overflows numeric format。其他源码路径也可能使用该 SQLSTATE 但消息不同,因此不能只凭 SQLSTATE 判断具体类型。

诊断

先看 primary message 和 source object。本次观察只证明 int4 输入转换的边界,不能代表所有 numeric 表达式。整数转换要确认源/目标整数宽度,以及错误发生在输入、赋值、cast、算术还是扩展函数。numeric 要区分声明的 precision/scale、算术溢出和舍入语义,并保留操作数。值可以语法正确,却仍然超出目标范围。

处置

在转换前校验范围,并选择符合业务契约的表示:拒绝值、显式缩放,或使用支持的更宽类型。算术要检查中间结果而不只看最终列。若消息指向特定子系统,应修复该子系统。本次固定案例使用自动提交,失败 cast 后会话仍为 IDLE;显式事务中应先回滚整个事务,或回滚到失败表达式前已有的保存点,再重试修正表达式。不要对确定性的范围错误做无条件重试,也不要静默截断金额、标识符或计数器。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22001 是字符串长度错误,22007 是日期时间格式错误,22008 是日期时间字段/范围越界。

来源

代表性固定路径包括整数输入的 numutils.c#L603-L612、numeric 溢出的 numeric.c#L3765-L3769width_bucket 结果转换的 numeric.c#L2042-L2046。结构化证据记录记录了固定消息族与源码哈希。

45 - 22004 — null_value_not_allowed

PostgreSQL SQLSTATE 22004 的源码与诊断参考。

22004

速览

22004 是 null_value_not_allowed。固定 table-function 路径报告 namespace URI must not be null;其他扩展和核心函数可能有不同的 NULL 契约。

字段
SQLSTATE 22004
条件名 null_value_not_allowed
状态 有效
已知存在于 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_NULL_VALUE_NOT_ALLOWED
别名

共享案例向 XMLTABLE 提供 NULL namespace URI,然后使用 URI u 和匹配的 XML 行重做表函数调用。应分开发送两条 SELECT;第一条预期失败,之后再执行修复调用。会话和清理由运行器负责。

SELECT * FROM XMLTABLE(XMLNAMESPACES (NULL AS p), '/p:row' PASSING '<p:row xmlns:p="u"/>' COLUMNS x text PATH 'p:x');
SELECT count(*) FROM XMLTABLE(XMLNAMESPACES ('u' AS p), '/p:row' PASSING '<p:row xmlns:p="u"><p:x>ok</p:x></p:row>' COLUMNS x text PATH 'p:x');

校准实测了表函数 namespace URI 路径:NULL namespace 报告 namespace URI must not be null;有效 URI 返回一行 XMLTABLE 结果,运行器的两条自动提交会话均回到 IDLE

报文

namespace guard 以 ERROR 严重性报告 primary:namespace URI must not be null,没有独立 DETAIL 或 HINT。table-function executor 模块还分别检查 NULL row-filter 表达式和 NULL column-filter 表达式(DETAIL 会包含列名)。输出列 guard 的范围更窄:XMLTABLE 输出列标记为 NOT NULL 后,先取得值并应用 DEFAULT;只有仍为 NULL 时才报告 null is not allowed in column "%s"。这个条件不同于普通 NULL 结果或单独的 23502 约束错误;本次运行只观察了 namespace 报文。

含义

22004 是 NULL 契约失败。固定 nodeTableFuncscan.c 路径拒绝 table function 使用的 namespace URI,消息为 namespace URI must not be null。同名条件也可能由其他函数选择,因此 NULL 函数参数、STRICT 函数返回的 NULL 和声明了 NOT NULL 的表列属于不同调查。普通 SQL NULL 结果本身不是 22004 的证据,应以实际 SQLSTATE 和诊断字段为准。

诊断

用完整 message、routine、context 和对象字段确认哪个参数或 descriptor 为 NULL。已确认的 table-function 路径要检查 namespace URI 表达式,以及提供它的 XML/行描述。普通 NULL 输入或 STRICT 函数返回 NULL 本身并不表示该条件。如果响应指向列约束,应使用实际 SQLSTATE 和 constraint 字段;不要把列 NOT NULL 错误重新标成 22004。

处置

修正消息所指的函数参数或 descriptor,或修改 table-function 定义以满足 namespace URI 契约。API 允许时应保留有意的 SQL NULL;把所有 NULL 换成空字符串可能改变 XML 或查询语义。本次固定案例使用自动提交,失败语句结束后会话仍为 IDLE;显式事务中应先回滚整个事务,或回滚到失败语句前已有的保存点,再继续执行。确认调用已修正后再重复写入。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000 是其他 Data Exception 路径,22002 是 ECPG 指示变量条件;若实际响应是 NOT NULL 约束错误,应按 23502 调查。

来源

已确认的 table-function 检查见 nodeTableFuncscan.c#L368-L370;相邻的 filter/output guard 见 nodeTableFuncscan.c#L380-L419nodeTableFuncscan.c#L494-L508。结构化证据记录固定了这些路径,并把其他 NULL 契约保持为条件性说明。

46 - 22005 — error_in_assignment

PostgreSQL SQLSTATE 22005 的源码与诊断参考。

22005

速览

22005 是 error_in_assignment,表示赋值操作违反了目标变量的赋值契约。固定 PL/pgSQL 路径报告常量变量被赋值:variable "%s" is declared CONSTANT

字段
SQLSTATE 22005
条件名 error_in_assignment
状态 有效
已知存在于 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_ERROR_IN_ASSIGNMENT
别名

含义

固定 PL/pgSQL 路径报告常量变量被赋值:variable "%s" is declared CONSTANT

exec_check_assignable 会对 PL/pgSQL 变量、promise 变量和 isconst 为真的 record 执行该检查;record field 会递归检查父 record,而 row datum 本身可赋值。因此诊断时要结合 routine 上下文和报文中的 datum 名称。

报文

已确认分支以 ERROR 严重性报告 primary:variable "%s" is declared CONSTANT。固定源码没有 DETAIL 或 HINT。本页只有源码证据,没有自然运行观察。

诊断

读取 message 中的变量名和 routine 上下文;固定路径是 PL/pgSQL 常量赋值错误,不是一般类型转换错误。

处置

移除该赋值、在确需可变时调整声明,或写入另一个变量;先修正 routine 再重做业务操作。显式事务中,未捕获的 ERROR 会使事务失败,应回滚整个事务或回滚到调用前建立的保存点。若 routine 有意使用 PL/pgSQL EXCEPTION 块处理错误,则可由其子事务隔离;本页没有运行案例证明特定 handler 的行为。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000, 22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

47 - 22007 — invalid_datetime_format

PostgreSQL SQLSTATE 22007 的源码与诊断参考。

22007

速览

固定 interval 格式化路径报告 invalid format specification for an interval value,并说明 interval 不绑定到特定日历日期。

字段
SQLSTATE 22007
条件名 invalid_datetime_format
状态 有效
已知存在于 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_INVALID_DATETIME_FORMAT
别名

共享案例用无效的 ID mask 格式化 interval '1 day',再用 DD 作为修复后的 interval 格式。本案例应分开发送两条 SELECT;第一条预期失败,之后再执行修复格式。本案例只验证 interval 格式化路径;会话清理由运行器负责。

SELECT to_char(interval '1 day', 'ID');
SELECT to_char(interval '1 day', 'DD');

校准实测了 interval 的 DCH 格式化路径:无效格式报告 invalid format specification for an interval value,提示为 Intervals are not tied to specific calendar dates.;有效 DD 格式返回 01,运行器的两条自动提交会话均回到 IDLE。本次运行只覆盖 interval 格式化;一般日期解析和 DateStyle 仍属于源码/文档范围。

报文

INVALID_FOR_INTERVAL guard 以 ERROR 严重性报告 primary:invalid format specification for an interval value,HINT 为 Intervals are not tied to specific calendar dates.。引用分支没有独立 DETAIL。固定日期输入解析的 DTERR_BAD_FORMAT/default 分支把 22007 映射为通用 primary 模板 invalid input syntax for type %s: "%s";相邻的字段越界和月日越界分支使用 22008,后者才会增加 HINT Perhaps you need a different "DateStyle" setting.。其他日期时间格式解析器也可能使用 22007 并产生不同的 primary/detail/hint,因此应保留完整诊断。

含义

22007 表示所选日期时间转换的输入或格式说明无效。固定 18.6 interval 格式化路径报告 invalid format specification for an interval value,并说明 interval 不绑定到特定日历日期。在这个 DCH 路径中,ID 是带日历语义的星期几 token,interval 不支持;DD 则可用。固定日期输入路径会通过 ParseDateTime/DecodeDateTimeDateTimeParseError 处理文本:bad-format/default 分支使用 invalid input syntax for type %s: "%s";字段越界属于 22008,其月日歧义分支才可能提示调整 DateStyle。18.6 文档说明 DateStyle 选择含糊数字日期的解释顺序。DateTimeParseError 可以填充 ErrorSaveContext 而不直接抛错,因此 soft-validation 调用与正常 cast/input 传播 ERROR 的行为不同。

诊断

记录原始文本、目标类型、DateStyleTimeZone、format mask,以及操作是 cast、输入函数、to_date/to_timestamp 还是 interval 格式化。在改变数据前,用部署会话设置重现同一文本。区分无效 token/分隔符与已解析但超出范围的月日字段;后者可能产生 22008。

处置

让输入无歧义,在适当场景使用显式格式或 ISO 形式,并在应用边界明确设置会话解析选项。interval 格式化应使用支持 interval 的 mask,而不是日历日期 mask。本次固定案例使用自动提交,失败格式化调用后会话仍为 IDLE;显式事务中应先回滚整个事务,或回滚到失败调用前已有的保存点,再继续执行。写入前拒绝或修正无效文本,不要用切换 DateStyle 的方式静默改写含义。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22008 是日期时间字段/范围越界,22009 是时区位移越界,22003 是数值范围错误。

来源

固定 interval 格式化路径见 formatting.c#L555-L558;固定日期输入 dispatch 见 date.c#L110-L178,通用解析错误映射见 datetime.c#L4195-L4266。PostgreSQL 18 的日期时间输入文档说明了 DateStyle 和含糊日期文本。结构化证据记录固定了这些源码、消息与 hint。

48 - 22008 — datetime_field_overflow

PostgreSQL SQLSTATE 22008 的源码与诊断参考。

22008

速览

固定 date.c 路径报告日期值、日期字段和时间字段越界;具体 primary 会说明失败的转换或操作。

字段
SQLSTATE 22008
条件名 datetime_field_overflow
状态 有效
已知存在于 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_DATETIME_FIELD_OVERFLOW, ERRCODE_DATETIME_VALUE_OUT_OF_RANGE
别名 ERRCODE_DATETIME_VALUE_OUT_OF_RANGE

含义

已确认的 date.c 路径覆盖 date 输入/二进制接收、make_date 字段和范围校验,以及 make_time 字段校验。date 到 timestamp 的转换和算术路径可能使用各自的范围报文;应先看完整 primary 再决定修复。

报文

已确认的 guard 以 ERROR 严重性报告 primary 模板 date out of rangedate out of range: %d-%02d-%02dtime field value out of range: %d:%02d:%02g。引用的源码组没有独立 DETAIL 或 HINT。本页只有源码证据,没有自然运行观察。

诊断

保留日期字段、目标 datetime 类型,以及操作是否解析日期文本或执行算术;若涉及 infinity,再记录是否执行了无限值运算。不要与 22007 的格式错误混淆。

处置

修正日期字段或选择可表示的有限范围;若完整消息指向 timestamp 转换或 infinity 运算,应明确修改该运算。这是 ERROR:显式事务中要回滚整个事务,或回滚到失败转换前建立的保存点后再继续。本页没有运行案例。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000, 22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

49 - 22009 — invalid_time_zone_displacement_value

PostgreSQL SQLSTATE 22009 的源码与诊断参考。

22009

速览

固定 timetz_recv 二进制输入路径报告 time zone displacement out of range,表示 GMT 位移超过支持范围。

字段
SQLSTATE 22009
条件名 invalid_time_zone_displacement_value
状态 有效
已知存在于 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_INVALID_TIME_ZONE_DISPLACEMENT_VALUE
别名

含义

已确认的 timetz_recv guard 会把收到的 GMT 位移与 PostgreSQL 支持的上限比较;这是二进制输入契约错误,不是一般 session TimeZone 设置错误。

报文

已确认的 guard 以 ERROR 严重性报告 primary:time zone displacement out of range。该源码路径没有固定 DETAIL 或 HINT。本页只有源码证据,没有自然运行观察。

诊断

保留实际收到的 offset 数值,检查提供该值的二进制 timetz 接收器或协议解码器,区分位移越界、一般 datetime 字段越界和 session TimeZone 设置问题。

处置

在提供该值的客户端或二进制输入边界校验并替换位移;只有输入契约支持时才改用具有预期语义的命名时区。这是 ERROR:显式事务中要回滚整个事务,或回滚到失败转换前建立的保存点后再继续。本页没有运行案例。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000, 22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

50 - 2200B — escape_character_conflict

PostgreSQL SQLSTATE 2200B 的源码与诊断参考。

2200B

速览

2200B 是 escape_character_conflict;本次固定源码扫描没有解析出原生报告组。

字段
SQLSTATE 2200B
条件名 escape_character_conflict
状态 有效
已知存在于 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_ESCAPE_CHARACTER_CONFLICT
别名

含义

2200B 是 escape_character_conflict;本次固定源码扫描没有解析出原生报告组。

报文

有界源码扫描没有确认固定 PostgreSQL primary、DETAIL、HINT 或严重性。本页只记录定义与扫描边界,runtime_verification 保持 not_run

诊断

定位实际的 pattern/escape parser 或扩展,检查其转义规则;本次无路径扫描不能替代部署版本源码检查。

处置

找到实际选择该码的组件后,按 parser 的转义规则修正 pattern 和 escape 配置;不要用通用 RAISE 伪造解析器行为,也不要从这条源码边界推断事务恢复。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

22000, 22001, 22003, 22004

来源

详见结构化的证据记录,其中列出固定源码链接与范围限制。

51 - 2200C — invalid_use_of_escape_character

PostgreSQL SQLSTATE 2200C 的来源与诊断参考。

2200C

速览

检查完整报文和实际 SQL SIMILAR TO 模式;18.6 的 regexp.c 路径会在翻译阶段报告 SQL regular expression may not contain more than two escape-double-quote separators。这里针对的是 SQL 到 POSIX 正则的翻译语法,不是一般 POSIX 反斜杠转义。

字段
SQLSTATE 2200C
条件名 invalid_use_of_escape_character
状态 有效
已知存在于 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_INVALID_USE_OF_ESCAPE_CHARACTER
别名

含义

本条件属于数据异常族,表示 PostgreSQL 将 SQL SIMILAR TO 模式翻译为 POSIX 正则形式时拒绝了转义结构。similar_escape_internal 在方括号表达式之外把带转义的双引号视为 SQL SUBSTRING 三段之间的分隔符;第三个分隔符会被拒绝。同一 helper 也服务于 SIMILAR TO 翻译,在普通匹配中这些分隔符不改变匹配行为。

报文

已确认的 guard 以 ERROR 严重性报告 primary:SQL regular expression may not contain more than two escape-double-quote separators;该分支没有独立 DETAIL 或 HINT。无效 ESCAPE 字符串属于其他 SQLSTATE 路径,应保留实际报文和代码。

诊断

这是解析器和输入的问题,应分别检查 SQL 字符串层、SIMILAR TO 模式和 ESCAPE 字符。统计方括号表达式之外的转义双引号分隔符,并确认操作是 SIMILAR TO 还是 SUBSTRING ... SIMILAR;不能把正则中的每个反斜杠都诊断为 2200C。

处理

按预期的 SIMILAR TO/SUBSTRING 语义修正 SQL 模式或 ESCAPE 表示,确认分隔符数量后再执行;不要无条件增删 POSIX 反斜杠。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200D22000

来源

固定源码:src/backend/utils/adt/regexp.c#L758-951。结构化证据记录保留定义、消息和范围边界。该路径是 PostgreSQL 的 SQL SIMILAR TO 翻译 helper;本页未运行自然案例。其他转义失败应按实际 SQLSTATE 和报文判断。

52 - 2200D — invalid_escape_octet

PostgreSQL SQLSTATE 2200D 的来源与诊断参考。

2200D

速览

目录中的条件表示转义八位组无效。固定扫描没有为该条目解析出 PostgreSQL 18.6 的具体发出函数,因此这里给出分类边界,而不是把某个解析器调用冒充为已确认路径。

字段
SQLSTATE 2200D
条件名 invalid_escape_octet
状态 有效
已知存在于 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_INVALID_ESCAPE_OCTET
别名

含义

本条件表示消费该转义的解析器无法接受某个八位组;应根据实际报文定位归属。

诊断

先看完整服务器报文和外围操作指出的输入字段,检查字节编码以及解释转义的层(SQL 字面量、正则表达式或扩展解析器)。不能因为两个名称都提到转义就把本码替换成 2200C;应由服务器实际 SQLSTATE 和报文决定路径。本次扫描未确认固定的原生发出函数。

处理

保留完整诊断,定位提供无效八位组的解析器或包装器,在对应边界修正输入或编码后再重试。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200C

来源

固定目录定义已核对;本次有限扫描没有解析出可公开绑定的原生发出函数。 结构化证据记录保留定义、消息和范围边界。 定义在 errcodes.txt 中已固定,但本页未解决实现归属和确切报文变体。应根据实际报文指向的包装器或扩展定位后再改数据或重试。

53 - 2200F — zero_length_character_string

PostgreSQL SQLSTATE 2200F 的来源与诊断参考。

2200F

速览

该条件表示某项操作拒绝空字符字符串。在固定的 fuzzystrmatch 路径中,metaphone 会先对空输入返回空文本;只有经过这个提前返回后才读取 reqlen,非正的请求输出长度才会报告 output cannot be empty string。另一个核心 array_to_tsvector 路径会拒绝空 lexeme,因此必须结合报文和函数判断。

字段
SQLSTATE 2200F
条件名 zero_length_character_string
状态 有效
已知存在于 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_ZERO_LENGTH_CHARACTER_STRING
别名

含义

本条件用于某项操作的输入要求不允许空字符字符串的情况。固定路径有不同 guard:metaphone(text, reqlen) 先在输入为空时返回空文本;对非空输入才检查 reqlenreqlen <= 0 时触发 2200F。array_to_tsvector(text[]) 则独立拒绝长度为零的元素。两条路径都不能证明每个空 SQL 字符串都会产生 2200F。

报文

metaphone guard 以 ERROR 严重性报告 primary:output cannot be empty stringarray_to_tsvector lexeme guard 以 ERROR 报告 primary:lexeme array may not contain empty strings。引用分支没有独立 DETAIL 或 HINT。

诊断

如果报文指向 metaphone,检查传入文本和请求输出长度:空输入在检查 reqlen 前返回空结果,只有非空输入的非正长度才会触发 2200F。如果报文指向 array_to_tsvector,检查每个 lexeme 是否为空,并区分使用 22004 的 NULL lexeme。若报文不同,先定位其中点名的子系统;不要为了消除条件而随意填充输出。

处理

明确处理报文所指函数的输入要求:为非空 metaphone 输入选择正的输出长度,或在 array_to_tsvector 前移除/修正空 lexeme。函数允许时保留有意的空输入语义;不要只为压制代码而填充数据。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200122000

来源

固定 metaphone 源码:fuzzystrmatch.c#L253-287;独立的核心 lexeme guard 见 tsvector_op.c#L741-777。结构化证据记录保留两条消息和范围边界。本页未运行自然案例;实际 SQLSTATE 和报文仍是判断依据。

54 - 2200G — most_specific_type_mismatch

PostgreSQL SQLSTATE 2200G 的来源与诊断参考。

2200G

速览

该条件表示类型解析时无法确定最具体类型。有限的固定扫描没有解析出 PostgreSQL 18.6 的具体发出路径,因此本页保持条件性说明,不把一般转换或运算符错误冒充为 2200G。

字段
SQLSTATE 2200G
条件名 most_specific_type_mismatch
状态 有效
已知存在于 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_MOST_SPECIFIC_TYPE_MISMATCH
别名

含义

本条件涉及类型选择:操作无法确定最具体的公共类型。

诊断

结合完整报文以及其中涉及的表达式或例程签名定位。检查报错位置的 unknown 字面量、多态参数、重载运算符和显式类型转换。若服务器实际报告 42804 或 42846,应按实际代码处理;“类型不匹配”本身不能证明是 2200G。

处理

确认服务器实际 SQLSTATE 后,通过明确预期类型或修正例程签名解决报错表达式的类型解析。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200342804

来源

固定目录定义已核对;本次有限扫描没有解析出可公开绑定的原生发出函数。 结构化证据记录保留定义、消息和范围边界。 目录定义已确认,但本次扫描没有解析出发出函数和报文模板。包装器或扩展可能拥有具体用法,调查时应保留实际上下文。

55 - 2200H — sequence_generator_limit_exceeded

PostgreSQL SQLSTATE 2200H 的来源与诊断参考。

2200H

速览

序列在尝试取得下一个值时遇到了配置的边界。PostgreSQL 18.6 的 sequence.c 路径同时有最大值和最小值的源码模板;端点值本身可以是合法返回值。数值使用 C 的 PRId64 格式宏,因此源码写法是 nextval: reached maximum value of sequence "%s" (%" PRId64 ")(最小值形式相应替换为 minimum),不能把它误写成字面量 (%s) 占位符。这里的限制属于序列属性,不是一般整数溢出。

字段
SQLSTATE 2200H
条件名 sequence_generator_limit_exceeded
状态 有效
已知存在于 10.0
锁定快照 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED
别名

含义

本条件表示 nextval 的 fetch loop 无法在配置的最小值或最大值之外再分配下一个值。在递增路径中,源码检查最大值边界;在递减路径中,源码检查最小值边界。触及边界时,若 rescnt > 0,循环会先停止并返回已经取得的合法值;只有没有可返回结果时,未启用 CYCLE 的分支才报告 2200H。启用 CYCLE 时,固定源码会绕回另一个配置端点。这是序列边界策略,不是一般整数溢出。

报文

未启用循环的递增 guard 以 ERROR 报告 primary 源码模板 nextval: reached maximum value of sequence "%s" (%" PRId64 ");递减 guard 使用 nextval: reached minimum value of sequence "%s" (%" PRId64 ")。端点本身不是错误:如果 fetch loop 已取得合法结果,会先停止抓取而不进入错误分支。PRId64 是拼接进已编译数值占位符的 C 格式宏,最终显示的数字是运行时限制值。引用分支没有独立 DETAIL 或 HINT。

诊断

检查报文点名的序列、步长、MINVALUE/MAXVALUE、CYCLE 设置以及调用是否为 nextval,先判断触及的是最大值还是最小值、是否仍有合法端点或缓存值可返回,以及循环是否是有意策略。CYCLE 只是序列策略,不是所有生成 ID 的通用修复:开启它可能与依赖键冲突,或违反应用的分配约束。若不应循环,应在核对依赖键后选择安全的新范围、调整序列或轮换到新序列。

处理

有意修复序列策略:核对键语义后调整安全限制、决定是否启用 CYCLE,或迁移到新序列。重复同一个 nextval、转换其结果或把本码当成整数溢出,都不能越过固定端点。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 10.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200322000

来源

固定源码:src/backend/commands/sequence.c#L731-769。结构化证据记录保留两种端点报文和范围边界。固定源码确认递增/递减 guard、CYCLE 回绕和 C 的 PRId64 格式宏;序列名和限制值是运行时字段。锁定目录从 10.0 起记录该条件,但不据此断言精确的实现引入提交。

56 - 2200L — not_an_xml_document

PostgreSQL SQLSTATE 2200L 的来源与诊断参考。

2200L

速览

SQL/XML 的 SQLSERIALIZE DOCUMENT 操作收到的输入无法满足所要求的文档形式。PostgreSQL 18.6 会把这个公开的 DOCUMENT 路径映射到带有 XMLOPTION_DOCUMENTxmltotext_with_options;失败或软错误会被映射为 not an XML document。包装器对非 DOCUMENT 且不缩进的提前绕过不属于 CONTENT 模式的 2200L 结论,本页也不涵盖所有 XML 内容或注释违规。

字段
SQLSTATE 2200L
条件名 not_an_xml_document
状态 有效
已知存在于 8.3.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_NOT_AN_XML_DOCUMENT
别名

含义

本成员是公开 SQL/XML SQLSERIALIZE DOCUMENT 形式的文档级 XML 失败。该操作把 XMLOPTION_DOCUMENT 传给 xmltotext_with_options;后者用 ErrorSaveContext 调用 xml_parse,没有返回文档或保存的解析错误被设置时,就释放部分文档并报告 2200L。它的提前 guard 会在非 DOCUMENT 且不缩进时直接返回二进制兼容的输入,因此不能把这个映射推广到 CONTENT。较低层的 xml_parse 另有 2200M/2200N 分支,因此不能把本码理解为所有解析器错误的同义词。

报文

SQLSERIALIZE DOCUMENT 包装器以 ERROR 严重性报告 primary:not an XML document。引用分支没有独立 DETAIL 或 HINT;解析器的具体上下文须以实际运行报文和构建为准。

诊断

保留完整上下文和传给 SQLSERIALIZE 的表达式。先确认操作要求的是 DOCUMENT 还是 CONTENT,再检查文档边界、顶层结构和编码。2200L 诊断只绑定上述 DOCUMENT 映射;不要从 CONTENT 请求推断本码,也不要把成员码 2200M/N/S/T 与本码的文档级条件混为一谈。

处理

按解析器指出的位置修正文档边界和结构,同时保留调用方要求“文档”还是“片段”的语义要求。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200M2200N2200S2200T

来源

固定源码:src/backend/utils/adt/xml.c#L669-697。结构化证据记录保留文档选项 guard、报文和范围边界。源码确认了包装器映射;具体输入和可能的 libxml2 上下文取决于运行时。本页未运行自然 XML 案例。

57 - 2200M — invalid_xml_document

PostgreSQL SQLSTATE 2200M 的来源与诊断参考。

2200M

速览

该目录成员表示 XML 文档无效。PostgreSQL 18.6 的核心 xml_parse 文档分支会报告 invalid XML document,而 contrib/xml2 的 XSLT 路径在源文档或样式表解析失败时也使用同一 SQLSTATE。这些发出点不同于 2200L 的文档选项包装器。

字段
SQLSTATE 2200M
条件名 invalid_xml_document
状态 有效
已知存在于 8.3.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_XML_DOCUMENT
别名

含义

本成员来自具体的文档解析 guard,表示 XML 文档无效。在核心 xml_parse 中,xmlCtxtReadDoc 解析失败且原始 XML 选项为 DOCUMENT 时报告 2200M;原始选项为 CONTENT 时,同一解析失败报告 2200N。独立的 contrib/xml2 函数在把输入文档或样式表作为 XML 解析失败时使用 2200M。核心 xml_errsave 会把这些结果交给 errsave:传入 ErrorSaveContext 时保存错误并正常返回,普通上下文则抛出错误;这条软错误路径不同于 contrib/xml2 直接抛出 ERROR 的分支。

报文

核心分支以 ERROR 报告 primary:invalid XML documentcontrib/xml2 分支以 ERROR 报告 primary:error parsing XML documenterror parsing stylesheet as XML document。引用分支没有固定 DETAIL 或 HINT 模板;libxml2 上下文可能动态附加。不要把这些报文替换成 2200L 的 not an XML document

诊断

结合实际 SQLSTATE、message、detail 和 context,区分文档级失败与内容(2200N)、注释(2200S)或处理指令(2200T)错误。检查产生报文的是核心 xml_parse 还是 contrib/xml2,再修正报文指向的文档或样式表。本页已确认这些源码发出路径,但未运行自然案例。

处理

根据实际报文和解析器上下文修正无效文档;未确认实际 SQLSTATE 前不要套用 2200L 的处理。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200L2200N

来源

核心固定源码:src/backend/utils/adt/xml.c#L1780-1862。独立的 contrib/xml2/xslt_proc.c#L84-100 路径解析 XML 文档和样式表。共享的 xml_errsave/errsave helper定义软错误与普通抛错的行为。结构化证据记录保留两个发出点、报文角色和范围边界。核心路径依赖 USE_LIBXML;本页未运行自然 XML 案例。

58 - 2200N — invalid_xml_content

PostgreSQL SQLSTATE 2200N 的来源与诊断参考。

2200N

速览

该成员表示 XML 内容无效。PostgreSQL 18.6 的核心 XML 解析器有内容模式的声明 guard 和内容解析 guard,会报告 2200N;原始 XML 选项决定文档解析失败是否改报 2200M。

字段
SQLSTATE 2200N
条件名 invalid_xml_content
状态 有效
已知存在于 8.3.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_XML_CONTENT
别名

含义

本成员表示 CONTENT 边界上的 XML 内容无效。在内容模式中,无效 XML 声明会报告 invalid XML content: invalid XML declaration,DETAIL 由 errdetail_for_xml_code(res_code) 动态生成。平衡内容解析失败会报告 invalid XML content;CONTENT 输入含 DOCTYPE 而被按文档解析时,失败仍依据原始选项选择 2200N。同一个解析调用在原始选项为 DOCUMENT 时使用 2200M。声明分支直接使用 errsave,内容分支使用 xml_errsave;有 ErrorSaveContext 时错误被保存并返回给调用方,普通上下文则抛出 ERROR。这与动态 DETAIL 是两个层次。

报文

引用分支以 ERROR 报告两类 primary:声明 guard 使用 invalid XML content: invalid XML declaration,并附加由 errdetail_for_xml_code(res_code) 生成的动态 DETAIL;后续内容或文档解析失败使用 invalid XML content。声明变体的 evidence 模板是 dynamic errdetail_for_xml_code(res_code),不是固定 DETAIL 文本。不能为这些解析失败虚构一个固定通用 DETAIL 或 HINT。2200L 是外层文档选项包装器,2200S 和 2200T 分别标识注释与处理指令语法。

诊断

阅读完整解析报文和其中指出的 XML 片段或值,检查元素名、字符数据、编码及操作要求的 XML 层级。服务器实际发出 2200L、2200M、2200S 或 2200T 时应直接按对应代码处理;不能只因报文出现“invalid”就选择 2200N。

处理

在诊断指出的元素、字符或编码边界修正 XML 内容,并在验证修复时保留实际代码。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200L2200S2200T

来源

核心固定源码:src/backend/utils/adt/xml.c#L1780-1894。共享的 xml_errsave/errsave helper定义软错误与普通抛错的行为。结构化证据记录保留声明和内容解析 guard、动态 detail 边界及范围限制。核心路径依赖 USE_LIBXML;本页未运行自然 XML 案例。

59 - 2200S — invalid_xml_comment

PostgreSQL SQLSTATE 2200S 的来源与诊断参考。

2200S

速览

XML 注释无效。PostgreSQL 18.6 的 xmlcomment 路径在注释文本含有被禁止的 -- 序列或以 - 结尾时报告 invalid XML comment;周围源码检查的是注释专属的 XML 语法,而不是一般文档失败。

字段
SQLSTATE 2200S
条件名 invalid_xml_comment
状态 有效
已知存在于 8.3.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_XML_COMMENT
别名

含义

本成员专用于 XML 注释语法,不涵盖所有 XML 文档失败。在 USE_LIBXML 下,xmlcomment 在构造 <!--...--> 之前扫描输入;任意位置的双连字符或末尾连字符都会被拒绝。

报文

该 guard 以 ERROR 严重性报告 primary:invalid XML comment。引用分支没有独立 DETAIL 或 HINT。未启用 USE_LIBXML 时函数走独立的 XML 支持路径(0A000),因此源码存在本身不能证明所有服务器构建都提供此功能。

诊断

检查报文指出的注释文本和 XML 上下文。XML 注释不能包含被禁止的双连字符形式,也不能以连字符结尾;在保留周围标记的前提下修正该注释。若解析器实际指出处理指令或非文档内容,应按报出的 2200T 或 2200L/N 处理。

处理

在保留周围 XML 的前提下修正注释文本,依据注释专属报文处理,而不是套用一般文档修复。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200L2200T

来源

固定源码:src/backend/utils/adt/xml.c#L490-523。结构化证据记录保留完整注释 guard、报文和范围边界。违规注释是运行时输入,函数编译受 USE_LIBXML 控制;本页未运行自然 XML 案例。

60 - 2200T — invalid_xml_processing_instruction

PostgreSQL SQLSTATE 2200T 的来源与诊断参考。

2200T

速览

XML 处理指令违反 XML 语法。PostgreSQL 18.6 的 xmlpi 路径拒绝大小写不敏感地等于 xml 的目标名,或含有 ?> 的非 NULL 内容;两条 guard 都报告 invalid XML processing instruction,并附加对应 DETAIL。

字段
SQLSTATE 2200T
条件名 invalid_xml_processing_instruction
状态 有效
已知存在于 8.3.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_XML_PROCESSING_INSTRUCTION
别名

含义

本成员专用于 XML 处理指令语法,包括目标名和内容。xmlpi 用大小写不敏感比较检查目标名,因此 xmlXML 和混合大小写都会命中同一目标 guard。完成该语法检查后才应用 SQL NULL 规则:合法目标配 NULL 内容时返回 NULL;非 NULL 内容含有 ?> 时命中内容 guard。

报文

目标 guard 以 ERROR 报告 primary:invalid XML processing instruction,DETAIL 为 XML processing instruction target name cannot be "%s".。内容 guard 使用相同 primary,DETAIL 为 XML processing instruction cannot contain "?>".。引用分支没有独立 HINT。%s 是运行时目标名;合法目标下的 NULL 内容不是 2200T 错误。

诊断

结合完整 message 和 detail 判断是目标名还是指令内容有问题。检查目标名规则,并在保持周围 XML 结构有效的前提下从内容中移除结尾 ?> 序列。不要用本成员规则去修复注释或一般文档错误。

处理

按 detail 指出的目标名或指令内容修正处理指令,保持 XML 结构有效并移除被禁止的处理指令形式。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200L2200S

来源

固定源码:src/backend/utils/adt/xml.c#L1010-1055。结构化证据记录保留两条 guard、message/detail 变体、NULL 顺序和范围边界。目标名和指令内容是运行时值;本页未运行自然 XML 案例。

61 - 22010 — invalid_indicator_parameter_value

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

速览

指示参数值不符合消费该参数的操作所要求的指示变量或描述符规则。固定的 PostgreSQL 18.6 目录已确认该条件,但有限源码扫描没有把它绑定到原生发出函数、报文模板或严重级别。

字段
SQLSTATE 22010
条件名 invalid_indicator_parameter_value
状态 有效
已知存在于 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_INVALID_INDICATOR_PARAMETER_VALUE
别名

含义

22010涉及随操作传入的指示变量或描述符字段值。条件名本身不能确定具体 API、指示字段布局或服务器例程;实际报出它的操作才定义哪些值有效。

诊断

记录完整诊断、操作或 API 的归属、参数位置、源类型和实际指示值,检查初始化、允许的符号和值范围,以及包装器是否转换了失败。仅凭 NULL 或 cast 报文不能确定 22010;本次固定源码审阅也不根据名称推断 ECPG 发出路径。

处理

按消费该字段的操作文档修正报文指出的指示变量或描述符值,再检查其他输入后重试。如果报文来自包装器,应修正包装器的输入映射,不要假设存在服务器端路径。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。本次有限审阅没有确定精确的实现引入时间或发出路径。

2200222004

来源

固定定义已在 errcodes.txt 中核对。运行核验为 not_run;有限的 PostgreSQL 18.6 扫描没有解析出原生发出函数,因此本页不宣称具体 primary 模板、严重级别、事务影响或 API 归属。结构化证据记录保留定义和范围边界。

62 - 22011 — substring_error

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

速览

文本子字符串路径收到无效的显式长度。固定的 PostgreSQL 18.6 代码中,text_substring 以 SQLSTATE 22011 报告 negative substring length not allowed

字段
SQLSTATE 22011
条件名 substring_error
状态 有效
已知存在于 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_SUBSTRING_ERROR
别名

含义

三参数文本子字符串包装器把显式长度传给 text_substring;负长度会进入 ERRCODE_SUBSTRING_ERROR guard。无长度包装器则传入带有 length_not_specified 的哨兵值,返回剩余文本,不会进入负长度 guard。OVERLAY 的起点不为正时也复用这个报错。本证据针对文本路径;bytea、位串和基于模式的 substring 有各自的消费者,应以完整诊断识别。

诊断

修改前先确认解析出的操作和数据类型。对文本路径,要区分显式负长度与零或负起点:源码把有效起点调整为 1,并按 SQL 规则调整长度。起点超过末尾会返回空串。起点加长度的 32 位计算溢出时,子串延伸到末尾,并不报本码。OVERLAY 的非正起点使用同一 primary,而起点加长度溢出则使用 22003

处理

传入非负的显式文本长度;若意图是取到末尾,则省略长度。保留预期的一基起点语义,并在修复前确认实际数据类型。该路径抛出 ERROR;显式事务需先 ROLLBACK 或回到已有保存点后再重试,自动提交只重试修正后的语句。

报文

  • Primary,ERROR:显式文本子字符串 guard 和非正 OVERLAY 起点 guard 都是 negative substring length not allowed;这些路径没有固定 DETAIL 或 HINT。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。引用的 guard 是当前版本的文本和 OVERLAY 路径,不推广到所有 substring 实现。

220002200122003

来源

运行核验为 not_run;上述源码证据不是运行观察。结构化证据记录保留确切 primary 和源码范围。

63 - 22012 — division_by_zero

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

速览

除法或取模操作遇到零除数。PostgreSQL 18.6 在 numeric、整数、浮点、money 和 interval 除法路径中使用 SQLSTATE 22012,但每条路径仍有自己的操作数和特殊值规则。

字段
SQLSTATE 22012
条件名 division_by_zero
状态 有效
已知存在于 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_DIVISION_BY_ZERO
别名
SELECT 10::numeric / 0::numeric;
SELECT 10::numeric / 2::numeric;

保留的 PostgreSQL 18.6 和 10.21 实测显示,第一条语句返回 primary division by zero 与 SQLSTATE 22012,随后修正语句返回 5.0000000000000000;修复动作后两个后端均为 IDLE公开案例 JSON 说明了这个 numeric 除法案例;它不是对下面所有生产路径的运行时比较。

含义

直接的 numeric_divnumeric_mod 会检查 numeric 零除数;内部 *_opt_error 形式也可以设置 have_error 标志并返回 NULL,由调用者自行处理。整数除法和取模函数在使用 /% 前检查第二个操作数是否为零。float4/float8 除法经过 float*_div,当分子不是 NaN 且除数为零时抛错。money 除法检查整数或 money 除数,interval 除法检查浮点因子。这些路径共享 SQLSTATE 和 primary 文本,但实际解析出的运算符及特殊值仍决定结果。

诊断

在运算符和类型解析完成后定位除数或取模除数;不要把 int4 规则推广到全部数值类型。检查零是否来自输入、连接、聚合或业务规则,并阅读完整 primary。NULL 操作数通常在严格算术函数调用前得到 NULL;NULLIF(denominator, 0) 则是有意把零情况变为 NULL。CASE 可以选择 NULL、替代值或跳过分支,因此应选择符合业务结果的分支,不要静默地把错误改成另一个值。

还要区分规划期和执行期:PostgreSQL 18.6 的条件表达式文档警告,常量 1/0 子表达式即使位于运行时不会进入的 CASE 分支,也可能在规划期失败。规划器源码会递归简化常量参数并计算不可变的常量表达式。若必须延迟到执行期,应使用非恒定值,或在实际除数处使用 NULLIF/合适的 CASE;这不能让无效常量表达式变安全,也不能替应用决定 NULL 或替代值哪一种语义正确。

处理

修正产生零除数的来源,或明确选择零值策略。只有 NULL 结果符合业务含义时才使用 NULLIF;应用确有替代值或跳过规则时使用 CASE,然后检查下游聚合和过滤将看到的新结果。不要重放未改变的操作。普通固定路径抛出 ERROR;显式事务需先 ROLLBACKROLLBACK TO SAVEPOINT 再重试,自动提交只重试修正后的动作。保留的 18.6/10.21 numeric 实测仅覆盖这个案例。

报文

  • Primary,ERRORdivision by zero
  • 引用的 numeric、整数、浮点、money 和 interval 除法 guard 没有固定 DETAIL 或 HINT。内部 numeric have_error 调用是软处理路径,不能据此声称直接 SQL 运算成功返回。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。保留的 numeric 运行记录是 PostgreSQL 18.6 和 10.21,仅覆盖 10::numeric / 0::numeric 后接 10::numeric / 2::numeric

220032200822015

来源

结构化证据记录保留两份运行摘要/原始摘要哈希和固定源码声明。

64 - 22013 — invalid_preceding_or_following_size

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

速览

固定的 ROWSGROUPS 窗口执行路径遇到负的窗口帧偏移。PostgreSQL 18.6 以 SQLSTATE 22013 报告 frame starting offset must not be negativeframe ending offset must not be negative

字段
SQLSTATE 22013
条件名 invalid_preceding_or_following_size
状态 有效
已知存在于 11.0
锁定快照 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE
别名

含义

calculate_frame_offsets 为一次窗口扫描计算起始和结束表达式。复制非 NULL 值后,ROWSGROUPS 分支把它解释为 int8 偏移;负值进入 22013 guard。NULL guard 使用 22004 和不同的 primary。RANGE 帧使用按类型实现的 in_range helper:整数 helper 拒绝负偏移,numeric 拒绝 NaN、负无穷或负值,浮点 helper 拒绝 NaN 或负值,带 interval 的 timestamp helper 拒绝负 interval。这些 helper 使用同一个 22013 primary,因此帧模式和解析后的偏移类型都是诊断条件。

诊断

阅读帧模式、primary 指出的端点和偏移表达式的实际值。在 ROWS/GROUPS 中,起点或终点为负就是本码。在 RANGE 中,应按解析后的偏移类型判断:负整数或 interval,以及被拒绝的 NaN/负 numeric 或浮点值,都进入同一代码。起点或终点为 NULL 属于 22004,不是 22013。这是帧边界校验失败,不是一般算术溢出。

处理

对于 ROWSGROUPS 端点,提供非负且可转为 int8 的偏移;对于 RANGE,提供符合解析后类型 in_range helper 要求的值。如果实际问题是 NULL,则提供非 NULL 值。引用的 guard 抛出 ERROR,因此显式事务需先 ROLLBACK 或回到已有保存点后再重试,自动提交只重试修正后的语句。

报文

  • Primary,ERRORframe starting offset must not be negative
  • Primary,ERRORframe ending offset must not be negative
  • Primary,ERRORinvalid preceding or following size in window function,用于引用的按类型 RANGE 偏移 guard。
  • 引用的 guard 没有附加 DETAIL 或 HINT。NULL 端点使用 SQLSTATE 22004,primary 分别为 frame starting offset must not be nullframe ending offset must not be null

版本

锁定目录从 11.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。引用的执行器 guard 覆盖 ROWS/GROUPS;引用的按类型 in_range helper 也覆盖了代表性的 RANGE 偏移。

220042201222003

来源

运行核验为 not_run;上述源码证据不是运行观察。结构化证据记录保留两个端点变体、RANGE 通用 primary 及其范围。

65 - 22014 — invalid_argument_for_ntile_function

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

速览

ntile 收到非正的桶数量。固定窗口函数路径以 SQLSTATE 22014 报告 argument of ntile must be greater than zero

字段
SQLSTATE 22014
条件名 invalid_argument_for_ntile_function
状态 有效
已知存在于 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_ARGUMENT_FOR_NTILE
别名

含义

context->ntile 仍为零、尚未成功初始化时,window_ntile 才会计算桶参数。参数为 NULL 时先返回 NULL,也不会设置这个状态,因此后续行可能再次计算参数;小于等于零时抛出 22014,正数则初始化状态并在后续行复用。空输入没有可供窗口函数计算的行,不属于这个错误。

诊断

检查受影响分区中 ntile 参数的解析值,区分三种情况:正数、NULL 和非正数。对实际求值的行,NULL 参数会给出 NULL;空分区则完全没有结果。二者都不应归为非正参数错误。

处理

检查提供参数的表达式后传入正整数桶数量。只有桶策略本来就允许时,才使用 COALESCE 或其他回退值。固定 guard 抛出 ERROR;显式事务需先回滚或回到已有保存点再重试,自动提交只重试修正后的语句。

报文

  • Primary,ERRORargument of ntile must be greater than zero
  • 固定 guard 没有附加 DETAIL 或 HINT。

版本

锁定目录从 8.4.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。引用的是窗口函数实现,不是一般参数校验器。

2201322016

来源

src/backend/utils/adt/windowfuncs.c#L411-L475 展示分区行数、NULL 提前返回、正数 guard 和桶计算。运行核验为 not_run;上述源码证据不是运行观察。结构化证据记录保留 primary 和范围。

66 - 22015 — interval_field_overflow

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

速览

interval 输入字段超出 interval 解码器接受的范围。PostgreSQL 18.6 将这一日期时间解析条件映射为 SQLSTATE 22015;后续 interval 构造或算术运算可能使用其他范围码。

字段
SQLSTATE 22015
条件名 interval_field_overflow
状态 有效
已知存在于 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_INTERVAL_FIELD_OVERFLOW
别名

含义

固定的 interval_in 路径先解析输入,再按 typmod 范围解码 interval 字段;第一次解析返回格式错误时还会尝试 ISO 8601。解码返回 DTERR_FIELD_OVERFLOW 时,interval_in 将其改为 DTERR_INTERVAL_OVERFLOW;随后 DateTimeParseErrorERRCODE_INTERVAL_FIELD_OVERFLOW 把原始输入放进 primary。这是 interval 字段输入边界。itmin2interval 转换失败、typmod 调整和 interval 算术有独立 guard,可能报告 2200822003 或其他条件,不会自动变成 22015

诊断

阅读完整 primary,确认输入字符串、interval 字段和声明的 typmod/范围。区分字段解码时溢出,还是后续构造、缩放或除 interval 时才失败。日期时间字段诊断属于相邻的日期时间错误码,interval 除以零因子属于 22012。不要用一般数值溢出修复替代字段范围问题。

处理

修正报文指出的 interval 字段或输入表示,使其落在操作接受的范围内;如果边界来自 interval typmod,也要复核该约束。如果失败发生在后续算术中,应按它自己的 SQLSTATE 修复。普通错误上下文中该路径抛出 ERROR,显式事务需先 ROLLBACKROLLBACK TO SAVEPOINT 再重试;调用方提供 ErrorSaveContext 时,错误会被保存,调用返回 NULL/失败而不是抛出。

报文

  • 普通上下文为 ERROR 的 primary:interval field value out of range: "%s",其中 %s 是原始 interval 输入。引用分支没有固定 DETAIL 或 HINT。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。源码确认的路径是 interval 输入解码,不声称所有 interval 算术溢出都使用 22015

22007220032200822012

来源

运行核验为 not_run;本页不宣称 interval 运行观察。结构化证据记录保留确切报文角色和源码边界。

67 - 22016 — invalid_argument_for_nth_value_function

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

速览

nth_value 收到非正的序号。固定窗口函数路径以 SQLSTATE 22016 报告 argument of nth_value must be greater than zero

字段
SQLSTATE 22016
条件名 invalid_argument_for_nth_value_function
状态 有效
已知存在于 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_ARGUMENT_FOR_NTH_VALUE
别名

含义

window_nth_value 先读取序号参数:NULL 返回 NULL,小于等于零才抛出 22016。正序号随后转换为从帧头开始的零基偏移。如果目标行不在当前帧内,或选中的值本身为 NULL,执行器返回 NULL;这两种情况都不是 22016

诊断

检查序号实际值、窗口排序和帧边界。区分无效的非正参数与合法正参数但目标行不在帧内的情况。NULL 序号也是 NULL 结果路径,因此不能仅因结果为 NULL 就归为本码。

处理

如果函数确实要选取某行,传入正序号;只有必须包含目标行时才调整排序或帧。若 NULL 表示帧中没有目标行或目标值本来为 NULL,应保留这个结果。非正 guard 抛出 ERROR;显式事务需先回滚或回到已有保存点再重试,自动提交只重试修正后的语句。

报文

  • Primary,ERRORargument of nth_value must be greater than zero
  • 非正序号 guard 没有附加 DETAIL 或 HINT;超出帧和 NULL 值路径改为返回 NULL。

版本

锁定目录从 8.4.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。引用的是窗口函数实现,不是一般序号校验器。

2201422013

来源

src/backend/utils/adt/windowfuncs.c#L686-L715 展示 NULL 处理、正序号 guard、帧查找,以及没有目标行/值时返回 NULL。运行核验为 not_run;上述源码证据不是运行观察。结构化证据记录保留 primary 和范围。

68 - 22018 — invalid_character_value_for_cast

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

速览

字符值被操作所要求的转换拒绝。固定的 PostgreSQL 18.6 目录已确认 invalid_character_value_for_cast,但有限源码扫描没有把本码绑定到单一原生发出函数或报文模板。

字段
SQLSTATE 22018
条件名 invalid_character_value_for_cast
状态 有效
已知存在于 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_INVALID_CHARACTER_VALUE_FOR_CAST
别名

含义

22018表示字符表示形式不能被请求的转换接受。条件名不能决定目标类型、解析器、区域规则或包装器;这些细节属于实际报出本码的操作。不要把目录定义扩写成某一个具体转换实现的结论。

诊断

阅读完整 primary、源类型和目标类型、输入格式以及相关区域或类型设置,判断是目标解析器不接受格式、值超出范围,还是类型解析拒绝。日期时间语法诊断、数值范围诊断和一般运算符不匹配可能使用相邻错误码;应由实际报文和归属实现决定修复方式。

处理

按实际源类型、目标类型和格式规则修正源表示或显式转换。如果报文来自包装器或扩展,应遵循该消费者的解析规则,不要假设固定核心扫描已经覆盖。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。本次有限审阅没有确定精确的实现引入时间或固定原生发出路径。

2200722003

来源

固定定义已在 errcodes.txt 中核对。运行核验为 not_run;有限的 PostgreSQL 18.6 扫描没有解析出单一原生发出路径,因此本页不宣称具体 primary 模板、严重级别或事务影响。结构化证据记录保留定义和范围边界。

69 - 22019 — invalid_escape_character

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

速览

某个操作拒绝了它的转义参数。固定目录定义了 invalid_escape_character,但有限的 PostgreSQL 18.6 源码扫描没有找到可以安全绑定单一报文或严重级别的原生发出路径。

字段
SQLSTATE 22019
条件名 invalid_escape_character
状态 有效
已知存在于 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_INVALID_ESCAPE_CHARACTER
别名

含义

具体规则属于 ESCAPE 的消费者。PostgreSQL 的 LIKE 和 SIMILAR 文档允许一个字符的转义符,也允许用 ESCAPE '' 禁用转义,并特别说明这与 SQL 标准对零长度值的规定不同。其他消费者可能要求一个字符、拒绝某些字符,或有自己的空串规则。因此在没有发出路径时,不能用一条通用的长度或字符校验解释 22019

诊断

先确认消费者并阅读完整诊断,再修改值。检查转义表达式的解析类型和字符长度、值是否为空字符串,以及所选字符在该模式语言中是否有特殊含义。把 SQL 字符串字面量的引号处理与模式转义分开,并将本有限定义与 2200C 的 SIMILAR 分隔符语法、2200D 的无效字节区分开。

处理

遵循消费者文档规定的转义表示:消费者要求时提供有效的单字符,消费者明确用空字符串(ESCAPE ‘’)禁用转义时才使用这个支持的表示。必要时重新编码 SQL 字面量,然后在同一消费者中验证;不要把 LIKE 规则套到无关解析器上。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。本次有限审阅没有确定精确的实现引入时间或原生发出路径。

2200C2200D

来源

  • 固定定义已在 errcodes.txt 中核对;本次有限 PostgreSQL 18.6 源码扫描没有解析出 ERRCODE_INVALID_ESCAPE_CHARACTER 的出现位置。
  • 同版模式匹配文档说明 LIKE 的单字符、默认和空转义规则,#L5724-L5830说明对应的 SIMILAR 规则。这是消费者规则,不是对 22019 发出函数的声明。

运行核验为 not_run;本页不宣称 primary 模板、严重级别或事务影响。结构化证据记录保留定义、文档范围和有限发出路径限制。

70 - 2201B — invalid_regular_expression

PostgreSQL SQLSTATE 2201B 的来源与诊断参考。

速览

SQL 正则编译和执行有不同的 2201B 路径,HBA/ident 配置处理则复用本码并按日志级别报告。必须按归属分别读取固定报文和严重级别,不能合并成一个笼统的正则失败。

字段
SQLSTATE 2201B
条件名 invalid_regular_expression
状态 有效
已知存在于 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_INVALID_REGULAR_EXPRESSION
别名

含义

regexp.c 中,无法编译的模式以 ERROR 报告 invalid regular expression: %s;已经编译的模式若执行返回正则引擎错误,则以 ERROR 报告 regular expression failed: %sREG_NOMATCH 是正常的不匹配结果,不是本 SQLSTATE。在 hba.c 中,配置正则编译使用 invalid regular expression "%s": %s,严重级别由调用方提供(正常的 load_hba 路径传入 LOG);ident 映射的匹配或反向引用失败也有各自的日志 primary。这些配置报文不是 SQL 表达式的 ERROR 路径。

诊断

结合完整 primary、严重级别和上下文确认归属。对 SQL 正则函数,检查模式和 flags,区分编译错误与执行错误。对 HBA 或 ident 配置,检查报文指出的文件、行号、token 的前导斜杠标记及其后交给编译器的正则文本,以及重载/启动上下文;重载时记录的配置失败可能保留旧的 HBA 配置。不要把正常的 REG_NOMATCH 当作语法无效。

处理

按所属语法修正模式或 flags,并在同一子系统中验证。SQL 正则 ERROR 会中止当前语句,因此显式事务需先 ROLLBACK 或回到已有保存点再重试,自动提交只重试修正后的语句。配置 LOG/debug 报文需要修正 HBA 或 ident 文件并按该子系统重载或重启,不是回滚事务。

报文

  • SQL 正则编译,ERRORinvalid regular expression: %s
  • SQL 正则执行错误,ERRORregular expression failed: %s
  • HBA 正则编译,调用方选择的级别(正常 load_hba 路径使用 LOG):invalid regular expression "%s": %s;源码还附加配置文件行上下文。
  • HBA ident 映射执行,LOGregular expression match for "%s" failed: %s
  • HBA ident 反向引用没有捕获子表达式,LOGregular expression "%s" has no subexpressions as requested by backreference in "%s"

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。引用的 SQL 正则和 HBA/ident 路径属于不同归属;扩展或其他子系统的报文不在本次有限审阅范围内。

2200C2200D

来源

运行核验为 not_run;本页不宣称正则运行观察。结构化证据记录保留按归属区分的报文、严重级别和源码限制。

71 - 2201E — invalid_argument_for_logarithm

PostgreSQL SQLSTATE 2201E 的来源与诊断参考。

2201E

速览

对数函数会在定义域守卫处拒绝零值和负值。固定浮点路径报告 cannot take logarithm of zerocannot take logarithm of a negative number;numeric 的 ln 和给定底数的对数路径也使用该 SQLSTATE,但会分别处理 NaN 与无穷值。

字段
SQLSTATE 2201E
条件名 invalid_argument_for_logarithm
状态 有效
已知存在于 8.0.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_ARGUMENT_FOR_LOG
别名

含义

2201E 是对数定义域错误,不是一般数值溢出。float.cln()log() 先拒绝等于零的参数,再拒绝小于零的参数。numeric 的 ln 拒绝负无穷但原样返回 numeric NaN 或正无穷;numeric 的给定底数对数拒绝负值或零值输入,而某些正的特殊值组合有定义结果。

诊断

先读函数签名和实际数值类型,再定位参数。按首要报文区分零值守卫与负值守卫。浮点 NaN 不满足这两个比较,因此不会进入这条具体守卫;后续浮点溢出或下溢属于其他条件。检查对数定义域是否符合业务意图,不要只为转换而转换。

处理

提供符合目标对数函数定义域的值,或明确改变业务规则。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交客户端可直接重试修正后的语句。单纯 cast 不能使未定义运算变得有定义。

版本

锁定目录从 8.0.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2200322012

来源

固定路径包括 src/backend/utils/adt/float.c#L1687-1747src/backend/utils/adt/numeric.c#L3935-4020 以及 #L11156-11168,绑定零值/负值守卫及特殊值分支。结构化证据记录保留确切报文角色和范围;本页未运行自然案例。

72 - 2201F — invalid_argument_for_power_function

PostgreSQL SQLSTATE 2201F 的来源与诊断参考。

2201F

速览

幂函数会拒绝实数结果未定义的操作数。固定 numeric 路径报告 zero raised to a negative power is undefineda negative number raised to a non-integer power yields a complex result

字段
SQLSTATE 2201F
条件名 invalid_argument_for_power_function
状态 有效
已知存在于 8.0.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_ARGUMENT_FOR_POWER_FUNCTION
别名

含义

2201F 覆盖两个不同的幂运算守卫:零底数配负指数,以及负底数配非整数指数。普通有限 numeric 路径和特殊值路径都存在相应检查。按 POSIX 规则,numeric 的 NaN 可能返回 NaN 或 1,若干无穷组合也有定义结果;负底数配整数指数并不自动触发本码。

诊断

检查解析后的底数、指数类型和首要报文。非整数小数指数与负整数指数不是同一种情况,改小数位数或无关 cast 不能修复定义域。特殊值要单独判断,不要把所有 NaN 或无穷值都当成无效幂运算。

处理

选择具有预期实数结果的底数/指数,或明确改变业务规则。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交客户端可直接重试修正后的操作。

版本

锁定目录从 8.0.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2201E22003

来源

有限值和特殊值守卫位于 src/backend/utils/adt/numeric.c#L4045-4111#L4208-4220;负底数非整数守卫在 #L11373-11384。结构化证据记录保留确切报文角色;本页未运行自然案例。

73 - 2201G — invalid_argument_for_width_bucket_function

PostgreSQL SQLSTATE 2201G 的来源与诊断参考。

2201G

速览

width_bucket 会校验 bucket 数、NaN 输入、直方图边界和边界相等情况。固定 numeric 与 float8 路径分别报告 count 非正、NaN、边界非有限和上下界相等这四类 2201G 报文。

字段
SQLSTATE 2201G
条件名 invalid_argument_for_width_bucket_function
状态 有效
已知存在于 8.0.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_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION
别名

代表性报文

固定守卫使用以下首要文本:

守卫 首要文本
非正 count count must be greater than zero
operand 或边界含 NaN operand, lower bound, and upper bound cannot be NaN
边界非有限 lower and upper bounds must be finite
边界相等 lower bound cannot equal upper bound

含义

对于 numeric 和 float8 的 width_bucket(operand, bound1, bound2, count) 签名,count 必须大于零;operand 或任一边界不能是 NaN;两个边界都必须有限且不能相等。实现同时支持递增和递减边界,operand 为无穷值也允许,只有无穷边界被拒绝。合法端点计算若使 count + 1 溢出,源码报告的是另一个 22003。

诊断

按函数签名和确切首要报文定位参数。区分 count、NaN 与无穷值,并区分 operand 和两个边界。不要强行要求下界小于上界:递减边界有独立的合法计算路径;只有相等边界是本码明确拒绝的排序关系。

处理

在保留预期桶方向的前提下修正指定的 count、operand 或边界。使用正 count、有限且不相等的边界;若结果超出范围,应按独立的 22003 处理。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的调用。

版本

锁定目录从 8.0.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2200322012

来源

完整代表守卫位于 src/backend/utils/adt/numeric.c#L1959-2045src/backend/utils/adt/float.c#L4060-4180。结构化证据记录保留四个首要模板与源码范围;本页未运行自然案例。

74 - 2201W — invalid_row_count_in_limit_clause

PostgreSQL SQLSTATE 2201W 的来源与诊断参考。

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。未声称本页有自然运行观察。

2201X22012

来源

执行器对 NULL/零值/负值的处理在 src/backend/executor/nodeLimit.c#L347-405;字面 WITH TIES NULL 守卫在 src/backend/parser/parse_clause.c#L1890-1907。结构化证据记录保留两种首要角色;本页未运行自然案例。

75 - 2201X — invalid_row_count_in_result_offset_clause

PostgreSQL SQLSTATE 2201X 的来源与诊断参考。

2201X

速览

OFFSET 表达式求值后为负数。固定执行器路径报告 OFFSET must not be negative

字段
SQLSTATE 2201X
条件名 invalid_row_count_in_result_offset_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_RESULT_OFFSET_CLAUSE
别名

含义

LIMIT 节点重算时,NULL OFFSET 被解释为零(无偏移),零值合法,只有求得负值才进入 2201X。这是 2201W 的 OFFSET 专属姊妹码;LIMIT 或 FETCH 行数错误应按自己的 SQLSTATE 诊断。

诊断

在参数替换和类型解析后检查 OFFSET 的实际值。区分 NULL/无偏移、零值和负值,不要把 LIMIT 或 FETCH 行数失败改称 2201X。

处理

提供非负 OFFSET;若目标是无偏移,也可使用 NULL。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的语句。

版本

锁定目录从 8.4.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2201W22003

来源

执行器将 NULL 转为零并检查负值的守卫在 src/backend/executor/nodeLimit.c#L356-375。结构化证据记录保留确切首要模板和源码边界;本页未运行自然案例。

76 - 22021 — character_not_in_repertoire

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

22021

速览

源字节序列对于正在检查的编码无效。固定转换路径报告 invalid byte sequence for encoding "%s": %s,并以十六进制列出违规字节。

字段
SQLSTATE 22021
条件名 character_not_in_repertoire
状态 有效
已知存在于 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_CHARACTER_NOT_IN_REPERTOIRE
别名

含义

report_invalid_encoding 计算不完整或无效多字节序列的长度,使用源编码名和十六进制字节发出 22021。有效的源字符若在目标编码中没有等价表示,则走独立的 22P05 untranslatable-character 路径;这不表示源字节本身损坏。

诊断

在改动前记录源/目标编码、客户端/数据库设置以及原始字节。无效源字节指向输入或边界解码问题;可读但不可表示的字符指向目标编码的字符表示范围。不要把 SQL_ASCII 当作无条件修复:接受任意字节可能只是推迟或隐藏编码边界缺陷。

处理

修复生产端或编码边界,或在保留违规字节的前提下按明确的丢弃/拒绝策略显式转换。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的输入。

版本

锁定目录从 7.4 起记录该条件;本页固定转换路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

22P0522018

来源

无效字节报告器在 src/backend/utils/mb/mbutils.c#L1818-1853;同一固定文件的 report_untranslatable_char 路径对有效但不可表示字符发出独立 22P05。结构化证据记录保留两条边界;本页未运行自然案例。

77 - 22022 — indicator_overflow

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

22022

速览

目录条件名表示指示变量无法容纳接口结果。有限的 PostgreSQL 18.6 源码审阅确认了定义,但没有绑定到原生发出该报文的 report group。

字段
SQLSTATE 22022
条件名 indicator_overflow
状态 有效
已知存在于 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_INDICATOR_OVERFLOW
别名

含义

22022 是接口层的 indicator overflow 条件,但本次固定源码范围没有确定哪个客户端或 API 发出它。不能仅凭条件名虚构 ECPG、普通 SQL cast 或服务器列路径。

诊断

结合完整诊断和所属接口,确认指示变量类型、存储宽度和值域。由于没有确认的 emitter,本页不能给出首要报文、严重性行为、事务影响或统一的服务器端修复。

处理

检查实际接口约束,使用能够容纳返回值的指示变量表示,并遵循该接口的恢复方式。将本页视为有界未知源码覆盖,不要直接套用一般数值溢出修复。

版本

锁定目录从 7.4 起记录该条件;当前只确认 PostgreSQL 18.6 的定义和有限源码范围。未声称本页有自然运行观察。

2200322010

来源

固定目录定义记录在结构化证据记录中。有限扫描有意保留原生 emitter、首要文本、严重性和事务行为未知;本页未运行自然案例。

78 - 22023 — invalid_parameter_value

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

22023

速览

当点名的参数、选项、描述符或函数参数超出所属实现的值域时会使用本码。固定代表包括内置 GUC 解析、amcheck 描述符/选项、postgres_fdw 选项校验和正则选项检查;首要报文会指出归属和数值。

字段
SQLSTATE 22023
条件名 invalid_parameter_value
状态 有效
已知存在于 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_INVALID_PARAMETER_VALUE
别名

保留的 PostgreSQL 18.6 与 10.21 观察使用同一自动提交案例:SET work_mem = 'not-a-memory-size' 返回 SQLSTATE 22023invalid value for parameter "work_mem": "not-a-memory-size"SET work_mem = '1MB' 修复,SHOW work_mem 返回 1MB。两个后端在错误和修复后均为 IDLE。该案例只绑定内置 GUC 路径,不代表所有 22023 归属;见公共 case JSON

SET work_mem = 'not-a-memory-size';
SET work_mem = '1MB';
SHOW work_mem;

代表性报文

这些示例共用 22023,但属于不同归属:

归属/路径 代表性首要文本
内置 GUC 解析/检查 parameter "%s" requires a Boolean valueinvalid value for parameter "%s": "%s"
verify_heapam relation cannot be nullinvalid skip option — HINT:Valid skip options are "all-visible", "all-frozen", and "none".
postgres_fdw invalid value for floating point option "%s": %sinvalid value for integer option "%s": %s
正则选项解析器 invalid regular expression option: "%.*s"

含义

22023 是多个参数校验机制共用的代码,实际机制取决于报文指出的归属。内置 GUC 先把 Boolean、整数、实数、字符串或 enum 转换,检查整数/实数范围和 B/MB 或时间单位,再调用参数专属 check hook;设置上下文和权限是独立约束。verify_heapam 则检查必填非 NULL 描述符和枚举式 skip 值,postgres_fdw 解析数值/字符串选项与正值边界,regexp 函数校验 option 字母或函数参数。这些组共享 SQLSTATE,却不共享一个通用值域。

诊断

先按首要报文定位命令、函数或扩展。对于 GUC,检查参数类型、允许单位/范围以及当前设置上下文;对于扩展或函数,按其自身选项和边界处理。上面的 work_mem 只证明错误 GUC 值与带单位修复值的一条路径,不能用来推断 amcheck、postgres_fdw、regexp 或其他参数的修复。

处理

按所属参数的文档值域修正值,必要时同时修正单位和设置上下文。显式事务中的语句级 ERROR 后,必须 ROLLBACK 或 ROLLBACK TO SAVEPOINT 才能继续;自动提交客户端可重试修正后的动作。保留的自动提交案例中,同一后端在错误和修复后保持 IDLE。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。保留的观察覆盖 PostgreSQL 18.6 与 10.21 上述 work_mem 案例。

2200322025

来源

内置 GUC 转换/范围/check-hook 路径见 src/backend/utils/misc/guc.c#L3129-3320#L6804-6990;单位表见 #L87-181,设置上下文处理见 #L3342-3430,另见 contrib/amcheck/verify_heapam.c#L271-303contrib/postgres_fdw/option.c#L149-185src/backend/utils/adt/regexp.c#L443-446。结构化证据记录保留确切报文、运行摘要和各归属边界。

79 - 22024 — unterminated_c_string

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

22024

速览

目录条件名表示 C 风格字符串在所需终止符之前结束。有限的 PostgreSQL 18.6 源码审阅确认了定义,但没有绑定到原生发出该报文的 report group。

字段
SQLSTATE 22024
条件名 unterminated_c_string
状态 有效
已知存在于 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_UNTERMINATED_C_STRING
别名

含义

22024 描述接口/解析器层的 C 风格字符串或转义序列缺少终止符,但本次固定源码范围没有确定 PostgreSQL 哪个组件发出它。不能单凭条件名指定 SQL 文本、ECPG、客户端、首要报文或恢复路径。

诊断

结合完整诊断定位实际解析器或接口,检查引号或转义 token 应在哪里结束并保留原始输入。不要把客户端截断或任意 SQL 引号问题直接归入 22024。

处理

在所属解析器边界结束或重新编码字符串,并遵循该层的恢复方式。由于有限审阅没有解析出 emitter,本页不推断事务和严重性行为。

版本

锁定目录从 7.4 起记录该条件;当前只确认 PostgreSQL 18.6 的定义和有限源码范围。未声称本页有自然运行观察。

2202522019

来源

固定目录定义记录在结构化证据记录中。有限扫描有意保留原生 emitter、首要文本、严重性和事务行为未知;本页未运行自然案例。

80 - 22025 — invalid_escape_sequence

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

22025

速览

转义序列对具体消费方无效。固定路径区分 LIKE 的 ESCAPE 参数既非空也非单字符、LIKE pattern 以转义字符结束、正则翻译器的转义参数长度规则,以及格式错误的 \u/\U Unicode 转义。

字段
SQLSTATE 22025
条件名 invalid_escape_sequence
状态 有效
已知存在于 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_INVALID_ESCAPE_SEQUENCE
别名

代表性报文

代表性消费方使用以下首要文本和提示:

消费方/守卫 首要文本和提示
LIKE 或 SQL 正则翻译的转义长度 invalid escape string;HINT:Escape string must be empty or one character.
LIKE pattern 以转义符结尾 LIKE pattern must not end with escape character
扫描器发现格式错误的 Unicode 转义 invalid Unicode escape;HINT:Unicode escapes must be \uXXXX or \UXXXXXXXX.

含义

22025 由消费方自己的转义守卫发出。LIKE 要求 ESCAPE 字符串为空或一个字符,并拒绝以转义字符结尾的 pattern;SQL 正则翻译辅助函数对其转义参数也使用空字符串或单字符规则;核心扫描器对格式错误的 Unicode 转义给出 \uXXXX/\UXXXXXXXX 提示。这些情况不同于 22019 的转义字符语义和 2200C 的 SIMILAR 分隔符溢出;regexp_replace 的 option 或 start/occurrence 参数错误则是 22023 参数校验路径。

诊断

先确认消费方再修改反斜杠:LIKE ESCAPE 参数、LIKE pattern、SQL 正则翻译,还是扩展字符串字面量的 Unicode 扫描。检查转义值是否为空字符串或单字符、LIKE pattern 是否以转义符结尾,以及 Unicode 转义是否具备所需 \u/\U 长度。不要把所有正则替换或 SIMILAR 语法错误都叫作 22025,应以实际 SQLSTATE 和首要报文分类。

处理

按消费方要求提供转义字符串和 pattern,并保留有意使用的空字符串,不要将其理解为 SQL NULL。Unicode 语法错误应按扫描器要求使用 \uXXXX\UXXXXXXXX。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的语句。

版本

锁定目录从 7.4 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

220192200C22023

来源

LIKE 守卫在 src/backend/utils/adt/like_match.c#L159-165#L439-449;SQL 正则翻译的转义长度守卫见 src/backend/utils/adt/regexp.c#L793-805;格式错误的 Unicode 转义在 src/backend/parser/scan.l#L697-704。结构化证据记录保留确切首要报文、提示和消费方边界;本页未运行自然案例。

81 - 22026 — string_data_length_mismatch

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

22026

速览

位串值与声明长度不匹配。固定 varbit.c 路径报告 bit string length %d does not match type bit(%d);位运算操作数有单独的长度不匹配报文。

字段
SQLSTATE 22026
条件名 string_data_length_mismatch
状态 有效
已知存在于 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_STRING_DATA_LENGTH_MISMATCH
别名

报文

固定守卫使用以下首要文本:

守卫 首要文本
bit(n) 长度不匹配 bit string length %d does not match type bit(%d)
bit_and 操作数 cannot AND bit strings of different sizes
bit_or 操作数 cannot OR bit strings of different sizes
bitxor 操作数 cannot XOR bit strings of different sizes

含义

22026 覆盖精确长度的 bit(n) 边界和位运算。固定 bit() 输入路径将实际位长与声明的 bit(n) 长度比较;隐式转换会报告 bit string length %d does not match type bit(%d),显式 bit(n) 转换则会截断或补零。varbit(n) 使用不同约束:隐式值过长时使用 22001,显式转换会截断到最大长度。ANDORXOR 函数另行比较两个操作数的长度,长度不同时使用 22026。

诊断

先判断首要报文指出的是 bit(n) typmod 还是位运算符。对于 typmod 报文,比较源位长和目标精确长度,并确认边界是隐式赋值/转换还是明确要求的显式转换。varbit(n) 过长应寻找 22001;位运算报文则检查两个操作数。字符宽度和编码失败属于其他 SQLSTATE 路径。

处理

使隐式 bit(n) 值恰好达到声明长度。只有在确实需要截断或补零时才使用显式转换;位运算需要同长时,先调整两个操作数。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 7.4 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2200122021

来源

精确长度守卫在 src/backend/utils/adt/varbit.c#L354-357bit(n)varbit(n) 的隐式/显式转换见 #L385-414#L736-765。位运算尺寸守卫见 #L1257-1343。结构化证据记录保留报文角色与范围;本页未运行自然案例。

82 - 22027 — trim_error

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

22027

速览

trim 操作拒绝了参数或 trim 规范。定向扫描没有解析出固定 PostgreSQL 18.6 的原生发出路径。

字段
SQLSTATE 22027
条件名 trim_error
状态 有效
已知存在于 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_TRIM_ERROR
别名

含义

锁定定义将 22027 命名为 trim_error,但对 PostgreSQL 18.6 的定向源码审阅没有解析出该码的原生发出路径。因此本页只确认条件身份和诊断边界,不指定某个 SQL trim 函数、空白规则或首要报文。

诊断

如果部署报告 22027,应连同完整首要报文、DETAIL、HINT 以及调用的函数或扩展一起保留。仅凭条件名无法判断被拒绝的是源字符串、trim 字符集、方向还是消费方选项;不要据此猜测空白规则。

处理

依据实际发出方的诊断修正 trim 输入或操作。如果来源是扩展或特定版本路径,应查阅该实现的参数要求。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 7.4 起记录该条件;本页仅固定 PostgreSQL 18.6 的定义行,未声称有原生发出路径或自然运行观察。

2202622025

来源

固定定义行见 src/backend/utils/errcodes.txt#L202。定向源码审阅没有解析出原生 22027 发出路径;结构化证据记录明确保留这一未知范围,本页未运行自然案例。

83 - 2202E — array_subscript_error(数组下标错误)

PostgreSQL 使用 SQLSTATE 2202E 表示数组下标或形状错误。应区分越界读取返回 NULL 的情况,以及会校验数组维度的赋值、切片、构造和拼接路径。

速览

2202E 是类别 22 Data Exception 中的 array_subscript_error 条件。目录同时保留 ERRCODE_ARRAY_ELEMENT_ERROR 这一兼容别名,并使用 ERRCODE_ARRAY_SUBSCRIPT_ERROR 作为带条件名的宏。两个宏编码的是同一个 SQLSTATE。

不要把所有看起来越界的表达式都当成错误。PostgreSQL 文档明确说明,读取当前边界之外的数组下标会返回 NULL;提供错误数量的下标同样返回 NULL。数组切片还有独立的历史规则:完全位于边界外的切片可以产生空的零维数组,部分重叠的切片则缩减为重叠部分。

当其他路径校验形状或下标并拒绝它时才会抛出 2202E。核心源码中的这类路径包括数组拼接或构造时维度不兼容、无效切片边界,以及部分带下标赋值检查。诊断时,操作本身和下标数值同样重要。

可执行的代表性案例是 incompatible_array_dimensions。它在 PostgreSQL 18.6 和 10.21 上均通过:不兼容的拼接抛出 2202E,随后同一自动提交连接保持 IDLE,并成功执行有效的后续拼接。下面的 SQL 摘录是共享注册表中的完整有序语句对;测试执行器仍是建表和清理的唯一来源。

字段
SQLSTATE 2202E
条件名 array_subscript_error
状态 有效
已知存在于 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_ARRAY_ELEMENT_ERROR, ERRCODE_ARRAY_SUBSCRIPT_ERROR
别名 ERRCODE_ARRAY_ELEMENT_ERROR

含义与触发路径

18.6 目录中的定义是类别 22 下的 2202E E ERRCODE_ARRAY_SUBSCRIPT_ERROR array_subscript_error。前面的别名行是 2202E E ERRCODE_ARRAY_ELEMENT_ERROR;源码注释解释 SQL99 的 “array element error” 实际上就是数组下标错误。因此,仍使用别名的代码指向同一 SQLSTATE,而不是另一种条件。

数组具有秩、每个维度的长度以及下界。PostgreSQL 不要求数组从 1 开始,所以诊断时应读取实际下界,而不是作这个假设。文档中的 array_ndimsarray_dimsarray_lowerarray_uppercardinality 函数可以查看所需的元数据。需要诊断错误时,应在同一会话中实际调用这些检查函数;它们是检查工具,不代表已经触发了某个特定错误。

核心路径主要包括:

  1. 数组元素或切片赋值。 arrayfuncs.c 会校验下标和切片边界。一维数组可以通过给新元素赋值来扩展,中间位置填入 NULL;多维数组不支持这种扩展。给空数组赋切片时必须提供两个边界。因此,赋值访问当前读取边界之外的位置时,应按赋值操作分析,不能从 SELECT a[n] 的结果推断。
  2. 数组拼接。 当同秩数组的非拼接维度的长度或下界不同时,array_cat 抛出 2202E。代表性案例覆盖的就是这条路径。
  3. 多维构造。 表达式执行器在用于构造多维数组的非空数组表达式维度不兼容时,也会抛出同一条件。

源码中还存在其他调用方,包括数据类型辅助路径。类别 22 是宽泛的数据异常类别;具体是哪个形状或下标契约失败,要由 2202E 条目、源码函数和报文共同确定。

报文与诊断

可执行摘录如下:

SELECT ARRAY[[1,2]] || ARRAY[[3]];
SELECT ARRAY[1,2] || ARRAY[3,4];

第一条语句的两个二维数组内层维度不同。PostgreSQL 18.6 报告:

SQLSTATE: 2202E
severity: ERROR
message_primary: cannot concatenate incompatible arrays
message_detail: Arrays with differing element dimensions are not compatible for concatenation.
source: array_userfuncs.c / array_cat / line 450

PostgreSQL 10.21 的同一案例给出相同的主报文和详细信息文本,历史源码行号是 356。第二条语句返回 {1,2,3,4}。这些报文和详细信息属于拼接路径,不是所有 2202E 调用方都必然使用的措辞。

其他源码确认的模板包括 array subscript out of rangearray slice subscript must provide both boundaries(详细信息会解释给空数组赋值的要求),以及 upper bound cannot be less than lower bound。如果驱动程序提供这些字段,请保留 message_detailmessage_hintsource_filesource_functionsource_line;它们往往能区分切片校验与拼接校验。

诊断

先按表达式分类:

  • 普通元素读取如 a[999] 可以合法返回 NULL。在称为服务器错误前,检查数组本身、下标表达式以及存储的边界。
  • 切片读取根据文档规则可能返回 NULL、空的零维数组或缩减后的重叠部分。没有错误响应时不要把这些值映射成 2202E
  • 赋值、数组构造和拼接会执行校验代码。记录数组秩、维度、下界、提供的下标数量,以及语句是否在修改值。

遇到真实错误时,记录 SQLSTATE、严重级别、主报文、详细信息、提示、语句位置以及关系对象或函数上下文。使用同一个值或源表达式配合 array_ndimsarray_dimsarray_lowerarray_upper 对照。拼接时比较每一个非拼接维度和下界;切片时检查两个边界及其顺序;构造时检查每个子数组的形状。

在 PL/pgSQL 中,处理器可以捕获 array_subscript_errorSQLSTATE '2202E',但处理器的事务行为取决于代码块。带 EXCEPTION 子句的代码块会让受保护主体在子事务中运行;主体出错后,主体内对持久数据库状态的修改会先回滚,再运行处理器。OTHERS 也有文档规定的排除项,应用要修复数组操作时应使用具体条件。

处理

修复违反形状契约的操作。拼接前统一维度和下界;提供完整且顺序正确的切片边界;只有在确实需要 NULL 填充语义时才使用一维扩展;或者使用形状匹配的子数组重新构造多维值。如果读取返回 NULL 是合法结果,应先按值处理,不要在判断应用是否需要区分“缺少元素”和“存储的 NULL 元素”前就用 COALESCE 掩盖它。

代表性错误在自动提交下运行。失败后连接状态为 IDLE,有效拼接成功。在显式事务中,ERROR 通常会让事务进入中止状态,直到 ROLLBACK 或回滚到保存点;连接本身不一定需要关闭。带异常子句的 PL/pgSQL 代码块可以让受保护主体在子事务中封装失败,主体内的修改会在处理器运行前回滚。应读取客户端的实际事务状态,不要仅凭 2202E 推断连接结局。

版本

目录记录 2202E 存在于锁定的 7.4–8.4.22 pre-9.0 正式源码、9.0.23 至 18.6 的全部正式快照及 19 Beta 3 预览快照。同 tag 的 REL8_1_4 errcodes.sgml 表已经列出 2202E 和条件名 array_subscript_error,因此至少可以确认 8.1.4 已有该条件名。7.0–7.3 仍有候选源码缺口,因此 7.4 观察结果只是存在边界,不是精确引入版本。18.6 固定源码 commit 为 724edf9bde9d356724ad384a2e196edc3c9f80f7;其 errcodes.txt 同时保留别名宏和带条件名的宏。

不兼容维度案例在 PostgreSQL 18.6 和 10.21 上均通过,主报文和详细信息文本相同而源码行号不同。这个跨版本结果不保证所有旧小版本或其他 2202E 调用路径的措辞都不变。

22000data_exception 是宽泛的类别 22 代码。22005error_in_assignment 是不同的赋值条件,不应替代数组专用的 2202E22P02invalid_text_representation 处理输入文本解析。2202E 也不同于成功的越界读取,后者按数组文档规则返回 NULL

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留共享注册表、两个目标版本和 2202E-snippet-registry-final-20260909 运行 ID。

84 - 2202G — invalid_tablesample_repeat

PostgreSQL SQLSTATE 2202G 的来源与诊断参考。

2202G

速览

TABLESAMPLE 的 REPEATABLE seed 为 NULL 时无效。固定执行器路径报告 TABLESAMPLE REPEATABLE parameter cannot be null

字段
SQLSTATE 2202G
条件名 invalid_tablesample_repeat
状态 有效
已知存在于 9.5.0
锁定快照 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_TABLESAMPLE_REPEAT
别名

报文

执行器守卫使用以下首要文本:

守卫 首要文本
REPEATABLE 表达式为 NULL TABLESAMPLE REPEATABLE parameter cannot be null

含义

tablesample_init 中,PostgreSQL 先求值每个 TABLESAMPLE 方法参数;参数为 NULL 时报告 2202H。随后它单独求值可选的 REPEATABLE 表达式;结果为 NULL 时进入 2202G。非 NULL 的 REPEATABLE 值已由解析器转换为 float8,再用 hashfloat8 生成采样 seed。因此本码覆盖重复采样 seed 为 NULL 的约束,不覆盖负 seed 或方法百分比范围。

诊断

检查 REPEATABLE 表达式的实际求值结果,包括可能变成 SQL NULL 的参数或函数。区分 TABLESAMPLE 方法参数为 NULL 的 2202H,以及非 NULL 但百分比、数量或时间无效且由选定方法校验的情况。首要报文可以确认是重复 seed 分支。

处理

REPEATABLE 提供非 NULL 表达式;如果不需要确定性重复,也可以省略该子句。若方法参数触发 2202H,应单独修正该参数。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的语句。

版本

锁定目录从 9.5.0 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2202H22004

来源

执行器在 src/backend/executor/nodeSamplescan.c#L232-267 中先求值方法参数,再求值可选的 repeat 表达式。结构化证据记录保留 2202G 守卫及其与 2202H 的边界;本页未运行自然案例。

85 - 2202H — invalid_tablesample_argument

PostgreSQL SQLSTATE 2202H 的来源与诊断参考。

2202H

速览

TABLESAMPLE 方法收到无效参数。固定核心和 contrib 方法会以方法专属报文拒绝越界百分比或负样本数量。

字段
SQLSTATE 2202H
条件名 invalid_tablesample_argument
状态 有效
已知存在于 9.5.0
锁定快照 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_TABLESAMPLE_ARGUMENT
别名

报文

固定执行器和采样方法使用以下首要文本:

归属/守卫 首要文本
方法参数为 NULL TABLESAMPLE parameter cannot be null
Bernoulli/system 百分比(包括 NaN) sample percentage must be between 0 and 100
system_rows 数量为负 sample size must not be negative
system_time 时间为负或 NaN sample collection time must not be negative

含义

2202H 是方法参数代码,不是一个适用于所有 TABLESAMPLE 的统一范围。执行器在调用方法前拒绝 NULL 方法参数。核心 Bernoulli 和 system 方法接受包含端点的 0 到 100 百分比,并拒绝 NaN。system_rows contrib 方法只拒绝负的请求行数,因此零是允许的;system_time 拒绝负值或 NaN 的采样时间,因此零是允许的;该 guard 没有设置有限的上界,正 Infinity 不会被这个比较本身拒绝。REPEATABLE NULL 属于独立的 2202G 分支,其他采样扩展也可能有自己的参数守卫。

诊断

先定位采样方法和参数位置,再修改值。方法参数为 NULL 指向执行器守卫;0 到 100 之外或 NaN 的 Bernoulli/system 百分比指向核心方法;负的 system_rows 数量以及负或 NaN 的 system_time 属于 contrib 方法;该 guard 本身不会把正 Infinity 分类为错误。结合首要报文区分这些情况和 NULL REPEATABLE seed(2202G)。

处理

按所选方法使用非 NULL 参数、包含端点的有限 0 到 100 百分比、非负行数或通过其负值/NaN guard 的 system_time 值。不要通过修改方法百分比来修复 2202G 的重复 seed 错误。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的语句。

版本

锁定目录从 9.5.0 起记录该条件;本页固定核心及 contrib 源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2202G22023

来源

执行器 NULL 守卫见 src/backend/executor/nodeSamplescan.c#L232-245。核心百分比守卫见 src/backend/access/tablesample/bernoulli.c#L137-149src/backend/access/tablesample/system.c#L140-152。contrib 范围见 contrib/tsm_system_rows/tsm_system_rows.c#L178-187contrib/tsm_system_time/tsm_system_time.c#L193-203。结构化证据记录保留方法专属报文和范围;本页未运行自然案例。

86 - 22030 — duplicate_json_object_key_value

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

22030

速览

构造 JSON 对象时遇到重复键。固定的 JSON 唯一键构造器和聚合路径报告 duplicate JSON object key value: %s;JSONB 对象收尾有相关变体。

字段
SQLSTATE 22030
条件名 duplicate_json_object_key_value
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE
别名

报文

唯一键路径使用以下首要文本:

路径 首要文本
启用唯一键的 JSON 构造器或聚合 duplicate JSON object key value: %s
JSONB 对象收尾或唯一键校验 duplicate JSON object key value

含义

当 JSON 对象操作明确启用键唯一性,并在同一对象中再次遇到同名键时,会报告 22030。JSON 构造器和对象聚合携带 unique_keys 标志;唯一键变体记录已见键,并在插入或对象收尾时报告错误。普通 json/jsonb 输入将该标志设为 false,普通构造器或聚合也不会把输入文本中的每个重复键都变成 22030。strict 或 absent-on-null 变体会从输出中省略 NULL 值,但唯一键变体仍会保留键并检查唯一性,因此即使值将被跳过,重复键仍可能失败。对象键本身为 NULL 属于独立的参数错误。

诊断

确认构造器或聚合,以及其文档规定的形式是否强制唯一键。JSON 构造器/聚合路径的 %s 报文会给出重复键;JSONB 收尾和校验路径使用较短的首要文本。区分重复键策略、无效 JSON 语法、NULL 对象键,以及按普通语义允许重复输入的 json/jsonb 解析。

处理

按所属实现的重复键策略处理:需要唯一性时在上游去重或汇总;只有在确实要保留重复键语义时,才使用文档规定的非唯一操作。不要通过修改唯一键标志来解决 NULL 键或格式错误的 JSON。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;本页固定 JSON 和 JSONB 源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2203222023

来源

JSON 唯一键构造器和聚合见 src/backend/utils/adt/json.c#L1002-1127#L1224-1295;JSON 唯一性校验见 #L1810-1853。JSONB 普通输入在 src/backend/utils/adt/jsonb.c#L74-102 中关闭唯一性;唯一键构造和对象收尾见 #L1125-1163src/backend/utils/adt/jsonb_util.c#L1952-2005。结构化证据记录保留唯一键和 NULL 跳过边界;本页未运行自然案例。

87 - 22031 — invalid_argument_for_sql_json_datetime_function

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

22031

速览

SQL/JSON datetime 方法收到无效类型、精度或格式。固定 jsonpath 执行路径报告无法识别的格式,并提示使用 datetime 模板参数。

字段
SQLSTATE 22031
条件名 invalid_argument_for_sql_json_datetime_function
状态 有效
已知存在于 13.0
锁定快照 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION
别名

报文

日期时间方法守卫使用以下首要文本:

守卫 首要文本和提示
输入项不是字符串 jsonpath item method .%s() can only be applied to a string
.datetime() 未识别格式 %s format is not recognized: "%s";HINT:Use a datetime template argument to specify the input data format.
精度超出整数范围 time precision of jsonpath item method .%s() is out of range for type integer
调整后的精度无效 time precision of jsonpath item method .%s() is invalid

含义

固定的 executeDateTimeMethod 路径首先要求输入是标量字符串。.datetime(template) 将显式模板交给 parse_datetime:当 jspThrowErrors(cxt) 为 false 时,ErrorSaveContext 会把解析失败转成 jperError;允许抛错时不传入保存上下文,解析器可能直接抛出底层错误。没有模板的 .datetime().date().time().time_tz().timestamp().timestamp_tz() 路径会按列出的 ISO 格式循环尝试,即使在抛错执行中也会把每个候选格式的失败软保存;所有候选都失败后,最终 22031 的 RETURN_ERROR 分支才决定抛错还是返回 jperError。可选时间精度先转换为整数并检查,再进行调整。格式无法识别、转换不兼容、输入不是字符串或精度无效时使用 22031。

诊断

记录方法名、输入 JSON 项类型、日期时间文本、模板文本(如有)和精度参数。.datetime() 没有匹配格式时会提示提供模板;其他方法使用固定 ISO 候选格式,不提供该模板提示。分开判断标量类型不符、格式错误以及精度范围/调整错误。lax 控制结构上的自动包装/解包和结构错误处理,并不会普遍抑制日期时间解析或转换错误;应结合执行器的 throwErrors/RETURN_ERROR 路径,以及 jsonb_path_* 函数的 silent 参数或 SQL/JSON 的 ON ERROR 子句,判断保存的解析错误是被返回还是抛出。

处理

向方法传入字符串项;对 .datetime() 使用与日期时间文本匹配的模板,或选择与输入相符的 ISO 类型方法。保持精度符合整数和日期时间 typmod 规则。如果应用有意使用非 ERROR 的 ON ERROR 行为处理解析失败,应按应用要求保留或修正该行为;否则修正输入或模板。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的表达式。

版本

锁定目录从 13.0 起记录该条件;本页固定 SQL/JSON 日期时间源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2200722018

来源

日期时间方法实现见 src/backend/utils/adt/jsonpath_exec.c#L2326-2780,涵盖字符串/类型检查、显式模板和 ISO 候选解析、ErrorSaveContext、类型转换及精度守卫。strict/lax/throw 区分见 #L235-249#L654-727。结构化证据记录保留确切首要文本和提示角色;本页未运行自然案例。

88 - 22032 — invalid_json_text

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

22032

速览

消费方收到的 JSON 文本无效。有限扫描没有解析出固定 18.6 发出该码的 report group。

字段
SQLSTATE 22032
条件名 invalid_json_text
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_INVALID_JSON_TEXT
别名

含义

锁定定义将 22032 命名为 invalid_json_text,但对 PostgreSQL 18.6 的定向源码审阅没有解析出该码的原生发出 report group。因此本页不凭条件名指定解析函数、首要报文、DETAIL、HINT、严重性路径或 SQL/JSON 模式。

诊断

如果出现 22032,应保留完整诊断和消费操作,包括输入属于 jsonjsonb、SQL/JSON 还是扩展值。在该边界检查确切文本和编码,但不要用猜测的普通 cast 或客户端路径替代未知发出方。JSON 基数相关代码有各自固定守卫。

处理

依据实际发出方的首要报文、DETAIL 和 HINT 修复 JSON 文本或其边界。如果显式事务中的操作抛出 ERROR,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的输入。这是通用恢复指导,不是 22032 的运行观察。

版本

锁定目录从 12.0 起记录该条件;本页仅固定 PostgreSQL 18.6 的定义行,未声称有原生发出路径或自然运行观察。

2203022033

来源

固定定义行见 src/backend/utils/errcodes.txt#L217。定向源码审阅没有解析出原生 22032 发出路径;结构化证据记录明确保留这一未知范围,本页未运行自然案例。

89 - 22033 — invalid_sql_json_subscript

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

22033

速览

SQL/JSON 数组下标无效。固定 jsonpath 路径区分越界、非单一数值和整数范围变体。

字段
SQLSTATE 22033
条件名 invalid_sql_json_subscript
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_INVALID_SQL_JSON_SUBSCRIPT
别名

报文

固定下标守卫使用以下首要文本:

守卫 首要文本
下标不是单个数值项 jsonpath array subscript is not a single numeric value
数值下标超出 int32 jsonpath array subscript is out of integer range
strict 数组边界失败 jsonpath array subscript is out of bounds

含义

jsonpath 执行器把每个下标表达式求值为结果列表。getArrayIndex 要求结果恰好是一个数值标量,将其截断为整数;结果不是单个数值项或无法符合整数范围时报告 22033。随后数组边界守卫在 strict 模式下对负起点、反向范围或超过数组上界的终点报告同一码。lax 模式会忽略这种结构性越界错误,并把范围限制到现有数组;它不会把非数值或溢出的下标变成有效下标。

诊断

先检查下标表达式的基数和类型,再检查数组长度。表达式返回多个项、非数值或整数溢出时使用转换报文;数值下标或范围违反 strict 数组边界时使用越界报文。记录 path 是 strict 还是 lax,因为 lax 的结构处理可能产生空结果或被限制的结果,而不是 ERROR。后续 SQL/JSON 操作若选择对无项抛错,则属于 22035。

处理

使下标表达式返回整数范围内的单个有限数值,并在 strict 模式下保持目标数组边界内且范围不反向。如果有意使用 lax 的限制或空结果,应确认 path 模式和外层 SQL/JSON 行为确实表达了该意图。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的表达式。

版本

锁定目录从 12.0 起记录该条件;本页固定 jsonpath 源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2203422035

来源

数组边界处理见 src/backend/utils/adt/jsonpath_exec.c#L892-929。下标基数、截断和整数转换见 #L3442-3477。结构化证据记录保留三个 22033 守卫角色;本页未运行自然案例。

90 - 22034 — more_than_one_sql_json_item

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

22034

速览

操作要求单个 SQL/JSON 项却得到多个项。固定 JSON_QUERY/JSON_VALUE 路径报告必须是单项或单标量,并可能提示使用 WITH WRAPPER。

字段
SQLSTATE 22034
条件名 more_than_one_sql_json_item
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM
别名

报文

无 wrapper 的基数守卫使用以下首要文本:

操作 首要文本和提示
无 wrapper 的 JSON_QUERY JSON path expression for column "%s" must return single item when no wrapper is requested;HINT:Use the WITH WRAPPER clause to wrap SQL/JSON items into an array.
没有列名的 JSON_QUERY JSON path expression in JSON_QUERY must return single item when no wrapper is requested;HINT:Use the WITH WRAPPER clause to wrap SQL/JSON items into an array.
JSON_VALUE 返回多个项 JSON path expression in JSON_VALUE must return single scalar item

含义

固定的 JSON_QUERY 路径会收集完整 SQL/JSON 结果列表,并在应用 wrapper 模式前统计数量。没有 wrapper 时返回多个项会报告 22034;无条件或条件 WITH WRAPPER 会按模式把序列变成数组。JSON_VALUE 返回多个项时也使用本码,因为它要求单个标量。恰好一个非标量项属于独立的 2203F,零项则设置 empty 标志并交给 ON EMPTY 处理。lax 的自动展开可能改变结果基数;silent 或非 ERROR 的 ON ERROR 行为可能在基数守卫之前抑制求值错误。

诊断

记录操作类型(JSON_QUERYJSON_VALUE)、wrapper 子句、列名以及 path 产生的项数。JSON_QUERY 只有在确实需要数组结果时才使用 WITH WRAPPER;JSON_VALUE 应将 path 缩减为单个标量。区分多个项(22034)、单个非标量项(2203F)和由 ON EMPTY/22035 处理的无项结果。检查 strict/lax 和 silent 设置,因为它们会影响守卫看到的结果序列。

处理

修改 path 或过滤条件,使其返回所需的单个项;如果消费方需要数组,则加入文档规定的 wrapper。对 JSON_VALUE 还要确保该项是标量。如果操作使用 ON ERROR 行为,应使回退值符合预期基数,不要把 NULL 误当成 path 返回了单个项。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的表达式。

版本

锁定目录从 12.0 起记录该条件;本页固定 SQL/JSON 基数源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2203322035

来源

JSON_QUERY wrapper 和多项守卫见 src/backend/utils/adt/jsonpath_exec.c#L3880-4005。JSON_VALUE 的多项与标量区分见 #L4008-4070。结构化证据记录保留 wrapper、基数和提示角色;本页未运行自然案例。

91 - 22035 — no_sql_json_item

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

22035

速览

SQL/JSON path 没有找到请求的项。固定表达式执行路径报告 no SQL/JSON item found for specified path

字段
SQLSTATE 22035
条件名 no_sql_json_item
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_NO_SQL_JSON_ITEM
别名

报文

ERROR 行为使用以下首要文本:

上下文 首要文本
有名的 JSON_TABLE/SQL/JSON 列 no SQL/JSON item found for specified path of column "%s"
没有列名 no SQL/JSON item found for specified path

含义

JSON path 可以产生空结果而不立即抛错。JsonPathQueryJsonPathValue 会把零匹配标记为 empty;随后 SQL/JSON 表达式执行器应用 ON EMPTY,如果没有单独的 ON EMPTY 行为,也会使用非 ERROR 的 ON ERROR 行为。只有有效行为是 ERROR 时,执行器才报告 22035,并根据是否有列名选择对应首要文本。jsonb_path_query_first 等辅助函数可以直接把无匹配返回为 NULL,因此 22035 不是所有空 path 结果的统称。

诊断

记录操作、path、列名以及 ON EMPTY/ON ERROR 子句。区分预期的 NULL/默认回退和会进入 22035 的 ERROR 行为。strict 与 lax 的 path 求值以及 silent 模式可能改变结构问题是变成空结果还是被抑制的求值错误;多项结果和无效下标分别使用 22034 与 22033。

处理

如果必须找到项,修正 path、输入文档或列映射;如果无匹配是允许的,则使用文档规定的 ON EMPTY 行为,或使用明确把无匹配返回 NULL/空结果的辅助函数。不要用 wrapper 解决无项问题,wrapper 处理的是多项基数。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的表达式。

版本

锁定目录从 12.0 起记录该条件;本页固定 SQL/JSON 执行器路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

2203322034

来源

JSON path 辅助函数在 src/backend/utils/adt/jsonpath_exec.c#L3880-4070 中标记空结果。SQL/JSON 的 ON EMPTY/ON ERROR 处理及两个 22035 首要文本见 src/backend/executor/execExprInterp.c#L4940-5080。结构化证据记录保留空结果与行为边界;本页未运行自然案例。

92 - 22036 — non_numeric_sql_json_item

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

22036

速览

JSON 路径项方法收到的值不满足数值或转换约束。固定路径覆盖 .number().decimal().integer().bigint().double().boolean().abs().floor().ceiling(),以及 .string() 的相应类型检查。

字段
SQLSTATE 22036
条件名 non_numeric_sql_json_item
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_NON_NUMERIC_SQL_JSON_ITEM
别名

报文

固定 jsonpath 方法的代表性首要报文如下:

触发条件 首要报文
.abs().floor().ceiling() 收到非数值项 jsonpath item method .%s() can only be applied to a numeric value
转换方法收到的既不是字符串也不是数值项 jsonpath item method .%s() can only be applied to a string or numeric value
.boolean() 收到不支持的项 jsonpath item method .%s() can only be applied to a boolean, string, or numeric value
字符串或数值不能转换为目标类型 argument "%s" of jsonpath item method .%s() is invalid for type %s
数值转换得到 NaN 或 Infinity NaN or Infinity is not allowed for jsonpath item method .%s()
.string() 收到不支持的项 jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value

含义

jsonpath 执行器会按输入类型分派各项方法。.integer().bigint().double() 以及 .number()/.decimal() 处理字符串输入时,会使用目标输入例程或数值解析,并通过 ErrorSaveContext 或显式错误标志记录失败。已有数值项走各自分支:.number() 可直接保留数值,.integer().bigint() 使用 numeric_int4_opt_error/numeric_int8_opt_error.decimal() 再应用精度/小数位 typmod。.boolean() 直接接受布尔值,用 int4in 转换数值,用 parse_bool 解析字符串;.abs().floor().ceiling() 要求数值标量。数值和 double 路径拒绝 NaN 或 Infinity。.string() 的约束更宽,可接受布尔、字符串、数值或日期时间项;只有路径模式允许时才会解包数组。

诊断

查看首要报文中的方法名、项类型和值。区分字符串解析和已有数值项:.number() 可直接处理已有数值,.integer()/.bigint() 做数值范围检查,.decimal() 可能应用精度/小数位 typmod,.boolean() 有直接、数值和 parse_bool 分支。对象、数组或不支持的项属于类型问题。若方法拒绝非有限数值,应在调用前移除或拦截它。不要把 make_numeric_typmod_safe 的所有底层精度/小数位诊断都归为 22036,只保留已展示的 jsonpath 报错分支。不要把本码与一元算术操作数检查条件 2203B,或 JSON 路径日期时间方法 22031 混淆。

处理

修改路径以选中预期标量,在转换前规范化文档,或改用符合该值输入约束的方法。若源数据可能变化,应在调用方法前验证数值文本和有限性。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的转换和项方法路径来自 PostgreSQL 18.6。本页未声称有自然运行观察。

2203B2203122038

来源

数值项方法检查条件见 jsonpath_exec.c#L1129-1588.string() 类型约束见 #L1592-1647,只接受数值的方法见 #L2280-2310。strict/lax 与抛出/返回宏见 #L235-249。结构化证据记录绑定这些检查条件和报文;本页未运行自然案例。

93 - 22037 — non_unique_keys_in_a_json_object

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

22037

速览

锁定条件名表示 JSON 对象的键不唯一错误。对固定 PostgreSQL 18.6 的定向扫描没有解析出发出路径。

字段
SQLSTATE 22037
条件名 non_unique_keys_in_a_json_object
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT
别名

含义

定义将该条件命名为 non_unique_keys_in_a_json_object,但 PostgreSQL 18.6 的定向源码审阅没有解析出原生 22037 发出方。因此本页只记录条件身份和诊断边界,不指定 SQL/JSON 构造器、解析器、首要报文、DETAIL 或 HINT。

诊断

如果部署报告 22037,应连同完整首要报文、DETAIL、HINT、调用的 SQL/JSON 操作和版本一起保留,再据此判断是哪种对象及重复键策略发出了该条件。不要在没有实际诊断的情况下把它替换成相关的 22030 重复键构造路径。

处理

依据实际发出方的重复键策略处理:按该操作的文档规则规范化或拒绝重复键。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;本页仅固定 PostgreSQL 18.6 定义行,未声称有原生发出路径或自然运行观察。

22030220322203A

来源

固定定义行见 errcodes.txt#L222。定向源码审阅没有解析出原生 22037 发出路径;结构化证据记录明确保留这一未知范围,本页未运行自然案例。

94 - 22038 — singleton_sql_json_item_required

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

22038

速览

SQL/JSON 路径操作要求一个特定类型的单一结果,却收到了不同的基数或类型。固定路径覆盖单一布尔结果,以及 jsonpath 二元算术的左右两个数值操作数;SQL 函数和 @@ 操作符的 silent 默认行为不同。

字段
SQLSTATE 22038
条件名 singleton_sql_json_item_required
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED
别名

报文

代表性首要报文如下:

触发条件 首要报文
抛错模式下 jsonb_path_match 的结果不是单一布尔项 single boolean result is expected
二元算术左操作数不是一个数值项 left operand of jsonpath operator %s is not a single numeric value
二元算术右操作数不是一个数值项 right operand of jsonpath operator %s is not a single numeric value

含义

jsonb_path_match_internal 把恰好两个 C 参数识别为 @@ 操作符路径:jsonb_path_match_opr 保持 silent=true,所以结果不是单一布尔项时返回 NULL。SQL 函数声明为 jsonb_path_match(target, path, vars DEFAULT '{}', silent DEFAULT false);即使 SQL 调用只写两个参数,两个默认参数也会补齐,因此它是非 silent 的,除非调用者显式传入 silent=true,否则可能报告 22038。四参数调用遵循实际传入的 silent 值。单个 JSON null 会返回 SQL NULL。二元算术则分别计算左右操作数序列,两边都必须恰好包含一个数值项。共享执行器在 lax 模式下可能先解包数组,再进行单项检查。

诊断

先确认语法使用的是 @@ 操作符还是 jsonb_path_match 函数,并检查实际参数及默认参数展开,之后再解释 NULL 结果。路径产生多个值、match 结果不是布尔值,或左右项不是数值,都属于这个单项/类型边界。将其与 JSON_QUERY/JSON_VALUE 基数错误 22034、标量类型约束 2203F,以及数值项方法转换错误 22036 区分开。

处理

收窄路径或明确选取一个项。二元算术应确保左右操作数各自解析为一个数值项;如果确实需要抑制错误可使用 @@,如果希望不匹配仍报告 ERROR 则调用 jsonb_path_match(..., false);只有业务确实要返回 NULL 时才传入 silent=true。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的 match 和二元算术路径来自 PostgreSQL 18.6。本页未声称有自然运行观察。

220342203F22036

来源

match 包装器和单项检查见 jsonpath_exec.c#L453-491;二元算术单项检查见 #L2087-2155;共享的 strict/lax 与抛出/返回宏见 #L235-249。SQL 默认参数固定在 system_functions.sql#L539-544,函数和 @@ 实现签名见 pg_proc.dat#L10520-10522#L10547-10549,操作符绑定见 pg_operator.dat#L3262-3264。结构化证据记录保留两条路径和准确首要报文;本页未运行自然案例。

95 - 22039 — sql_json_array_not_found

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

22039

速览

只接受数组的 JSON 路径访问器或项方法在没有允许自动包装或结构错误抑制时收到了非数组项。固定的通配数组、索引数组和 .size() 路径分别有数组类型首要报文;越界下标属于 22033。

字段
SQLSTATE 22039
条件名 sql_json_array_not_found
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_ARRAY_NOT_FOUND
别名

报文

代表性首要报文如下:

触发条件 首要报文
通配数组访问器收到非数组 jsonpath wildcard array accessor can only be applied to an array
索引数组访问器收到非数组 jsonpath array accessor can only be applied to an array
.size() 在不允许自动包装时收到非数组 jsonpath item method .%s() can only be applied to an array

含义

jpiAnyArray 通配入口、jpiIndexArray 索引入口和 .size() 项方法入口,在 lax 模式启用 jspAutoWrap(cxt) 时都可以把非数组项自动包装。未允许自动包装时,jspIgnoreStructuralErrors 可以抑制结构不匹配;两者都不适用时,相应的只接受数组分支才报告 22039。有效数组却使用越界下标会进入独立的 22033 下标检查条件,因此 22039 不表示空数组或下标越界。

诊断

根据首要报文确认具体访问器或方法,并检查它前一步收到的项。区分标量/对象输入与有效数组的越界索引,同时确认 SQL/JSON 路径模式是否启用了 lax 结构错误处理或自动包装/解包。

处理

让路径选出数组、规范化输入形状,或改用适用于标量的操作。如果文档可能同时出现标量和数组,应显式处理这两种分支,不要依赖结构不匹配变成空结果。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的数组访问和 .size() 检查条件来自 PostgreSQL 18.6。本页未声称有自然运行观察。

2203C2203A22033

来源

通配、索引和自动包装检查见 jsonpath_exec.c#L836-979.size() 数组检查见 #L1101-1117。strict/lax 结构处理和抛出/返回宏见 #L235-249。结构化证据记录绑定准确的数组报文和 22033 边界;本页未运行自然案例。

96 - 2203A — sql_json_member_not_found

PostgreSQL SQLSTATE 2203A 的来源与诊断参考。

2203A

速览

无法从当前 JSON 项中读取指定的对象成员。固定 jsonpath 成员访问区分键不存在与接收项不是对象。

字段
SQLSTATE 2203A
条件名 sql_json_member_not_found
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_MEMBER_NOT_FOUND
别名

报文

代表性首要报文如下:

触发条件 首要报文
对象中没有指定键 JSON object does not contain key "%s"
成员访问器收到非对象 jsonpath member accessor can only be applied to an object

含义

jpiKey 分支会在当前 JSON 对象中查找请求的键。在会抛错的上下文中,键不存在会报告 2203A;标量或其他非对象接收项也使用本码,但首要报文不同。忽略结构错误时可以跳过这种不匹配;非抛错上下文则会把路径错误结果交给调用方处理。这是具名成员边界;通配成员访问和 .keyvalue() 使用只接受对象的 2203C 路径。

诊断

保留请求的键、成员访问器前一步收到的项,以及路径模式。键不存在可能是文档形状问题;非对象接收项则表示路径到达了错误类型。没有读取首要报文时,不要把成员缺失归为 22035 无项,或把通配/对象方法不匹配归为 2203C。

处理

修正键名,或按文档形状规范化并显式分支。只有当成员缺失确实是预期输入时,才使用路径文档规定的 lax 或错误处理行为。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的具名成员 检查条件来自 PostgreSQL 18.6。本页未声称有自然运行观察。

220392203C22035

来源

具名成员查找、键缺失、非对象和结构错误分支见 jsonpath_exec.c#L1012-1055。共享 strict/lax 与抛出/返回宏见 jsonpath_exec.c#L235-249。结构化证据记录绑定两条准确首要报文;本页未运行自然案例。

97 - 2203B — sql_json_number_not_found

PostgreSQL SQLSTATE 2203B 的来源与诊断参考。

2203B

速览

jsonpath 一元算术操作符要求数值操作数,却收到了其他类型的项。这是一元操作符边界,与数值转换方法分开。

字段
SQLSTATE 2203B
条件名 sql_json_number_not_found
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_NUMBER_NOT_FOUND
别名

报文

固定的一元分支报告:

operand of unary jsonpath operator %s is not a numeric value

含义

executeUnaryArithmExpr 遍历操作数序列并接受其中每个数值标量项,对每项应用一元函数。只有同时满足 !found!hasNext 时才会跳过非数值项;这表示终止的存在性求值且不收集结果。其他情况下都会进入 2203B 检查条件,包括普通结果收集在终止步骤遇到非数值项时。lax 模式下执行器可能先解包数组。.number().integer() 等数值项方法使用 22036。

诊断

查看一元操作符名称和它之前的完整项序列。检查哪些项是数值、lax 解包是否改变了序列,以及调用方是在收集结果还是只在终止步骤做存在性判断。不要把它解释成数值越界或数值转换方法失败。

处理

约束路径使其得到预期的数值序列,规范化每个 JSON 值,或改用接受实际类型的操作。把终止的存在性/不收集结果优化作为单独的已知行为记录;普通结果收集仍要求每个被处理项都是数值。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的一元算术分支来自 PostgreSQL 18.6。本页未声称有自然运行观察。

220362203822012

来源

完整的一元算术序列和非数值检查条件见 jsonpath_exec.c#L2158-2221。共享 strict/lax 与抛出/返回宏见 jsonpath_exec.c#L235-249。结构化证据记录绑定操作符首要报文和终止路径边界;本页未运行自然案例。

98 - 2203C — sql_json_object_not_found

PostgreSQL SQLSTATE 2203C 的来源与诊断参考。

2203C

速览

只接受对象的 JSON 路径访问器或 .keyvalue() 方法收到了非对象项。通配成员访问和对象键值展开使用这个结构检查条件。

字段
SQLSTATE 2203C
条件名 sql_json_object_not_found
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_OBJECT_NOT_FOUND
别名

报文

代表性首要报文如下:

触发条件 首要报文
通配成员访问器收到非对象 jsonpath wildcard member accessor can only be applied to an object
.keyvalue() 收到非对象 jsonpath item method .%s() can only be applied to an object

含义

通配成员分支要求 JSON 对象;当 jspIgnoreStructuralErrors 为 true 时,非对象结构不匹配可以被忽略,lax 模式也可能先自动解包数组。.keyvalue() 同样可能先自动解包数组,但随后直接要求对象容器;它的非对象检查通过 RETURN_ERROR 执行,抛错还是返回 jperErrorjspThrowErrors 决定,而该上下文取决于调用方的 silent 或 ON ERROR 处理。lax 本身不会抑制 .keyvalue() 的直接检查。具名成员缺键属于 2203A,只接受数组的访问属于 22039。

诊断

根据首要报文确认是通配访问器还是项方法,再检查当前项类型。区分对象接收项缺少具名键,与标量/数组接收项不能进行对象展开。将 lax 自动解包和结构错误处理纳入判断,不要直接把结果归为成员缺失。

处理

让路径选出对象、规范化输入形状,或在调用只接受对象的操作前显式分支。对通配访问,只有当业务确实要丢弃非对象分支时才使用 lax 结构抑制;对 .keyvalue(),lax 只能先解包数组,剩余的非对象仍按直接的抛错/silent/ON ERROR 路径处理,不要假设 lax 会忽略它。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的只接受对象的访问器和 .keyvalue() 检查条件来自 PostgreSQL 18.6。本页未声称有自然运行观察。

220392203A22037

来源

通配成员检查条件见 jsonpath_exec.c#L852-874.keyvalue() 对象容器检查见 #L2806-2828。共享 strict/lax 与抛出/返回宏见 jsonpath_exec.c#L235-249。结构化证据记录绑定两条只接受对象的首要报文;本页未运行自然案例。

99 - 2203D — too_many_json_array_elements

PostgreSQL SQLSTATE 2203D 的来源与诊断参考。

2203D

速览

锁定条件名表示 JSON 数组元素过多。对固定 PostgreSQL 18.6 的定向扫描没有解析出发出路径。

字段
SQLSTATE 2203D
条件名 too_many_json_array_elements
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS
别名

含义

定义将该条件命名为 too_many_json_array_elements,但 PostgreSQL 18.6 的定向源码审阅没有解析出原生 2203D 发出方。因此本页只记录条件身份和基数边界,不指定 JSON_TABLE/SQL/JSON 包装方式、首要报文、DETAIL 或 HINT。

诊断

保留完整诊断并确认实际发出组件及其元素数量规则。根据该操作确认它要求一个项、多个元素还是其他文档规定的基数;条件名本身不能证明存在包装或汇总,也不能证明它们能修复问题。

处理

确认实际发出方后,遵循该组件文档规定的元素数量规则,按实际输入或基数修正。不要预设存在可用的包装或汇总,也不要预设它们能够解决本条件。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;本页仅固定 PostgreSQL 18.6 定义行,未声称有原生发出路径或自然运行观察。

22034220352203E

来源

固定定义行见 errcodes.txt#L228。定向源码审阅没有解析出原生 2203D 发出路径;结构化证据记录明确保留这一未知范围,本页未运行自然案例。

100 - 2203E — too_many_json_object_members

PostgreSQL SQLSTATE 2203E 的来源与诊断参考。

2203E

速览

锁定条件名表示 JSON 对象成员过多。对固定 PostgreSQL 18.6 的定向扫描没有解析出发出路径。

字段
SQLSTATE 2203E
条件名 too_many_json_object_members
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS
别名

含义

定义将该条件命名为 too_many_json_object_members,但 PostgreSQL 18.6 的定向源码审阅没有解析出原生 2203E 发出方。因此本页只记录条件身份和对象基数边界,不指定 JSON_TABLE/SQL/JSON 构造器、首要报文、DETAIL 或 HINT。

诊断

保留完整诊断并确认实际发出组件及其对象成员数量规则。根据该操作确认它是否允许当前成员数量或有其他文档规定的基数;条件名本身不能证明存在包装或汇总,也不能证明它们能修复问题。不要据此推断成通用重复键条件。

处理

确认实际发出方后,遵循该组件文档规定的对象成员数量规则,按实际输入或基数修正。不要预设存在可用的包装或汇总,也不要预设它们能够解决本条件。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;本页仅固定 PostgreSQL 18.6 定义行,未声称有原生发出路径或自然运行观察。

22034220372203D

来源

固定定义行见 errcodes.txt#L229。定向源码审阅没有解析出原生 2203E 发出路径;结构化证据记录明确保留这一未知范围,本页未运行自然案例。

101 - 2203F — sql_json_scalar_required

PostgreSQL SQLSTATE 2203F 的来源与诊断参考。

2203F

速览

JSON_VALUE 收到一个项,但该项不是标量。多个项会在更早的 22034 基数分支处理;空结果则由空结果/ON EMPTY 路径处理。

字段
SQLSTATE 2203F
条件名 sql_json_scalar_required
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_SCALAR_REQUIRED
别名

报文

固定的 JSON_VALUE 标量检查条件使用以下首要报文形式:

上下文 首要报文
JSON_VALUE 映射到命名列 JSON path expression for column "%s" must return single scalar item
独立 JSON_VALUE JSON path expression in JSON_VALUE must return single scalar item

含义

JsonPathValue 先执行路径并标记空结果。多个项属于独立的 22034 基数分支。恰好一个项时,它会在必要时解开标量 JSON 容器,然后要求结果是 JSON 标量;对象或数组会进入 2203F。如果调用方为 ON ERROR 提供了错误指针,函数会设置错误标志并返回 NULL,而不是直接抛错。普通 ERROR 路径会报告上面按列名区分或不带列名的首要报文。

诊断

检查 JSON_VALUE 路径结果的项数和选中项类型。空结果、多个项、单个非标量项分别属于不同分支,处理方式也不同。修改源 JSON 前先检查列映射以及 ON EMPTY/ON ERROR 子句,并把 JSON_QUERY 的包装语义与 JSON_VALUE 的标量要求区分开。

处理

让路径解析为一个标量;如果业务确实需要对象或数组,改用合适的 SQL/JSON 操作;对预期缺失则配置文档规定的空值/错误处理。不要为了让集合看起来像标量而给 JSON_VALUE 添加包装。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。

版本

锁定目录从 12.0 起记录该条件;固定的 JSON_VALUE 基数和标量检查来自 PostgreSQL 18.6。本页未声称有自然运行观察。

220342203522036

来源

JSON_VALUE 完整的空结果、多个项、标量和 ON ERROR 指针分支见 jsonpath_exec.c#L3991-4067。结构化证据记录绑定 22034 边界和两种 2203F 首要报文;本页未运行自然案例。

102 - 2203G — sql_json_item_cannot_be_cast_to_target_type

PostgreSQL SQLSTATE 2203G 的来源与诊断参考。

2203G

速览

2203G 是目录条件 sql_json_item_cannot_be_cast_to_target_type。在固定的 PostgreSQL 18.6 树中,有界搜索只在 errcodes.txt 找到宏定义,没有找到核心代码或 contrib 中实际发出该条件的调用。因此这是一页仅有定义边界的参考;看起来相似的 JSON 转换不能证明服务器使用了这个 SQLSTATE。

字段
SQLSTATE 2203G
条件名 sql_json_item_cannot_be_cast_to_target_type
状态 有效
已知存在于 15.0
锁定快照 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_SQL_JSON_ITEM_CANNOT_BE_CAST_TO_TARGET_TYPE
别名

含义

固定目录给出了 SQL/JSON 条件名,但 18.6 有界源码扫描没有找到 PostgreSQL 核心代码或 contrib 的发出路径。不能把这个名字扩展成未经证实的 JSONPath、构造器、标量/数组或对象转换场景。扩展或用户自定义 RAISE 可以自行使用该状态码,但那不属于固定源码树的结果。

诊断

保留完整 SQLSTATE、主消息/详细信息/提示、服务器日志上下文、语句,以及产生它的扩展或函数。用这些证据识别真正的发出者,不要只因文字像 JSON、普通类型输入或其他转换失败就归类为 2203G

报文

本次没有为这个仅有定义的条目解析出固定 PostgreSQL 18.6 主消息、详细信息或提示模板。

处理

这个仅定义条目没有 PostgreSQL 核心代码提供的、有源码依据的处置方法。先确认实际发出者,再修正该发出者的契约并重试受影响的操作。如果实际发出的是 ERROR 且处于显式事务中,先执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交模式下先修正原因,再重新提交操作。这个条件定义本身不要求重置连接。

版本

锁定目录从 PostgreSQL 15.0 记录此条件。本次固定源码边界是 PostgreSQL 18.6 REL_18_6;固定源码树中未找到发出者,不能据此确定任何具体实现路径何时引入或其行为,也不能推断扩展或未来版本的行为。

2203F

来源

src/backend/utils/errcodes.txt#L231

结构化证据记录保存固定定义和有界源码扫描的限制;本页没有运行观察。

103 - 22P01 — floating_point_exception

PostgreSQL SQLSTATE 22P01 的来源与诊断参考。

22P01

速览

固定核心代码路径中的 FloatExceptionHandler 被注册为 SIGFPE 处理器。它以 ERROR 严重性发出主消息 floating-point exception,详细信息说明收到无效浮点操作信号,可能是结果越界或除零等无效操作。

字段
SQLSTATE 22P01
条件名 floating_point_exception
状态 有效
已知存在于 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_FLOATING_POINT_EXCEPTION
别名

含义

src/backend/tcop/postgres.c 中的 FloatExceptionHandler(SIGNAL_ARGS) 把信号转成 ereport(ERROR)PostgresMainSIGFPE 安装该处理器。这是浮点信号路径,不能据此说所有除法或数值越界都使用 22P01。精确数值除零和数值范围检查通常分别使用自己的 2201222003 条件。

诊断

保留完整 ErrorResponse 和服务器日志上下文,包括语句位置以及可用的 routine/context 字段。检查操作数类型和表达式路径,区分硬件或浮点无效操作与使用 2201222003 的精确数值运算。固定处理器的详细信息是诊断说明,不证明具体一定是除零。

报文

  • ERROR 主消息:floating-point exception
  • DETAIL:An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero.

处理

修正算术或输入范围;如果需要改变数值域,要在运算前明确转换。显式事务中,ERROR 会使事务进入中止状态,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交模式下先修正表达式或数据再重新提交。引用路径是 ERROR 而非 FATAL,普通客户端后端不会仅因该条件就需要重置连接。

版本

锁定目录从 PostgreSQL 7.4 记录此条件。本页引用的处理器和 SIGFPE 注册来自 PostgreSQL 18.6 REL_18_6;目录边界不能证明当前消息的精确引入版本。

220122200322023

来源

src/backend/tcop/postgres.c#L3072-L3082

src/backend/tcop/postgres.c#L4245-L4249

结构化证据记录保存精确主消息/详细信息、严重性和源码/运行边界;本次没有诱发信号。

104 - 22P02 — 文本表示无效

PostgreSQL SQLSTATE 22P02(文本表示无效,invalid_text_representation)的源码证据、诊断与处理参考。

22P02 — 文本表示无效

速览

22P02 表示文本输入例程无法把值解释为目标类型。本页选择普通整数输入路径,同时标出 COPY/文本边界;COPY、枚举、扩展和 contrib 调用可能使用不同主报文。

字段
SQLSTATE 22P02
条件名 invalid_text_representation
状态 有效
已知存在于 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_INVALID_TEXT_REPRESENTATION
别名

含义

cast、赋值或文本 COPY 字段由目标类型的输入例程判断文本是否合法。PostgreSQL 18.6 使用 invalid input syntax for type integer: "%s",锁定的 PostgreSQL 10.23 源码使用 invalid input syntax for integer: "%s";两者都是动态模板,也不是统一的本地化字符串。其他固定调用者还包括 COPY reject-limit、枚举输入和扩展校验,因此 primary 文本和上下文可能不同。

诊断

记录目标类型、客户端编码和参数绑定后的原始值,并确认操作是 cast、赋值、文本 COPY 字段、枚举输入还是其他类型包装。把坏文本(22P02)与数值越界(22003)、日期时间语法错误(22007)、二进制表示无效(22P03)以及 COPY 文件/头部或 framing 错误(22P04)区分开。二进制 COPY payload 不能只按文本输入报文诊断。

处理

在输入边界校验并保持预期目标类型。只有修正值后才重试;除非业务规则明确要求,不要静默截断或把值变成 NULL。显式事务中的输入 ERROR 会使事务进入中止状态(25P02);继续前执行 ROLLBACK,或使用 ROLLBACK TO SAVEPOINT convert_input。COPY 出错后也必须先恢复事务,再执行下一条命令。

实测诊断

普通整数路径固定为 ERROR,并有上述版本差异的动态主报文。选定实测记录了精确值:"not-an-integer" 产生 22P02,同一自动提交会话随后把合法 "42" 转换为 42。

代表案例

共享注册表在自动提交下先发送一次无效文本 cast,检查真实诊断和 IDLE 状态,再在同一连接发送合法整数文本。这个实测恢复不同于显式事务;后者必须先回滚或回滚到保存点。页面 SQL 与运行器来自同一注册表,没有隐藏的第二定义。

SELECT 'not-an-integer'::integer;
SELECT '42'::integer

选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据

版本

锁定目录从 7.4 起记录 22P02。18.6 与 10.21 的有界运行均通过,但主报文措辞如上有所不同;这不能推广到所有 22P02 调用方或所有中间版本。

来源

  • src.errcodes.18.6src/backend/utils/errcodes.txt at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.invalid-integer.18.6src/backend/utils/adt/numutils.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 9018d559d8a2b04f6d3fa8fedeb754fc5f1f8cd8594292e6adc5108e8f97f1bf (source).
  • src.invalid-integer.10.23src/backend/utils/adt/numutils.c at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 6cb3fd7e4b38a66c16f2cc4a3de0c52ce44e01dd22edd3dd9340d2a8faea0d35 (source).
  • src.copy-text.18.6 — 固定文本 COPY 转换/reject-limit 路径位于 src/backend/commands/copyfrom.c 第 1169-1172 行(来源)。
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.22P02 / snippet-registry.22P02 — hashes are recorded in evidence/22P02.json and each selected runtime record.

105 - 22P03 — invalid_binary_representation

PostgreSQL SQLSTATE 22P03 的来源与诊断参考。

22P03

速览

22P03 是 PostgreSQL 的二进制表示无效边界。固定源码覆盖二进制 COPY 字段、扩展协议 Bind 参数、快速路径函数参数、逻辑复制列,以及若干类型接收函数内部的格式检查。

字段
SQLSTATE 22P03
条件名 invalid_binary_representation
状态 有效
已知存在于 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_INVALID_BINARY_REPRESENTATION
别名

含义

接收端被要求解码二进制字节,但字节不符合接收端格式,或接收函数没有消费完整缓冲区。二进制 COPY 在类型接收函数返回后发现剩余字节时报告 incorrect binary data format;Bind 报告 incorrect binary data format in bind parameter %d;快速路径报告 incorrect binary data format in function argument %d;逻辑复制报告 incorrect binary data format in logical replication column %d。数组和 numeric 等代表性类型接收函数还会因维度/标志位、数组元素帧,或 numeric 的 sign/scale/digit 字段(符号、标度/小数位数和数字位)无效而使用该状态码。

这不同于文本输入函数解析失败,也不同于 COPY 文件头或行框架错误 22P04。必须结合实际接收边界和类型 OID 判断。

报文

固定源码中的代表性主消息是:二进制 COPY 使用 incorrect binary data format,Bind 使用 incorrect binary data format in bind parameter %d,快速路径使用 incorrect binary data format in function argument %d,逻辑复制使用 incorrect binary data format in logical replication column %d。类型接收函数还使用 invalid number of dimensions: %dinvalid array flagsinsufficient data left in messageimproper binary format in array element %dinvalid sign in external "numeric" valueinvalid scale in external "numeric" valueinvalid digit in external "numeric" value;本次固定调用中的这些变体都是 ERROR,没有 DETAIL 或 HINT。

诊断

先确定传输来自扩展协议 Bind、二进制 COPY、快速路径、逻辑复制,还是某个类型的二进制接收函数。保留参数、参数位置、函数参数或远端列号及完整报文。比较生产端格式码和类型 OID 与接收端预期;若是接收函数内部错误,检查它是否消费了长度限定的完整缓冲区,剩余 cursor(游标位置)通常表示格式不匹配而不是普通文本值错误。

处理

修正生产端或类型契约,再从发生错误的协议边界重试。任何位于显式事务内的客户端 ERROR(包括 Bind 错误)都会使事务进入中止状态;重试前执行 ROLLBACK,或执行此前已建立的 ROLLBACK TO SAVEPOINTSyncReadyForQuery 只恢复协议同步并报告状态,不会清除 INERROR。扩展协议 Bind 出错后,后端会跳过前端消息直到下一个 Sync;客户端应发送 Sync、消费 ReadyForQuery 后再发下一条扩展协议操作。自动提交模式下,等待这个边界后再重新提交修正后的操作。快速路径 FunctionCall 不在扩展协议的跳过标志内,正常循环可以返回 ReadyForQuery,但显式事务仍适用同一恢复规则。COPY FROM STDIN 应按 COPY 协议结束当前坏流,仍处于 COPY-in 时可在适当情况下使用 CopyFail。如果 COPY 由扩展协议发起,后端发出 ErrorResponse 后,客户端应发送 Sync 并等待 ReadyForQuery;如果由 simple Query 发起,剩余查询消息会被丢弃,随后直接发送 ReadyForQuery;客户端不需要发送 Sync,消费该 ReadyForQuery 后再发送下一条查询。不要在 COPY-in 期间发送普通 SQL。如果读取客户端消息时连协议帧本身都丢失,PostgreSQL 另有协议同步丢失的 FATAL 路径;不能把这种连接终止从二进制格式 ERROR 本身推断出来。逻辑复制应修正发布端/接收端的二进制编码器或类型定义,并交给复制后台进程自己的重试策略;本页没有依据要求杀掉或重置所有连接。

版本

锁定目录从 PostgreSQL 7.4 记录此条件。协议、复制、数组和 numeric 路径来自 PostgreSQL 18.6 REL_18_6;本次没有运行二进制协议案例。

22P0222P0408P01

来源

src/backend/commands/copyfromparse.c#L2047-L2055

src/backend/tcop/postgres.c#L1922-L1945

src/backend/tcop/fastpath.c#L426-L448

src/backend/replication/logical/worker.c#L832-L853

src/backend/utils/adt/arrayfuncs.c#L1476-L1510

src/backend/utils/adt/numeric.c#L1093-L1123

src/backend/tcop/postgres.c#L416-L445

src/backend/tcop/postgres.c#L4483-L4504

src/backend/tcop/postgres.c#L4843-L4875

doc/src/sgml/protocol.sgml#L1287-L1318

doc/src/sgml/protocol.sgml#L7821-L7823

结构化证据记录保存精确主消息模板以及源码/运行边界。

106 - 22P04 — bad_copy_file_format

PostgreSQL SQLSTATE 22P04 的来源与诊断参考。

22P04

速览

22P04 是 COPY 文件格式边界。固定解析器在二进制签名和头部、文本或 CSV 帧、头部/行字段数以及二进制字段长度错误时使用它。它表示 COPY 结构错误,不是所有值转换失败的统称。

字段
SQLSTATE 22P04
条件名 bad_copy_file_format
状态 有效
已知存在于 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_BAD_COPY_FILE_FORMAT
别名

含义

二进制输入会校验 PGCOPY 签名、flags、扩展长度、行字段数、字段长度和结束标记。代表性主消息包括 COPY file signature not recognizedinvalid COPY file header (missing flags)invalid COPY file header (wrong length)row field count is %d, expected %dinvalid field sizeunexpected EOF in COPY data

文本和 CSV 有独立的帧检查。头部匹配可能报告 wrong number of fields in header line: got %d, expected %d 或列名不匹配;普通行可能报告 extra data after last expected columnmissing data for column "%s"。CSV 引号和换行可能报告 unterminated CSV quoted fieldunquoted carriage return found in dataunquoted newline found in data;文本模式使用对应的 literal ... found in data 消息和提示。帧已正确解析但值无法转换时通常属于 22P02;二进制类型接收函数留下未消费字节时可能是 22P03

报文

固定源码中的代表性主消息均为 ERROR

  • 二进制头部/字段:COPY file signature not recognizedinvalid COPY file header (missing flags)unrecognized critical flags in COPY file headerinvalid COPY file header (missing length)invalid COPY file header (wrong length)invalid field sizeunexpected EOF in COPY data
  • 头部和行:wrong number of fields in header line: got %d, expected %dcolumn name mismatch in header line field %d: got "%s", expected "%s"extra data after last expected columnmissing data for column "%s"row field count is %d, expected %d
  • CSV 和行帧:unterminated CSV quoted fieldliteral carriage return found in dataunquoted carriage return found in dataliteral newline found in dataunquoted newline found in dataend-of-copy marker is not alone on its line。回车/换行变体还会携带使用 \r\n 或带引号 CSV 字段的源码提示。

诊断

先确定来源是文本、CSV、二进制 COPY 还是前端 COPY-in。保留完整主消息,因为它能定位解析阶段。依次检查二进制签名/标志位/长度、头部和目标列顺序、行字段数、CSV 引号/转义与换行规则,以及文本 COPY 的数据结束标记是否单独占行,之后再检查目标类型的输入转换。

ON_ERROR IGNORE 不是通用的坏行跳过开关。固定文本/CSV 路径会围绕安全的类型输入转换处理软错误,并可发出通知后跳过数据类型不兼容的行;头部、字段数、行帧、CSV 引号和二进制结构错误仍以 ERROR 抛出,不能都靠这个选项跳过。

处理

按声明的文本/CSV/二进制格式、目标列顺序,重新生成带正确头部、长度、引号和行格式的流。前端 COPY-in 出错时,按当前 COPY 子协议状态结束输入,适当时使用 CopyFail。如果 COPY 由扩展协议发起且后端发送 ErrorResponse,客户端应发送 Sync 并等待 ReadyForQuery;如果由 simple Query 发起,剩余查询消息会被丢弃,随后直接发送 ReadyForQuery;客户端不需要发送 Sync,消费该 ReadyForQuery 后再发送下一条查询。不要在 COPY-in 期间发送普通 SQL。显式事务中的 ERROR 要在协议边界恢复后执行 ROLLBACKROLLBACK TO SAVEPOINTReadyForQuery 只报告状态,不能替代事务恢复。ON_ERROR IGNORE 只可能适用于文档所说的安全类型输入失败,不能修复坏头或损坏的 CSV/二进制帧。普通 COPY ERROR 本身不要求重置连接。

版本

锁定目录从 PostgreSQL 7.4 记录此条件。引用的解析器及 ON_ERROR 边界来自 PostgreSQL 18.6 REL_18_6;本次没有运行自然 COPY 文件案例。

22P0222P032200B

来源

src/backend/commands/copyfromparse.c#L190-L228

src/backend/commands/copyfromparse.c#L779-L827

src/backend/commands/copyfromparse.c#L937-L977

src/backend/commands/copyfromparse.c#L1026-L1073

src/backend/commands/copyfromparse.c#L1084-L1130

src/backend/commands/copyfromparse.c#L1388-L1432

src/backend/commands/copyfromparse.c#L1818-L1922

src/backend/tcop/postgres.c#L416-L445

doc/src/sgml/protocol.sgml#L1287-L1318

结构化证据记录保存代表性精确主消息/提示以及 ON_ERROR 的结构边界。

107 - 22P05 — untranslatable_character

PostgreSQL SQLSTATE 22P05 的来源与诊断参考。

22P05

速览

PostgreSQL 能识别源字符,却无法在目标编码中表示它。固定辅助函数 以 ERROR 发出 character with byte sequence %s in encoding "%s" has no equivalent in encoding "%s",其中包含字节序列和两种编码名。

字段
SQLSTATE 22P05
条件名 untranslatable_character
状态 有效
已知存在于 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_UNTRANSLATABLE_CHARACTER
别名

含义

report_untranslatable_char(src_encoding, dest_encoding, ...) 计算源多字节字符长度,把问题字节格式化为 0x..,当目标转换表没有等价字符时抛出 22P05。也就是说源字符已经足够合法、可以识别,但目标表示无法承载它。它不同于坏源字节:固定转换循环可以调用 report_invalid_encoding,后者使用 22021

报文

  • ERROR 主消息:character with byte sequence %s in encoding "%s" has no equivalent in encoding "%s"
  • 固定调用没有 DETAIL 或 HINT。

诊断

读取主消息中的字节序列、源编码、目标编码和转换方向。检查 client_encoding、服务器/数据库编码、导入或 COPY 文件编码及实际转换边界。不能仅因字符是非 ASCII 就认定是 22P05;坏源字节和普通类型输入失败走不同路径。

处理

选择能够表示数据的目标编码,或修正生产端和转换边界,同时保留该字符。除非业务明确允许有损处理,不要静默替换或丢弃。引用路径是 ERROR:显式事务中重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交模式下修正编码或输入后重新提交。该源码路径不表示 FATAL 或必须重置连接。

版本

锁定目录从 PostgreSQL 7.4 记录此条件。引用的报告辅助函数 和代表性转换分支来自 PostgreSQL 18.6 REL_18_6;本次没有运行编码转换案例。

2202122P02

来源

src/backend/utils/mb/mbutils.c#L1862-L1902

src/backend/utils/mb/conv.c#L674-L684

结构化证据记录保存精确主消息以及合法字符/坏字节边界。

108 - 22P06 — nonstandard_use_of_escape_character

PostgreSQL SQLSTATE 22P06 的来源与诊断参考。

22P06

速览

SQL 扫描器发现反斜杠转义形式在当前字符串字面量规则下非标准或不安全。PostgreSQL 18.6 有一个不安全引号转义的 ERROR 分支,以及反斜杠-引号、反斜杠-反斜杠和其他转义用法的三个 WARNING 分支。

字段
SQLSTATE 22P06
条件名 nonstandard_use_of_escape_character
状态 有效
已知存在于 8.1.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_NONSTANDARD_USE_OF_ESCAPE_CHARACTER
别名

含义

扫描器把 backslash_quoteescape_string_warningstandard_conforming_strings 复制到自身状态。普通带引号字符串只有在 standard_conforming_strings 为 off 时才进入可处理转义的 xe 规则;显式 E'...' 直接进入该规则。显式 E 字符串在进入 xe 时把 warn_on_first_escape 初始化为 false,因此不会触发这组旧式的首次转义 WARNING;但它仍受 backslash_quoteERROR 检查条件约束,E 前缀不是绕过该条件的通用办法。反斜杠后是单引号时,如果 backslash_quote = off,或安全编码模式遇到仅客户端支持的编码(client-only),就以 ERROR 发出主消息 unsafe use of \' in a string literal,并提示使用成对单引号。

escape_string_warning 和每个字符串只警告第一次转义的条件打开时,词法器会分别为 \'\\ 或其他转义每个字符串发出一次 WARNING。精确主消息是 nonstandard use of \' in a string literalnonstandard use of \\ in a string literalnonstandard use of escape in a string literal。这些是警告诊断,不是 NOTICE,本身不会中止语句。

报文

  • ERROR 主消息:unsafe use of \' in a string literal;HINT:Use '' to write quotes in strings. \' is insecure in client-only encodings.
  • WARNING 主消息:nonstandard use of \' in a string literal;HINT:Use '' to write quotes in strings, or use the escape string syntax (E'...').
  • WARNING 主消息:nonstandard use of \\ in a string literal;HINT:Use the escape string syntax for backslashes, e.g., E'\\'.
  • WARNING 主消息:nonstandard use of escape in a string literal;HINT:Use the escape string syntax for escapes, e.g., E'\r\n'.

诊断

保留字面量写法和字符位置、是否有 E 前缀、standard_conforming_stringsbackslash_quoteescape_string_warning、客户端编码及消息严重性。ERROR 分支会拒绝当前语句,警告分支可能允许语句继续,因此不能只根据“反斜杠”三个字判断结果。

处理

嵌入单引号时写成连续两个单引号;确实需要反斜杠时使用明确的 E'...' 语法并固定预期转义语义。如果是 ERROR,显式事务已中止,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交模式下先修正字面量。WARNING 不需要事务恢复,但应优先修正字面量,不要靠隐藏警告或全局改策略来掩盖问题。引用路径不要求重置连接。

版本

锁定目录从 PostgreSQL 8.1.0 记录此条件。引用的扫描器检查条件和精确消息来自 PostgreSQL 18.6 REL_18_6;本次没有运行区域设置或 GUC 案例。

2201942601

来源

src/backend/parser/scan.l#L545-L560

src/backend/parser/scan.l#L706-L720

src/backend/parser/scan.l#L1423-L1459

结构化证据记录保存四个精确主消息、提示、检查条件、严重性和源码/运行边界。

109 - 23000 — 完整性约束冲突(integrity_constraint_violation)

PostgreSQL SQLSTATE 23000:完整性约束冲突的来源与诊断参考。

23000 — 完整性约束冲突

速览

23000 是 Class 23 完整性约束冲突的总类名,不是可以替代具体错误码的自然触发码。客户端应使用服务器返回的完整五字符 SQLSTATE。

字段
SQLSTATE 23000
条件名 integrity_constraint_violation
状态 有效
已知存在于 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_INTEGRITY_CONSTRAINT_VIOLATION
别名

含义

该类包含违反声明完整性规则的行和模式操作。锁定的 errcodes.txt 将具体机制分到 230012350223503235052351423P01 等子码;18.6 核心调用扫描没有解析出的 23000 报文路径,因此本文不伪造运行复现。

诊断

先读取精确 SQLSTATE,再查看 constraint_nametable_namecolumn_nameschema_name 以及主报文/DETAIL。把所有 Class 23 错误压成 23000 会丢失修复所需的对象和机制。

处理

保留原语句及事务边界,按具体子码修复数据或约束;显式事务报错后先回滚。不要用 RAISE ... ERRCODE 23000 冒充自然服务器机制。

源码报文模板

适用边界

本批没有为 23000 构造自然 SQL 触发器;请把它视为源码/协议边界,而不是可直接复制的复现脚本。结构化证据 · 案例导出

作者证据 ID:identity, specific-codes, handling。选定运行记录:—。

版本与边界

锁定目录在 7.4 已观察到该总类,并在列出的 9.0–18.6 正式快照中均存在。18.6 调用扫描确认了有界源码观察;本文不把它解释为扩展或未来版本都不可能发出该码。

参见 23001 RESTRICT 冲突23502 非空约束冲突23514 CHECK 冲突23P01 排除约束冲突23505 唯一约束冲突

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

110 - 23001 — RESTRICT 约束冲突(restrict_violation)

PostgreSQL SQLSTATE 23001:RESTRICT 约束冲突的来源与诊断参考。

23001 — RESTRICT 约束冲突

速览

23001 是立即执行的外键 RESTRICT 动作导致的专用冲突。18.6 案例删除仍被引用的父行时返回该码;10.21 对同一操作返回 23503,必须记录版本和完整诊断。另一个 PostgreSQL 17.11 对照案例对该 RESTRICT 操作也返回 23503,不计作 23001 覆盖。

字段
SQLSTATE 23001
条件名 restrict_violation
状态 有效
已知存在于 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_RESTRICT_VIOLATION
别名

含义

ON DELETE/UPDATE RESTRICT 会立即检查引用行,且不能延迟;可延迟的 NO ACTION 则可以把检查推迟到相应提交点。源码根据父表、外键、子表和可见键值动态组装报文。

诊断

记录精确 SQLSTATE、constraint_name、表名和 DETAIL,先检查子表。显式事务删除失败后连接为 INERROR,必须 ROLLBACK,再在新的 BEGIN/COMMIT 中删除子行和父行。

处理

按完整性语义选择删除/改派依赖行、放弃父操作或重新设计 FK 动作。不要为了迁移方便把 RESTRICT 偷换成可延迟 NO ACTION。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 23001;primary update or delete on table "parents" violates RESTRICT setting of foreign key constraint "children_parent_id_fkey" on table "children";DETAIL Key (id)=(1) is referenced from table "children".;after_error INERROR;after_rollback IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 23503;primary update or delete on table "parents" violates foreign key constraint "children_parent_id_fkey" on table "children";DETAIL Key (id)=(1) is still referenced from table "children".;after_error INERROR;after_rollback IDLE17.11 (pg17) / boundary:SQLSTATE 23503;primary update or delete on table "parents" violates foreign key constraint "children_parent_id_fkey" on table "children";DETAIL Key (id)=(1) is still referenced from table "children".;after_error INERROR;after_rollback IDLE;最终计数 [0, 0]。该边界案例不计作 23001 覆盖。

代表案例

运行器从 verify/cases/23001/snippets.json(SHA-256 6086c1ce982afa5438bbcd29b86ec4cd0cbe0c76fa6152c1eb4a330a7706d5c8)读取下列片段,并为临时 schema 替换表名;完整 setup、断言与清理见 案例导出

-- create_parent
CREATE TABLE parents(id integer PRIMARY KEY);
-- create_child
CREATE TABLE children(id integer PRIMARY KEY, parent_id integer NOT NULL REFERENCES parents(id) ON DELETE RESTRICT);
-- seed_parent
INSERT INTO parents VALUES (1);
-- seed_child
INSERT INTO children VALUES (10, 1);
-- begin
BEGIN;
-- trigger
DELETE FROM parents WHERE id = 1;
-- rollback
ROLLBACK;
-- repair_begin
BEGIN;
-- repair_child
DELETE FROM children WHERE id = 10;
-- repair_parent
DELETE FROM parents WHERE id = 1;
-- commit
COMMIT;
-- verify
SELECT (SELECT count(*) FROM parents), (SELECT count(*) FROM children);

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自上述共享 registry;结构化证据 · 案例导出

作者证据 ID:identityrestrict-pathno-action-boundaryruntimeruntime.pg17-boundary。选定基础运行记录:runtime.23001-batch1-latest2-20260909.latestruntime.23001-batch1-pg10b-20260909.pg10。单独的边界记录:runtime.23001-boundary-pg17-final-20260909.pg17

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定基础案例在 18.6 观察到 23001,在 10.21 对同一 RESTRICT 删除观察到 23503。另一个 PG17.11 边界对照也返回 23503,并保持 INERRORIDLE 的恢复边界;该记录单独保留,不能推广为所有 PostgreSQL 11–17 小版本的普遍结果。

对比 23503 外键冲突23505 唯一约束冲突23514 CHECK 冲突

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.ri_triggers.18.6 (SHA-256 a3fed49fbda88fe0fe5bcf35eb019fced28596ae4046233f2acb2eb9f90ab1da)
  • doc.ddl-constraints.18.6 (SHA-256 ce1919d9236f2e71672660e1a347146472e966e4d19b77fde5ae345dd1db6ec7) · 官方文档

111 - 23502 — 非空约束冲突(not_null_violation)

PostgreSQL SQLSTATE 23502:非空约束冲突的来源与诊断参考。

23502 — 非空约束冲突

速览

23502 表示 NULL 到达了 NOT NULL 规则。本案例识别出列 label 和关系 items;18.6 与 10.21 的英文主报文关系措辞略有差异,但 SQLSTATE 和结构化对象一致。

字段
SQLSTATE 23502
条件名 not_null_violation
状态 有效
已知存在于 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_NOT_NULL_VIOLATION
别名

含义

执行器检查元组的 NOT NULL 属性并带出列、关系及可选的失败行 DETAIL。模式校验和域的 NOT NULL 校验也会使用该码,但源码模板不同;域 CHECK 失败属于 23514 路径。默认值、显式值、生成表达式或模式变更的选择取决于 NULL 的来源。

诊断

保存 column_nametable_name 和 DETAIL。选定案例中,18.6 主报文包含 of relation "items",10.21 则省略该短语;应使用结构化字段,不要匹配完整英文报文。沿参数、类型转换、生成列、触发器和 INSERT ... SELECT 追踪值。自动提交案例错误后仍为 IDLE;外层显式事务需要回滚或处理器。

处理

填入合法值、明确采用默认值,或在检查既有数据和下游读取方后调整约束。不要为了掩盖缺失值而删除 NOT NULL,或把它换成更弱的 CHECK;NULL 能否出现必须是有意的数据契约。新增 NOT NULL 的迁移要先校验既有数据,保持模式变更事务边界显式。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 23502;primary null value in column "label" of relation "items" violates not-null constraint;DETAIL Failing row contains (2, null).;status_after_error IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 23502;primary null value in column "label" violates not-null constraint;DETAIL Failing row contains (2, null).;status_after_error IDLE

代表案例

运行器从 verify/cases/23502/snippets.json(SHA-256 f701e32a0e9214d6c88deabcda99981c288cae0f176d1dcaf383863c3942f8e0)读取下列片段,并为临时 schema 替换表名;完整 setup、断言与清理见 案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, label text NOT NULL);
-- seed
INSERT INTO items VALUES (1, 'seed');
-- trigger
INSERT INTO items VALUES (2, NULL);
-- repair
INSERT INTO items VALUES (2, 'valid');
-- verify
SELECT id, label FROM items ORDER BY id;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自上述共享 registry;结构化证据 · 案例导出

作者证据 ID:identity, dml-path, schema-path, runtime。选定运行记录:runtime.23502-batch1-latest-20260909.latest, runtime.23502-batch1-pg10-20260909.pg10

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定运行只覆盖 18.6 与 10.21 的普通 INSERT,不覆盖 ALTER TABLE 校验、域、分区或触发器生成 NULL。

对比 23514 CHECK 冲突23503 外键冲突23505 唯一约束冲突

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.execMain.18.6 (SHA-256 33b97337fa23a649c5e7a092e1bd405a54e8503529236c62c9d5bb93a1774a8d)
  • src.tablecmds.18.6 (SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9)
  • src.typecmds.18.6 (SHA-256 60d1e9754646e100f6b74aa367ad8c2c52386c400df721707423d329209c47eb)
  • doc.ddl-constraints.18.6 (SHA-256 ce1919d9236f2e71672660e1a347146472e966e4d19b77fde5ae345dd1db6ec7) · 官方文档

112 - 23503 — foreign_key_violation:外键约束冲突

当子表外键写入或某些普通父表操作违反外键关系时,PostgreSQL 会报告 SQLSTATE 23503。应确认操作、关系和约束,再修复数据或事务边界。

速览

23503 是 PostgreSQL 类别 23 integrity_constraint_violation 中的 foreign_key_violation 条件。子表插入或更新找不到匹配的父键,或者普通父表键操作触发外键规则,都可能产生它。在 PostgreSQL 18.6 中,父表 RESTRICT 分支改用 23001,因此应先按操作和完整诊断判断 SQLSTATE。

最有用的诊断字段是 SQLSTATE(C)、主报文(M)、detail(D),以及服务器提供时的 schema、table 和 constraint 字段。在 psycopg 中,这些字段位于 exc.sqlstateexc.diag。重试前应保存完整诊断,因为当服务器可以展示键值时,detail 会指出缺少或仍被引用的键。

对于立即检查的外键约束,错误由违反约束的语句报告;延迟约束可以让语句先完成,并在 COMMIT 时报告 23503。自动提交下,立即失败的语句结束后连接可以执行下一条命令;显式事务中的立即失败会让事务变为 INERROR,必须执行 ROLLBACK 或回滚到 savepoint 后才能发送无关命令。代表性案例用真实的 parents/children 外键、有效父行和新的子行写入验证了修复。

案例 fk_insert_missing_parent 使用真实的 parents/children 外键,在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 目标上均通过。run ID 和逐案例断言保存在公开证据 JSON中。

字段
SQLSTATE 23503
条件名 foreign_key_violation
状态 有效
已知存在于 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_FOREIGN_KEY_VIOLATION
别名

含义与触发路径

子表上的外键指向父表的主键或合适的唯一键。PostgreSQL 会在子表 INSERT、改变键值的 UPDATE 时检查这种关系;父表键被更新或删除时,也会检查反向引用。约束是立即检查还是延迟检查,决定了错误出现的具体时点。

列的匹配规则同样重要。默认的 MATCH SIMPLE 下,只要引用键中有任意列为 NULL,该行就不必匹配父表。MATCH FULL 允许全为 NULL 的键,或全部非 NULL 且能匹配父键的键,但会拒绝 NULL 与非 NULL 混合的键。代表性案例只有一个 NOT NULL 列,因此有意没有演示这两种 NULL 规则。

对于父表 DELETE 或改变键值的 UPDATEON DELETE/UPDATE NO ACTION 可以在约束可延迟时等到约束检查时点;RESTRICT 要求立即检查且不能延迟。在固定的 PostgreSQL 18.6 源码中,RESTRICT 分支使用 23001restrict_violation)及专用报文,而不是本页案例中的 23503。动作选择是关系契约的一部分;父表操作不能按“缺少父键”的子表插入来推断 SQLSTATE。

普通子行路径在 ri_triggers.c 中使用 insert or update on table "%s" violates foreign key constraint "%s" 模板。可选 detail 为 Key (%s)=(%s) is not present in table "%s".;服务器还会通过协议的 table 和 constraint 字段附加子表及约束身份。普通的父键删除或更新分支可使用另一套 23503 主报文;固定版本的 RESTRICT 分支例外地使用 23001。本页运行证据只覆盖缺少父行的子表写入,不覆盖父表动作。

23503 只说明关系检查失败,不直接给出业务修复。缺少父行可能是写入顺序错误、标识符错误、另一个事务尚未提交,或需要级联策略的有意删除。选择修复前应检查语句和约束定义。

报文与诊断

代表性操作创建父表和子表,不插入键 99 对应的父行,然后插入子行。下面的可执行摘录与 runner 使用同一触发和恢复顺序;实际运行时由隔离 harness 为名称加上模式限定。

CREATE TABLE parents(id integer PRIMARY KEY);
CREATE TABLE children(
    id integer PRIMARY KEY,
    parent_id integer NOT NULL,
    CONSTRAINT children_parent_fk FOREIGN KEY (parent_id) REFERENCES parents(id)
);
BEGIN;
INSERT INTO children VALUES (1, 99);
-- 服务器报告 23503,事务此时为 INERROR。
ROLLBACK;
BEGIN;
INSERT INTO parents VALUES (99);
INSERT INTO children VALUES (1, 99);
COMMIT;

PostgreSQL 18.6 的自然错误为:

SQLSTATE: 23503
severity: ERROR
message_primary: insert or update on table "children" violates foreign key constraint "children_parent_fk"
message_detail: Key (parent_id)=(99) is not present in table "parents".
schema_name: c23503_fk_insert_missing_parent
table_name: children
constraint_name: children_parent_fk
source: ri_triggers.c / ri_ReportViolation / line 2783

PostgreSQL 10.21 的主报文和 detail 相同;对应源码行为位于第 3266 行。detail 取决于服务器是否有权限描述键值,可能不存在。不要把本地化的英文报文当作协议契约:应按 23503 分支,再读取结构化字段和操作上下文。

诊断

先记录失败语句、SQLSTATE、严重级别、主报文、detail、hint、服务器版本和事务状态。显式事务要分别记录错误后(INERROR)以及恢复后(IDLEINTRANS)的状态。后续的 25P02 表示客户端在事务已经失败时发送了命令;它是后续状态,不能替代 23503

使用 pg_constraintpg_get_constraintdef() 检查命名约束及其引用关系。结合适用的隔离级别检查尝试写入的键和父表。如果父行由另一个事务创建,应确认写入和提交顺序是否符合设计;固定等待并不能证明父行已经可见。

对于父键删除或更新,检查引用行以及 ON DELETEON UPDATE 声明的动作。延迟外键可能允许违规语句暂时成功,而在 COMMIT 时才报告 23503。日志和重试逻辑应保留这一时点。

处理与修复

选择符合关系语义的修复:

  • 像代表性案例一样,先创建或选择目标父行,再重试子行写入。
  • 如果子标识符过期或格式错误,修正子行标识符;不要关闭约束来掩盖数据错误。
  • 删除父行时,只有业务规则允许时才采用声明的级联、置空或限制动作;否则应先更新或归档引用行。
  • 如果父行由另一个事务写入,应采用能建立预期顺序和隔离级别的事务设计。回滚后重新读取,再决定是否重放旧的子行请求。

显式事务失败后,ROLLBACK 会丢弃其中的待提交工作并让连接回到 IDLE。当子行操作可选时,可以使用 savepoint 保留之前的工作。真正的修复应包括父行的实际读取、提交后的子行以及提交后查询;只执行 ROLLBACK 或打开新连接不能证明关系已经修好。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 23503,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。

代表性案例在 PostgreSQL 18.6 和 10.21 上通过。两个版本的源码行号不同;本页采用 SQLSTATE、约束身份和外键诊断形状作为兼容边界。延迟时点、权限、级联动作以及并发创建父行是独立维度,本次立即约束案例不覆盖它们。

23505unique_violation 处理唯一性不变量中的重复值。23502not_null_violation 处理必填列收到 NULL40001serialization_failure40P01deadlock_detected 描述可能围绕关系修复出现的并发结果。25P02in_failed_sql_transaction 是未处理错误之后的后续事务状态。

来源

本页结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;runtime 记录保留两个目标的 run ID 及结构化观察。

113 - 23505 — unique_violation:唯一性冲突

当行或索引操作违反唯一性约束时,PostgreSQL 会报告 23505。应先诊断对象和事务状态,再选择符合业务语义的修复。

速览

23505 是 PostgreSQL 的 unique_violation 条件。当行、索引构建或逻辑应用发现某个值不能与正在执行的唯一性约束共存时,就会产生这个状态码。

第一步应保存完整的 ErrorResponse 以及失败的语句。最有用的字段是 C(SQLSTATE)、M(主消息)、D(detail),以及在服务器提供时的 s(schema)、t(table)和 n(constraint 或 index)。在 psycopg 中,这些字段位于 exc.sqlstateexc.diag。对象字段属于线协议;它们不是 CSV 日志的标准列名,也不是 JSON 日志的标准键名。

恢复方式取决于错误发生的位置:

  • 自动提交语句失败,但连接可以继续接收下一条命令。
  • 显式事务中的语句失败后,事务进入中止状态。必须回滚整个事务,或回滚到保存点,然后才能继续发语句;否则 PostgreSQL 会返回 25P02
  • 延迟唯一约束可以暂时接受重复行,并在 COMMIT 时报告 23505
  • PL/pgSQL 的 EXCEPTION 块可以在子事务中捕获该冲突,但处理器必须足够窄,能够确认究竟是哪一个操作失败。

当前选定的公开运行记录按案例和目标覆盖 PostgreSQL 18.6 的 12 个独立通过案例,以及 PostgreSQL 10.21 的 11 个通过案例;NULLS NOT DISTINCT 在 PG10 标为不适用。完整运行仍为未被替代案例的来源;定向最终记录分别选择 DML 诊断、精确的 log_fields 关联、registry 片段和手动事务边界,不重复或覆盖这些案例。另有 PG14.24/PG15.19 的版本边界对照:PG14 的显式 UNIQUE NULLS NOT DISTINCT 只得到不支持语法的 42601,PG15 则在第二个 NULL 上实际得到 23505;该对照不计入上述基础数量。选定 run ID 和结构化观察保存在公开证据 JSON中;被替代的 summary 与原始 JSONL 仅保留为本地审计数据。

字段
SQLSTATE 23505
条件名 unique_violation
状态 有效
已知存在于 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_UNIQUE_VIOLATION
别名

上面的生成锁定快照表示目录定义文件的版本覆盖。本页的可执行兼容性目标是 PostgreSQL 18.6 和 10.21;目录条目不声称 23505 是 PostgreSQL 10 才引入的。

含义与触发路径

SQLSTATE 目录把 23505 放在 Class 23 integrity_constraint_violation 下,条件名为 unique_violation。在普通 btree 路径中,PostgreSQL 检查索引项;如果冲突的已提交键或并发插入键不符合索引语义允许的条件,就会报告错误。主键也是唯一索引,因此重复主键值同样使用这个状态码。

同一个 SQLSTATE 可以描述多种机制:

  1. 违反 DML 唯一约束或索引。 INSERT,以及改变键值的 UPDATE,都可能与唯一索引保护的已有行冲突。普通消息模板是 duplicate key value violates unique constraint "...",可选的 detail 是 Key (...)=(...) already exists.
  2. 构建唯一索引。 在已有重复行的表上构建唯一索引时使用另一套模板:could not create unique index "...",detail 为 Key (...)=(...) is duplicated.。这是索引构建失败,不是普通行插入消息。
  3. 延迟约束。 使用 DEFERRABLE INITIALLY DEFERRED 时,重复值可以留在事务中,直到提交时检查约束。因此错误对应 COMMIT,失败的顶层提交会回滚该事务。
  4. 逻辑复制应用。 PostgreSQL 18 会把应用冲突分类为 insert_exists 等;冲突报告器仍将相关的 insert、update 和 multiple-unique 路径映射到 23505。其消息形态和服务器日志上下文与客户端 btree 插入不同。本页有该路径的源码和文档证据,但当前运行批次没有建立 publisher/subscriber 拓扑。

状态码说明了条件所属的类别,但不能单独说明冲突是持久的业务重复、键选择竞态,还是维护操作失败。需要结合语句、schema、约束定义、事务上下文和并发活动作出判断。

下面的 SQL 代码块是与指定案例同一操作的说明性片段。权威可执行来源是 scripts/verify_cases.pyverify/cases/23505/cases.json;片段只省略临时 schema 命名和清理,并标明案例 ID,不构成第二套可运行案例定义。

报文与诊断字段

在 PostgreSQL 18.6 源码的 nbtinsert.c 普通路径中,服务器调用 BuildIndexValueDescription,报告唯一性错误,并附加表和约束身份。一次真实运行记录如下:

SQLSTATE: 23505
severity: ERROR
message_primary: duplicate key value violates unique constraint "users_email_key"
message_detail: Key (email)=(a@example.test) already exists.
schema_name: c23505_dml_unique_conflict
table_name: users
constraint_name: users_email_key
source: nbtinsert.c / _bt_check_unique

detail 不是必然存在的。如果调用者没有权限查看相关列,行级安全策略阻止描述,或者索引是表达式索引,PostgreSQL 可能省略键值。相同运行中的 INSERT-only 角色仍得到 SQLSTATE 和对象身份,但没有 message_detail

协议字段定义在 Error and Notice Message Fields 中。应从驱动异常读取这些字段,不要从日志解析器推断。18.6 的日志配置文档描述了 CSV 的 sql_state_codemessagedetail 等字段,以及 JSON 的 state_codemessagedetail 等键;两种格式都没有把协议中的 constraint_name 定义为标准日志字段。定向 log_fields run 按同一后端 PID、模式/表、约束、主消息和 detail 将 collector 记录与驱动诊断逐项匹配:PostgreSQL 18.6 同时得到 CSV 和 JSON,PostgreSQL 10.21 得到 CSV。

索引构建报文明确不同:

SQLSTATE: 23505
message_primary: could not create unique index "idx_concurrent"
message_detail: Key (email)=(dup) is duplicated.
source: tuplesortvariants.c / comparetup_index_btree_tiebreak

不要只解析英文报文来分类错误。应先按 SQLSTATE 分支,再使用结构化字段和操作上下文。消息文本可能随本地化变化,而五字符 SQLSTATE 是稳定的线协议值。

诊断

记录失败语句、SQLSTATE、主消息、detail、hint、schema/table/constraint 字段、服务器版本和事务状态。驱动应保留原始异常;通用 ORM 错误字符串可能丢掉定位冲突对象所需的字段。

针对某个表,在修改数据前同时检查约束和索引。下面两条查询就是运行器使用的 diagnostic_catalog_queries;隔离运行会对其 accounts 表实际执行:

SELECT conname, contype, condeferrable, condeferred,
       pg_get_constraintdef(oid)
FROM pg_constraint
WHERE conrelid = 'accounts'::regclass;

SELECT indexrelid::regclass AS index_name,
       indisunique, indisvalid, indisready, indislive,
       pg_get_indexdef(indexrelid)
FROM pg_index
WHERE indrelid = 'accounts'::regclass;

对于普通 DML 错误,将尝试写入的键与命名约束保护的行进行比较。检查该表上的每一项唯一性约束;语句指定了一个冲突目标,也仍可能违反另一个唯一约束。对于索引构建错误,在重试前找出重复键,并在并发构建失败后检查 pg_index

运行案例 concurrent_unique_conflict 使用两个会话和一个观察会话。会话 A 持有未提交的 token='raced';在 A 提交前,观察会话看到 B 的语句 wait_event_type=Lockwait_event=transactionid。A 提交后,B 收到 23505,并在回滚前处于 INERROR。这个同步条件证明了事件顺序;固定 sleep 不能提供同等证据。

处置与修复

先恢复事务(案例:explicit_tx_abort_recoverysavepoint_recovery

启用自动提交时,失败操作已经结束,运行案例中的连接状态为 IDLE。应用应先决定如何处理输入,再发起下一条命令。

在显式事务中,第一次失败后不要继续使用该连接,先处理失败事务:

下面的 INSERT INTO items VALUES (3, 'seed') 是真实的重复键触发;后面的 ROLLBACK 是必须的恢复操作。

CREATE TABLE items(id integer PRIMARY KEY, note text UNIQUE NOT NULL);
INSERT INTO items VALUES (1, 'seed');
BEGIN;
INSERT INTO items VALUES (2, 'outer');
INSERT INTO items VALUES (3, 'seed');
ROLLBACK;
BEGIN;
INSERT INTO items VALUES (2, 'after rollback');
COMMIT;

如果只有一小段工作是可选的,可以使用保存点保留外层工作:

保存点之后的插入复用了已经准备好的唯一值,因此是真实的 23505 触发;ROLLBACK TO SAVEPOINT 只撤销这段失败的子事务。

CREATE TABLE items(id integer PRIMARY KEY, note text UNIQUE NOT NULL);
INSERT INTO items VALUES (1, 'seed');
BEGIN;
INSERT INTO items VALUES (2, 'outer');
SAVEPOINT unique_case;
INSERT INTO items VALUES (3, 'seed');
-- 事务失败时,这条语句预期返回 25P02。
SELECT count(*) FROM items;
ROLLBACK TO SAVEPOINT unique_case;
INSERT INTO items VALUES (3, 'after savepoint');
RELEASE SAVEPOINT unique_case;
COMMIT;

运行器在回滚前执行 SELECT 时观察到 25P02,在 ROLLBACK TO SAVEPOINT 后观察到 INTRANS。普通 ROLLBACK 会让显式事务回到 IDLEROLLBACK TO 会保留保存点之前的工作。

延迟约束会改变错误发生的阶段(案例:deferred_commit_conflict)。在真实案例中,两次重复插入在连接处于 INTRANS 时都成功;随后 COMMIT23505,连接回到 IDLE,失败顶层事务产生的行数为零。应在提交前修复键,或回滚并重试整个工作单元。

PL/pgSQL 可以在异常块中处理自然产生的唯一性冲突(案例:plpgsql_exception_recovery):

CREATE TABLE items(id integer PRIMARY KEY, note text);
INSERT INTO items(id, note) VALUES (1, 'seed');

CREATE FUNCTION try_insert(wanted integer) RETURNS text
LANGUAGE plpgsql AS $$
DECLARE returned_state text;
BEGIN
    INSERT INTO items(id, note) VALUES (wanted, 'body');
    RETURN 'inserted';
EXCEPTION WHEN unique_violation THEN
    GET STACKED DIAGNOSTICS returned_state = RETURNED_SQLSTATE;
    INSERT INTO items(id, note) VALUES (wanted + 1, 'handler');
    RETURN returned_state;
END
$$;

SELECT try_insert(1);

受保护的代码块具有子事务行为。发生错误时,该代码块内部已经写入的持久化改动会在处理器运行前回滚;进入代码块之前的改动仍会保留。异常块应保持窄范围:如果其中有多条可能违反不同唯一约束的语句,那么捕获到 unique_violation 本身不能证明是哪一条操作造成了它。PostgreSQL 的 PL/pgSQL 文档也针对通用 upsert 处理器提醒了这一点。

选择符合业务语义的操作(案例:on_conflict_target_scope

ON CONFLICT 用于表达明确的冲突策略,不是隐藏所有重复行的通用指令。冲突目标决定 arbiter。在运行案例中,已有行占用了 phone='phone-1'

CREATE TABLE accounts(
    id integer PRIMARY KEY,
    email text NOT NULL,
    phone text NOT NULL,
    CONSTRAINT accounts_email_uq UNIQUE (email),
    CONSTRAINT accounts_phone_uq UNIQUE (phone)
);
INSERT INTO accounts VALUES (1, 'existing@example.test', 'phone-1');

INSERT INTO accounts(id,email,phone)
VALUES (2, 'existing@example.test', 'phone-2')
ON CONFLICT (email) DO NOTHING;

-- 只处理 email 冲突。仅 phone 冲突时仍会产生 23505。
INSERT INTO accounts(id,email,phone)
VALUES (3, 'new@example.test', 'phone-1')
ON CONFLICT (email) DO NOTHING;

-- 省略 target 时,DO NOTHING 覆盖任一可用 arbiter 的冲突。
INSERT INTO accounts(id,email,phone)
VALUES (4, 'third@example.test', 'phone-1')
ON CONFLICT DO NOTHING;

对于 DO UPDATE,应确保更新是确定性的,并检查其业务结果。对于幂等键,应将传入请求的相关身份和参数与已存请求比较,再核对已有业务结果,然后才能返回“已经处理”。仅发生幂等键碰撞,不能证明先前请求等价。

谨慎修复序列(案例:sequence_lag_repair

手动指定键可能使序列落后于表。受控运行案例使用了非默认序列:

下面第二个使用 nextval 的插入是真实的重复键触发;setval 后又执行了一次真实插入,以验证修复后的下一个值。

CREATE SEQUENCE ids_seq START WITH 100 INCREMENT BY 7 MINVALUE 100 MAXVALUE 100000;
CREATE TABLE items(id integer PRIMARY KEY, note text);
INSERT INTO items(id,note) VALUES (100, 'explicit');
INSERT INTO items(id,note) VALUES (nextval('ids_seq'), 'generated');
SELECT setval('ids_seq', (SELECT max(id) FROM items), true);
INSERT INTO items(id,note) VALUES (nextval('ids_seq'), 'after repair');

受控 setval 后下一值为 107。这种修复有明确前提:暂停写入者,确认序列身份和所有关系,空表不能传入无效值,并检查 increment、边界、cache 和 is_calledsetval 不是通用的并发修复;序列变更也不会像普通表写入那样回滚。

只有在操作可重试时才重试

序列化失败处理文档 说明了某些并发选择键的场景可能以 23505 呈现。应用确认属于这种语义后,应重试完整事务(包括选择键的逻辑),并配合有界退避和幂等策略。不要盲目重试:用户明确请求的重复可能是永久条件,反复尝试也可能得到同一冲突。

双会话案例证明了锁顺序建立后会出现冲突,但运行器没有声称所有相同状态码的业务操作都可以安全重试。

处理并发索引构建失败(案例:index_build_conflict

CREATE INDEX 文档 说明,如果并发构建的扫描遇到唯一性失败等问题,可能留下 INVALID 索引。在本次重复扫描案例中,pg_index 显示 indisvalid=falseindisready=falseindislive=trueindisunique=true;普通事务性构建回滚后没有留下索引。解决重复数据后检查实际目录状态,适当时删除遗留的无效索引,再重新构建。不要把这一状态推广到 CREATE INDEX CONCURRENTLY 的所有失败阶段。

版本与边界

PostgreSQL 10.21 和 18.6 都实际观察到了相同 SQLSTATE。两版源码行号和内部函数名不同;兼容性判断应使用 SQLSTATE 与操作上下文,而不是使用源码行号。

UNIQUE NULLS NOT DISTINCT 在 PostgreSQL 15 及以后可用,且必须显式选择。运行案例向默认唯一列插入两个 NULL 成功;向单独声明的 UNIQUE NULLS NOT DISTINCT 约束插入第二个 NULL 时产生 23505。升级不会默默把旧约束的默认语义改成 NULLS NOT DISTINCT。

单独的版本边界对照已经实际记录了可用性和行为:PostgreSQL 14.24 接受普通唯一列的两个 NULL,但显式声明因 42601 拒绝且没有 23505;PostgreSQL 15.19 在显式约束的第二个 NULL 上产生 23505,自动提交会话保持 IDLE,并成功提交有效值修复。这些记录单独保留,不增加基础选定案例数量。在其他临时目标上执行时,应先检查版本并按分支运行:先执行 ordinary_createordinary_firstordinary_secondordinary_verify,再执行 explicit_create;如果得到 PG14 预期的 42601,就在这里停止,不要发送 explicit_firstexplicit_secondexplicit_repairexplicit_verify。只有 explicit_create 在 PG15 或更高版本成功后,才继续显式插入、观察第二个 NULL 的结果,再执行修复和验证。

-- ordinary_create
CREATE TABLE ordinary_nulls (external_id integer UNIQUE);
-- ordinary_first
INSERT INTO ordinary_nulls VALUES (NULL);
-- ordinary_second
INSERT INTO ordinary_nulls VALUES (NULL);
-- ordinary_verify
SELECT count(*) FROM ordinary_nulls;
-- explicit_create
CREATE TABLE explicit_nulls (external_id integer, CONSTRAINT nulls_not_distinct_uq UNIQUE NULLS NOT DISTINCT (external_id));
-- explicit_first
INSERT INTO explicit_nulls VALUES (NULL);
-- explicit_second
INSERT INTO explicit_nulls VALUES (NULL);
-- explicit_repair
INSERT INTO explicit_nulls VALUES (1);
-- explicit_verify
SELECT count(*) FROM explicit_nulls;

PostgreSQL 18 的逻辑冲突报告器使用 insert_exists 等标签。消息改变并不意味着相关唯一冲突换成了别的 SQLSTATE。本批证据来自源码和文档;运行报告没有声称测试了复制拓扑。

锁定目录在 PostgreSQL 7.4 的定义中已观察到 23505,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。

来源与证据

本页使用的证据 ID 是公开证据 JSON中的 identity.class-and-conditionruntime.dml-templateruntime.protocol-fieldsruntime.index-build-templateruntime.logical-apply-sqlstateruntime.tx-contextsruntime.retry-boundaryruntime.on-conflict-scoperuntime.sequence-repair-limitruntime.nulls-choiceruntime.detail-visibilityruntime.version-boundary。选定的运行记录对未替代案例使用完整运行,对 DML 使用 23505-diagnostic-snippet-20260909,对精确 collector 关联使用 23505-log-fields-final-20260909,对 registry 片段使用 23505-snippet-contract-20260909,对显式事务和保存点恢复使用 manual-boundary run。单独的边界记录是 runtime.23505-boundary-pg14-20260909.pg14runtime.23505-boundary-pg15-20260909.pg15,用于版本对照,不增加基础案例数量。被替代的完整运行选择仅保留为本地审计数据。

114 - 23514 — CHECK 约束冲突(check_violation)

PostgreSQL SQLSTATE 23514:CHECK 约束冲突的来源与诊断参考。

23514 — CHECK 约束冲突

速览

23514 表示 CHECK 或相关行约束计算为假。本案例中的约束名为 amount_positive,报文带出表、约束和失败行。

字段
SQLSTATE 23514
条件名 check_violation
状态 有效
已知存在于 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_CHECK_VIOLATION
别名

含义

普通表行由执行器计算 CHECK 表达式,结果为假时报告 23514;CHECK 表达式为 NULL 时在 PostgreSQL 中通过,若 NULL 本身不允许,需要另加 NOT NULL。分区路由可能返回 no partition of relation ... found for row 及分区键 DETAIL,分区约束校验则使用分区约束报文;域校验有“values that violate the new constraint”模板,空的 WITHOUT OVERLAPS 值也有独立源码路径。它们使用同一 SQLSTATE,但机制和报文不同。

诊断

记录约束名、表名和失败行或分区键 DETAIL,按实际类型、隐式类型转换、触发器改写和 NULL 规则重算表达式。遇到分区错误时检查分区边界及该键的路由结果;域或校验时错误则确认实际执行的是哪个模式对象规则。本案例自动提交错误后为 IDLE;显式事务仍须按调用边界回滚。

处理

修正值或业务规则后重试。修改约束前先校验既有数据,不要为了掩盖坏数据而禁用 CHECK;分区场景应选择允许该值的分区,而不是把错误当作普通重复提交。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 23514;primary new row for relation "items" violates check constraint "amount_positive";DETAIL Failing row contains (2, -1).;status_after_error IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 23514;primary new row for relation "items" violates check constraint "amount_positive";DETAIL Failing row contains (2, -1).;status_after_error IDLE

代表案例

本例第一次插入因 amount-1 违反命名 CHECK;改为 1 即为具体修复。完整 setup、断言与清理见案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, amount integer CONSTRAINT amount_positive CHECK (amount > 0));
-- seed
INSERT INTO items VALUES (1, 10);
-- trigger
INSERT INTO items VALUES (2, -1);
-- repair
INSERT INTO items VALUES (2, 1);
-- verify
SELECT id, amount FROM items ORDER BY id;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自经核对的案例 registry;见结构化证据案例导出

作者证据 ID:identity, row-path, schema-path, runtime。选定运行记录:runtime.23514-batch1-latest-20260909.latest, runtime.23514-batch1-pg10-20260909.pg10

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定运行覆盖 18.6 与 10.21 的立即 named CHECK INSERT;未覆盖分区路由、域校验、校验时错误或 WITHOUT OVERLAPS 路径。固定 DDL 文档说明 CHECK 在表达式为真或 NULL 时通过,没有定义 DEFERRABLE CHECK 路径。

对比 23502 非空约束冲突23P01 排除约束冲突23505 唯一约束冲突

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.execMain.18.6 (SHA-256 33b97337fa23a649c5e7a092e1bd405a54e8503529236c62c9d5bb93a1774a8d)
  • src.tablecmds.18.6 (SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9)
  • src.execPartition.18.6 (SHA-256 97951428f673d4eb6dd23141817874c29640aaac0d6dc74015c993cbd0636dd6)
  • src.typecmds.18.6 (SHA-256 60d1e9754646e100f6b74aa367ad8c2c52386c400df721707423d329209c47eb)
  • src.execIndexing.18.6 (SHA-256 24c80553ab4b28d7d2a288dd9196c8db9459c7f308853cd8c8c939485e15f199)
  • doc.ddl-constraints.18.6 (SHA-256 ce1919d9236f2e71672660e1a347146472e966e4d19b77fde5ae345dd1db6ec7) · 官方文档

115 - 23P01 — 排除约束冲突(exclusion_violation)

PostgreSQL SQLSTATE 23P01:排除约束冲突的来源与诊断参考。

23P01 — 排除约束冲突

速览

23P01 表示排除约束发现已有行与新行在所有配置运算符上冲突。本案例使用 && 检查范围重叠,因此拒绝的是重叠而不只是相等值。

字段
SQLSTATE 23P01
条件名 exclusion_violation
状态 有效
已知存在于 9.0.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_EXCLUSION_VIOLATION
别名

含义

排除约束结合索引访问方法和运算符;[5,12)[1,10) 重叠,而半开范围 [10,12) 在 10 处不重叠。运算符类和约束配置的运算符组合决定冲突;DEFERRABLE 会改变检查时点。

诊断

记录约束名、DETAIL 中的键值,以及约束是否延迟。按相同运算符检查现有行,不能只做相等比较。立即约束在语句边界报错,DEFERRABLE 约束可能在 SET CONSTRAINTSCOMMIT 时才报错。本案例是立即检查、自动提交,错误后连接为 IDLE

处理

选择不冲突的值,或按应用并发策略协调冲突的预订或资源。自动提交时,失败语句结束自己的事务边界,连接可以继续使用。显式事务中,无论立即检查还是延迟检查报错,都可能使事务进入失败状态;重试前应执行 ROLLBACK,若应用刻意用保存点隔离该操作,则可执行 ROLLBACK TO SAVEPOINT 保留外层事务。DEFERRABLE 冲突可能在 SET CONSTRAINTSCOMMIT 才报告,因此应从该检查时点要求的干净边界重做完整操作;只有冲突确实可能消失且操作安全时才重试。不要脱离业务规则随意改范围端点。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 23P01;primary conflicting key value violates exclusion constraint "bookings_no_overlap";DETAIL Key (during)=([5,12)) conflicts with existing key (during)=([1,10)).;status_after_error IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 23P01;primary conflicting key value violates exclusion constraint "bookings_no_overlap";DETAIL Key (during)=([5,12)) conflicts with existing key (during)=([1,10)).;status_after_error IDLE

代表案例

本例第二个预订与已有范围重叠;把下界移到已有范围的上界即可修复。完整 setup、断言与清理见案例导出

-- create
CREATE TABLE bookings(id integer PRIMARY KEY, during int4range NOT NULL, CONSTRAINT bookings_no_overlap EXCLUDE USING gist (during WITH &&));
-- seed
INSERT INTO bookings VALUES (1, int4range(1, 10));
-- trigger
INSERT INTO bookings VALUES (2, int4range(5, 12));
-- repair
INSERT INTO bookings VALUES (2, int4range(10, 12));
-- verify
SELECT id, during::text FROM bookings ORDER BY id;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自经核对的案例 registry;见结构化证据案例导出

作者证据 ID:identity, mechanism, runtime。选定运行记录:runtime.23P01-batch1-latest-20260909.latest, runtime.23P01-batch1-pg10-20260909.pg10

版本与边界

锁定目录从 9.0.0 起观察到 23P01,并在列出的正式快照中均存在。选定的立即范围案例在 18.6 与 10.21 通过;未测试延迟或并发排除检查。

对比 23505 唯一约束冲突23514 CHECK 冲突23001 RESTRICT 冲突

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.execIndexing.18.6 (SHA-256 24c80553ab4b28d7d2a288dd9196c8db9459c7f308853cd8c8c939485e15f199)
  • doc.rangetypes.18.6 (SHA-256 cfeffb134d2acc2ec45141726583b041410665c4a2f8ecf66cd3f9484a7f0014) · 官方文档

116 - 24000 — 游标状态无效(invalid_cursor_state)

PostgreSQL SQLSTATE 24000:游标状态无效的来源与诊断参考。

24000 — 游标状态无效

速览

24000 表示游标或 portal 状态不满足当前操作。本案例声明了有效游标,却在 FETCH 定位前执行 WHERE CURRENT OF,因而报“游标未定位到行”。

字段
SQLSTATE 24000
条件名 invalid_cursor_state
状态 有效
已知存在于 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_INVALID_CURSOR_STATE
别名

含义

WHERE CURRENT OF 要求游标来自可更新查询,并已通过 FETCH 选中当前行;声明本身不会定位。其他非 SELECT、已保持、不可更新或缺少 FOR UPDATE/SHARE 引用的游标也有不同 24000 模板。

诊断

记录游标名和操作,检查声明、事务生命周期、FETCH 方向及可更新性。显式事务错误后本案例为 INERROR,回滚后回到 IDLE;本案例用主键直接更新修复,未测试重新 DECLARE/FETCH。

处理

先 FETCH 定位再使用 CURRENT OF,或者使用确定性的键更新。保持游标和事务生命周期显式,失败事务先回滚。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 24000;primary cursor "item_cursor" is not positioned on a row;after_error INERROR;after_rollback IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 24000;primary cursor "item_cursor" is not positioned on a row;after_error INERROR;after_rollback IDLE

代表案例

运行器从 verify/cases/24000/snippets.json(SHA-256 cafca57825378362df0527384614bf658bf86cd3101e1eb520ea0641819f2789)读取下列片段,并为临时 schema 替换表名;完整 setup、断言与清理见 案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, note text NOT NULL);
-- seed
INSERT INTO items VALUES (1, 'seed');
-- begin
BEGIN;
-- declare
DECLARE item_cursor CURSOR FOR SELECT id FROM items FOR UPDATE;
-- trigger
UPDATE items SET note = 'bad' WHERE CURRENT OF item_cursor;
-- rollback
ROLLBACK;
-- repair
UPDATE items SET note = 'repaired' WHERE id = 1;
-- verify
SELECT id, note FROM items;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自上述共享 registry;结构化证据 · 案例导出

作者证据 ID:identity, current-of, runtime。选定运行记录:runtime.24000-batch1-latest2-20260909.latest, runtime.24000-batch1-pg10-20260909.pg10

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定运行覆盖 18.6 与 10.21 的 FETCH 前 CURRENT OF 路径;其他游标状态需要独立案例。

对比 25001 活动 SQL 事务25P02 失败 SQL 事务34000 无效游标名称

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.execCurrent.18.6 (SHA-256 45c8e48b3a5dc46f1014482dc88e0a26c25c3a4c403372112474d9171253d8a9)
  • doc.declare.18.6 (SHA-256 f1d72befb9a989aa32123560aea784a8bccfcb3d3930804a101d8245e5a3cc95) · 官方文档
  • doc.update.18.6 (SHA-256 47dd724cd724bd77478215a4853aa1f985996a0e5bba9b2451a1ad1ebb6e51fc) · 官方文档

117 - 25000 — 事务状态无效(invalid_transaction_state)

PostgreSQL SQLSTATE 25000:事务状态无效的来源与诊断参考。

25000 — 事务状态无效

速览

25000 是 Class 25 的宽泛“事务状态无效”。锁定的 18.6 源码把它用于并行操作中执行 utility、创建保存点等内部状态;本批不声称有安全的普通 SQL 复现。

字段
SQLSTATE 25000
条件名 invalid_transaction_state
状态 有效
已知存在于 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_INVALID_TRANSACTION_STATE
别名

含义

事务状态不能简单等同于“存在一个事务”。25001 表示活动事务阻止命令,25P02 表示失败事务;18.6 调用扫描还显示堆、事务、utility、GUC 和保存点路径中的并行操作保护。

诊断

先区分失败事务、活动事务块限制和并行操作状态,保留服务器原始 SQLSTATE 与报文。内部并行路径需要日志和上下文,不能把普通“事务已打开”误认成 25000

处理

遵循命令的事务/并行契约;可恢复的客户端状态按精确回滚或重试边界处理。不要用 RAISE 制造自然结果。

源码报文模板

  • parallel-savepoint:primary cannot define savepoints during a parallel operation(ERROR)
  • parallel-utility:primary cannot execute %s during a parallel operation(ERROR)

适用边界

本批没有为 25000 构造自然 SQL 触发器;请把它视为源码/协议边界,而不是可直接复制的复现脚本。结构化证据 · 案例导出

作者证据 ID:identity, core-paths, boundary。选定运行记录:—。

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。18.6 源码扫描确认了本文引用的并行操作路径;由于所需内部状态不是安全的独立 SQL 前置条件,本文没有运行案例。

对比 25001 活动 SQL 事务25P02 失败 SQL 事务40001 序列化失败

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.xact.18.6 (SHA-256 75b012c0b047d1dc905a30975c244beec366e45eac0dbf109fd21bcd611a8e39)
  • src.utility.18.6 (SHA-256 7aae5d07628b6debf8456d1d4ea96f28912232192e56ea25773b4c4b61235a00)

118 - 25001 — 活动 SQL 事务(active_sql_transaction)

PostgreSQL SQLSTATE 25001:活动 SQL 事务的来源与诊断参考。

25001 — 活动 SQL 事务

速览

25001 表示当前活动 SQL 事务违反了命令要求的事务边界。本案例在 BEGIN 后执行 VACUUM,得到精确错误;回滚后在事务块外执行 VACUUM 成功且连接保持 IDLE

字段
SQLSTATE 25001
条件名 active_sql_transaction
状态 有效
已知存在于 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_ACTIVE_SQL_TRANSACTION
别名

含义

该码覆盖多条路径:PreventInTransactionBlock 会拒绝事务块、子事务或函数中的禁用 utility,源码分别格式化为 %s cannot run inside a transaction block%s cannot run inside a subtransaction%s cannot be executed from a function。其他路径会拒绝写入后的逻辑复制槽、子事务中的快照导出,或查询开始后的导入快照设置。在已经活动的事务中再次 BEGIN 是独立的 WARNING,因此严重级别和恢复方式取决于具体源码路径。

诊断

记录 SQLSTATE、严重级别、主报文、事务状态和命令。本案例的 VACUUM ERROR 后显式会话进入 INERROR,只有 ROLLBACK 恢复 IDLE。函数或子事务报错时,应先结束该上下文,再把命令作为位于任何显式事务块之外的一条独立顶层 utility 命令发出(例如驱动自动提交的单条命令);在同一 wrapper 内重试仍不满足 PreventInTransactionBlock。逻辑复制槽和快照报错则要检查是否已有写入、子事务或查询;“事务已在进行中”的 WARNING 不是 VACUUM 的 ERROR,本身不要求回滚。随后选定修复在事务块外执行 VACUUM,并断言成功和 IDLE

处理

禁用 utility 若位于不合适的事务块、函数或子事务中,应移到位于任何显式事务块之外的一条独立顶层命令(通常在自动提交连接上执行);不要把“顶层”理解为另一个 BEGIN。显式事务中的 ERROR 后先执行 ROLLBACK,再执行该命令。逻辑复制槽必须在此前没有写入的事务中创建;快照导出不能位于子事务,SET TRANSACTION SNAPSHOT 必须早于任何查询。重复 BEGINWARNING 应保留已有事务,不要仅因警告就回滚。应按精确源码路径处理,不能机械套用 VACUUM 修复。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 25001;primary VACUUM cannot run inside a transaction block;after_error INERROR;after_rollback IDLE;status_after_vacuum IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 25001;primary VACUUM cannot run inside a transaction block;after_error INERROR;after_rollback IDLE;status_after_vacuum IDLE

源码报文模板

选定的 VACUUM 运行没有覆盖以下源码分支:

  • ERROR %s cannot run inside a subtransaction%s 替换为命令名)。
  • ERROR %s cannot be executed from a function%s 替换为命令名)。
  • ERROR cannot create logical replication slot in transaction that has performed writes
  • ERROR cannot export a snapshot from a subtransaction
  • ERROR SET TRANSACTION SNAPSHOT must be called before any query
  • WARNING there is already a transaction in progress

这些是源码证据,不是本案例新增的运行结论。

代表案例

本例中,VACUUM 在显式 BEGIN 块内被拒绝;ROLLBACK 后,同一 utility 作为事务块外的独立命令成功。完整 setup、断言与清理见案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, note text NOT NULL);
-- seed
INSERT INTO items VALUES (1, 'seed');
-- begin
BEGIN;
-- trigger
VACUUM items;
-- rollback
ROLLBACK;
-- followup
SELECT 1 AS usable;
-- repair
VACUUM items;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自经核对的案例 registry;见结构化证据案例导出

作者证据 ID:identity, utility-path, other-paths, runtime。选定运行记录:runtime.25001-batch1-latest2-20260909.latest, runtime.25001-batch1-pg10b-20260909.pg10

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定的 VACUUM 案例在 18.6 与 10.21 通过,包含回滚恢复和事务块外成功修复;其他 25001 路径仅有源码证据。

对比 25000 事务状态无效25P02 失败 SQL 事务24000 游标状态无效

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.xact.18.6 (SHA-256 75b012c0b047d1dc905a30975c244beec366e45eac0dbf109fd21bcd611a8e39)
  • src.logical.18.6 (SHA-256 3f1bd4c3e627fe78522c4dc9bacf9fa8200e6c82c2d01f7670706eee102b76d1)
  • src.snapmgr-export.18.6 (SHA-256 b605b69e77a026c143f4cabca079de364b9a8732bfc40f7595be44fb0971ee8)
  • src.snapmgr-set-snapshot.18.6 (SHA-256 b605b69e77a026c143f4cabca079de364b9a8732bfc40f7595be44fb0971ee8)
  • doc.vacuum.18.6 (SHA-256 80ca5592cda7b74938385f84f09faac33574374c1a05d605a2d55982e4cf1bbf) · 官方文档

119 - 25002 — 分支事务已活动(branch_transaction_already_active)

PostgreSQL SQLSTATE 25002:分支事务已活动的来源与诊断参考。

25002 — 分支事务已活动

速览

25002 表示分支事务已经活动,范围窄于 25001,也不同于 25P02。本文只记录锁定条件定义和 18.6 核心调用扫描未发现直接报文路径的边界。

字段
SQLSTATE 25002
条件名 branch_transaction_already_active
状态 有效
已知存在于 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_BRANCH_TRANSACTION_ALREADY_ACTIVE
别名

含义

它属于 Class 25,但不应作为嵌套事务或普通保存点的总称。核心 errcodes.txt 定义了宏;项目对 18.6 核心解析调用的穷尽扫描没有找到 25002 报告组。

诊断

使用精确 SQLSTATE 和事务上下文,区分分支管理 API、保存点、活动事务块和失败事务。没有核心调用点不代表可以从别的码推断报文或触发器。

处理

保留分支管理操作及其事务边界,按创建该分支的 API 处理。本批没有确认安全自然触发,不用 RAISE 代替。

源码报文模板

适用边界

本批没有为 25002 构造自然 SQL 触发器;请把它视为源码/协议边界,而不是可直接复制的复现脚本。结构化证据 · 案例导出

作者证据 ID:identity, source-boundary。选定运行记录:—。

版本与边界

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。18.6 核心调用扫描没有解析出的路径;扩展或未来源码可能增加路径。

对比 25001 活动 SQL 事务25000 事务状态无效3B000 保存点异常

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

120 - 25003 — 分支事务访问模式不适用(inappropriate_access_mode_for_branch_transaction)

PostgreSQL SQLSTATE 25003:分支事务访问模式不适用的源码边界与诊断参考。

25003 — 分支事务访问模式不适用(inappropriate_access_mode_for_branch_transaction)

速览

25003 表示分支事务使用了不适用的访问模式。固定的 PostgreSQL 18.6 核心调用扫描没有解析出直接报错点,因此本文记录定义边界,不虚构普通 SQL 触发器。

字段
SQLSTATE 25003
条件名 inappropriate_access_mode_for_branch_transaction
状态 有效
已知存在于 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_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION
别名

含义

该条件名属于 Class 25,描述的是分支事务管理。不要把它当作 25006 只读 SQL 事务、25P01 缺少事务块或应用自定义异常的同义词。

诊断

若分支事务 API 报出此码,应保留精确 SQLSTATE、API 操作、访问模式和事务上下文。当前固定核心证据没有确认服务器报文模板,也没有安全的 SQL 复现。

处理

先按分支事务 API 的契约修正访问模式,再决定是否重试。不要用 RAISE 替代缺失路径,也不要把普通只读语句误按此码重试。

源码报文与运行边界

固定 errcodes.txt 定义了该条件和宏;raw/calls/REL_18_6.jsonl 的解析调用扫描没有直接报错组,因此本批不发布报文模板,也不构造自然 SQL 触发器。

适用边界与案例

本批运行器在 PostgreSQL 18.6 与 10.21 的选定 case 均为 not_applicable,只记录源码边界,没有可复制的 SQL 触发过程。结构化证据 · 案例导出

版本与边界

锁定目录按上方生成事实记录该条件的已知边界和快照。运行状态明确为不适用:两个选定 runner 目标记录的是仅源码边界,不是自然触发通过。

25004 分支事务隔离级别25006 只读 SQL 事务25P01 没有活动 SQL 事务

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

121 - 25004 — 分支事务隔离级别不适用(inappropriate_isolation_level_for_branch_transaction)

PostgreSQL SQLSTATE 25004:分支事务隔离级别不适用的源码边界与诊断参考。

25004 — 分支事务隔离级别不适用(inappropriate_isolation_level_for_branch_transaction)

速览

25004 表示分支事务使用了不适用的隔离级别。固定 PostgreSQL 18.6 核心解析调用扫描没有该码的直接报错组,因此不声称存在普通 SQL 复现。

字段
SQLSTATE 25004
条件名 inappropriate_isolation_level_for_branch_transaction
状态 有效
已知存在于 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_INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION
别名

含义

这是分支事务条件,区别于 40001 可串行化失败,也区别于普通事务中 SET TRANSACTION ISOLATION LEVEL 的检查。

诊断

诊断时应同时保留分支 API、请求的隔离级别和事务状态。现有源码证据不足以借用其他隔离级别错误的报文。

处理

修正分支 API 的隔离级别协商后,只有 API 明确定义可重试时才重试。普通 SQL 会话应按实际返回的 SQLSTATE 诊断。

源码报文与运行边界

固定 errcodes.txt 定义了该条件和宏;raw/calls/REL_18_6.jsonl 的解析调用扫描没有直接报错组,因此本批不发布报文模板,也不构造自然 SQL 触发器。

适用边界与案例

本批运行器在 PostgreSQL 18.6 与 10.21 的选定 case 均为 not_applicable,只记录源码边界,没有可复制的 SQL 触发过程。结构化证据 · 案例导出

版本与边界

生成事实记录锁定的目录快照。两个 runner 目标都是 case 状态为 not_applicable 的源码边界观察,不把自然触发计入运行覆盖。

25003 分支事务访问模式40001 可串行化失败25P01 没有活动 SQL 事务

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

122 - 25005 — 分支事务没有活动 SQL 事务(no_active_sql_transaction_for_branch_transaction)

PostgreSQL SQLSTATE 25005:分支事务没有活动 SQL 事务的源码边界与诊断参考。

25005 — 分支事务没有活动 SQL 事务(no_active_sql_transaction_for_branch_transaction)

速览

25005 是分支事务版本的“没有活动 SQL 事务”条件,与 25P01 不同;固定 PostgreSQL 18.6 核心扫描没有解析出自然服务器调用点。

字段
SQLSTATE 25005
条件名 no_active_sql_transaction_for_branch_transaction
状态 有效
已知存在于 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_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION
别名

含义

该码属于分支事务家族。普通会话在 BEGIN 外执行 SAVEPOINT 走的是其他页面展示的 25P01 路径,不应改称 25005

诊断

记录分支 API 操作以及当时是否有活动分支事务。固定扫描没有解析出核心报文,因此精确服务器文本必须来自实际发出该码的实现。

处理

按该 API 契约结束或启动分支事务。不要仅凭名称套用通用回滚步骤,也不要伪造 PL/pgSQL 复现。

源码报文与运行边界

固定 errcodes.txt 定义了该条件和宏;raw/calls/REL_18_6.jsonl 的解析调用扫描没有直接报错组,因此本批不发布报文模板,也不构造自然 SQL 触发器。

适用边界与案例

本批运行器在 PostgreSQL 18.6 与 10.21 的选定 case 均为 not_applicable,只记录源码边界,没有可复制的 SQL 触发过程。结构化证据 · 案例导出

版本与边界

锁定目录包含生成的历史成员事实。选定的 latest 与 PG10 case 都明确记录为仅源码边界,不算自然运行通过。

25P01 没有活动 SQL 事务25003 分支事务访问模式25P02 失败 SQL 事务

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

123 - 25006 — 只读 SQL 事务(read_only_sql_transaction)

PostgreSQL SQLSTATE 25006:只读 SQL 事务失败、诊断与修复所需的事务边界。

25006 — 只读 SQL 事务(read_only_sql_transaction)

速览

25006 表示命令试图在只读事务中写入。选定案例在 SET TRANSACTION READ ONLY 后执行 CREATE TABLE,观察到 INERROR,回滚后离开只读事务再建表。

字段
SQLSTATE 25006
条件名 read_only_sql_transaction
状态 有效
已知存在于 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_READ_ONLY_SQL_TRANSACTION
别名

含义

该码覆盖多个保护点。PreventCommandIfReadOnly 把命令名填入 cannot execute %s in a read-only transaction;固定源码还包含恢复期间临时表和复制原点的专用报文。选定案例覆盖普通显式只读事务路径,而备用机或恢复路径可能使用不同的命令相关报文。

诊断

记录精确命令、SQLSTATE、严重级别和事务状态。重试前检查有效的 SHOW transaction_read_only,并在需要判断服务器边界时检查 pg_is_in_recovery();同时确认连接池是否把连接路由到了备用机。选定运行中 CREATE TABLE 返回 25006,使显式事务块进入 INERROR;复用会话前必须 ROLLBACK。离开只读事务后再次 CREATE TABLE 成功。

处理

先判断操作是否应放在只读事务中。若必须写入,应在主库的可写事务中执行或移出只读块;失败块先回滚,再把连接归还连接池。备用机或恢复期间的 25006 需要把操作路由到主库;在同一只读目标上重试写入不会改变访问模式。

源码报文

核心 utility 路径的源码模板是 cannot execute %s in a read-only transaction;在恢复目标上,同一 utility 保护会使用 cannot execute %s during recovery,恢复期间临时表和复制原点也有各自的固定文本。%s 是实际命令名,不能脱离路径当作一条静态报文。

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 25006;主报文 cannot execute CREATE TABLE in a read-only transaction;状态 INERROR → IDLE;修复后关系行数 0;最终状态 IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 25006;主报文 cannot execute CREATE TABLE in a read-only transaction;状态 INERROR → IDLE;修复后关系行数 0;最终状态 IDLE

代表案例

运行器从共享语句清单(registry)读取下列 setup、只读事务、回滚和事务块外修复语句;完整断言、环境和清理见 案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, note text NOT NULL);
-- begin
BEGIN;
-- read_only
SET TRANSACTION READ ONLY;
-- trigger
CREATE TABLE blocked(id integer PRIMARY KEY);
-- rollback
ROLLBACK;
-- repair
CREATE TABLE blocked(id integer PRIMARY KEY);
-- verify
SELECT count(*) FROM blocked;

上述片段的 SQLSTATE、诊断、状态和修复断言来自共享语句清单(registry)(SHA-256 62db30e401b1f72fa50958d0ac612b2b1eb636299532dd1ad246c167e4f9fadf);结构化证据

作者证据 ID:identity, utility-path, other-paths, runtime。选定运行记录:runtime.25006-batch2-latest-20260909.latest, runtime.25006-batch2-pg10-20260909.pg10

版本与边界

选定的 CREATE TABLE 案例在 PostgreSQL 18.6 与 10.21 通过,主报文相同,并完成 INERROR → IDLE 恢复和修复后建表。其他 25006 源码路径不在本运行案例范围内。

25P02 失败 SQL 事务25001 活动 SQL 事务25P03 事务空闲超时

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.utility.18.6 (SHA-256 7aae5d07628b6debf8456d1d4ea96f28912232192e56ea25773b4c4b61235a00)
  • src.namespace.18.6 (SHA-256 8c9e6a99e84fa2cec8a9b1de2ecbe3966a13f4ad68c6ccfbfb8134a754d73e56)
  • src.origin.18.6 (SHA-256 81e5d5b4539b67bb372f0f0a05395af900c322cdbcec8a4b1f358333a16e6518)
  • doc.set-transaction.18.6 (SHA-256 33554463a2c9da1cf2c72cc27d4647d557204bb13a03cfeccb1b83f237a46589) · official documentation

124 - 25007 — 不支持混合模式与数据语句(schema_and_data_statement_mixing_not_supported)

PostgreSQL SQLSTATE 25007:模式与数据语句混合不受支持的源码边界与诊断参考。

25007 — 不支持混合模式与数据语句(schema_and_data_statement_mixing_not_supported)

速览

25007 表示混合模式语句与数据语句的事务状态条件。固定 PostgreSQL 18.6 核心扫描没有解析出直接报错组,因此本文不制造 SQL 示例。

字段
SQLSTATE 25007
条件名 schema_and_data_statement_mixing_not_supported
状态 有效
已知存在于 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_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED
别名

含义

该条件名描述狭窄的语句组合边界,不能泛化为语法错误、只读事务错误或活动事务错误。

诊断

应同时保留协议或 API 操作、语句序列和服务器精确 SQLSTATE。固定核心证据没有可引用的报文模板,也没有确认安全的自然案例。

处理

按 API 文档的语句分组要求执行,必要时把模式变更与数据操作拆开。不要仅凭条件名发明重试或 RAISE 路径。

源码报文与运行边界

固定 errcodes.txt 定义了该条件和宏;raw/calls/REL_18_6.jsonl 的解析调用扫描没有直接报错组,因此本批不发布报文模板,也不构造自然 SQL 触发器。

适用边界与案例

本批运行器在 PostgreSQL 18.6 与 10.21 的选定 case 均为 not_applicable,只记录源码边界,没有可复制的 SQL 触发过程。结构化证据 · 案例导出

版本与边界

生成事实记录锁定目录成员。两个 runner 目标的 case 都是 not_applicable 源码边界,不声称有自然运行覆盖。

25006 只读 SQL 事务25008 持有游标隔离级别25P01 没有活动 SQL 事务

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

125 - 25008 — 持有游标要求相同隔离级别(held_cursor_requires_same_isolation_level)

PostgreSQL SQLSTATE 25008:持有游标要求相同隔离级别的源码边界与诊断参考。

25008 — 持有游标要求相同隔离级别(held_cursor_requires_same_isolation_level)

速览

25008 用于持有游标与操作要求的事务隔离级别不兼容的情况。固定 PostgreSQL 18.6 核心扫描没有该码的直接报错组。

字段
SQLSTATE 25008
条件名 held_cursor_requires_same_isolation_level
状态 有效
已知存在于 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_HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL
别名

含义

它比 24000 游标状态无效更窄,也不是一般的 40001 可串行化重试路径。游标跨事务持有本身不能证明服务器发出了 25008。

诊断

应记录游标声明、holdability、两个事务的隔离级别以及实际报出的精确 SQLSTATE。当前固定证据没有报文模板或可复制 SQL 触发器。

处理

让持有游标和使用它的事务保持兼容隔离级别,或按 API 契约关闭并重新声明。没有实际状态证据时,不要套用 24000 修复或通用回滚。

源码报文与运行边界

固定 errcodes.txt 定义了该条件和宏;raw/calls/REL_18_6.jsonl 的解析调用扫描没有直接报错组,因此本批不发布报文模板,也不构造自然 SQL 触发器。

适用边界与案例

本批运行器在 PostgreSQL 18.6 与 10.21 的选定 case 均为 not_applicable,只记录源码边界,没有可复制的 SQL 触发过程。结构化证据 · 案例导出

版本与边界

生成事实记录锁定目录成员。选定的 latest 与 PG10 case 有意保持仅源码和 not_applicable 状态。

24000 游标状态无效25004 分支事务隔离级别40001 可串行化失败

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

126 - 25P01 — 没有活动 SQL 事务(no_active_sql_transaction)

PostgreSQL SQLSTATE 25P01:SAVEPOINT 等操作要求显式事务块的诊断与修复。

25P01 — 没有活动 SQL 事务(no_active_sql_transaction)

速览

25P01 表示操作需要活动 SQL 事务。选定案例在自动提交会话中发送 SAVEPOINT,得到精确错误且会话保持 IDLE;随后在 BEGIN 内重新执行并提交。

字段
SQLSTATE 25P01
条件名 no_active_sql_transaction
状态 有效
已知存在于 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_NO_ACTIVE_SQL_TRANSACTION
别名

含义

源码把语句名填入 %s can only be used in transaction blocks;本文的 SAVEPOINT 路径严重级别为 ERROR。同一 SQLSTATE 还覆盖 COMMIT AND CHAIN/ROLLBACK AND CHAIN 的错误,以及无事务时 COMMIT/ROLLBACK 的警告,固定报文是 there is no transaction in progress

诊断

执行 SAVEPOINT、RELEASE SAVEPOINT 或 ROLLBACK TO SAVEPOINT 前,先确认客户端已进入显式事务块。选定运行中失败的自动提交语句后仍为 IDLE;修复序列是 BEGINSAVEPOINTRELEASECOMMIT

处理

创建保存点前先启动显式事务。若操作误发在事务块外,应修正客户端事务包装后重试;本自动提交错误没有遗留失败事务块,因此不需要回滚。

源码报文

xact.c%s can only be used in transaction blocks 组装语句级报文;本案例把 %s 替换为 SAVEPOINT,严重级别为 ERRORCOMMIT AND CHAINROLLBACK AND CHAIN 在无事务块时使用同一动态形式;无事务时的 COMMIT/ROLLBACK 则使用 WARNING 报文 there is no transaction in progress

实测诊断

18.6 (Homebrew) / latest:SQLSTATE 25P01;主报文 SAVEPOINT can only be used in transaction blocks;错误后状态 IDLE;显式事务修复 INTRANS → IDLE10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 25P01;主报文 SAVEPOINT can only be used in transaction blocks;错误后状态 IDLE;显式事务修复 INTRANS → IDLE

代表案例

运行器从共享语句清单(registry)读取下列无事务保存点和显式块修复语句;完整断言、环境和清理见 案例导出

-- trigger
SAVEPOINT outside_block;
-- begin
BEGIN;
-- savepoint
SAVEPOINT inside_block;
-- release
RELEASE SAVEPOINT inside_block;
-- commit
COMMIT;
-- verify
SELECT 1;

上述片段的 SQLSTATE、诊断、状态和修复断言来自共享语句清单(registry)(SHA-256 a1ffffc778f82789f1c1ac4027a109fc76e4b315ef2e3a5bdbfc47c8f84ce951);结构化证据

作者证据 ID:identity, savepoint-path, runtime。选定运行记录:runtime.25P01-batch2-latest-20260909.latest, runtime.25P01-batch2-pg10-20260909.pg10

版本与边界

SAVEPOINT 案例在 18.6 与 10.21 返回相同主报文的 25P01,显式事务块修复后两个目标均回到 IDLE

25005 分支事务没有活动 SQL 事务25P02 失败 SQL 事务25006 只读 SQL 事务

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.xact.18.6 (SHA-256 75b012c0b047d1dc905a30975c244beec366e45eac0dbf109fd21bcd611a8e39)
  • doc.savepoint.18.6 (SHA-256 aa6e167d373da6118249c87404a7b2ff8be8c7df790449814f1d9dc433bbd428) · official documentation
  • src.xact.savepoint.18.6 (SHA-256 75b012c0b047d1dc905a30975c244beec366e45eac0dbf109fd21bcd611a8e39)

127 - 25P02 — 事务处于失败状态(in_failed_sql_transaction)

PostgreSQL SQLSTATE 25P02:前一条语句失败后出现的次级事务状态。

25P02 — 事务处于失败状态(in_failed_sql_transaction)

速览

25P02 通常是第二个诊断,而不是根因。选定案例先因重复键返回 23505,随后 SELECT 在事务仍为 INERROR 时被 25P02 拒绝;必须先 ROLLBACK 才能有效重试。

字段
SQLSTATE 25P02
条件名 in_failed_sql_transaction
状态 有效
已知存在于 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_IN_FAILED_SQL_TRANSACTION
别名

含义

postgres.c 在再次规划普通命令前检查已中止事务状态,并报告 current transaction is aborted, commands ignored until end of transaction block。驱动会暴露对应的失败事务状态;原始错误仍是诊断锚点,25P02 表示该事务块已经不能继续执行普通业务语句。

诊断

先定位 25P02 之前的第一条语句错误,再记录两个诊断和连接事务状态。选定运行显示根错误 23505、随后 25P02;两次之后都为 INERRORROLLBACK 后为 IDLE,新的显式 BEGIN/COMMIT 成功提交有效行。检查根错误前是否建立了保存点:ROLLBACK TO SAVEPOINT 可以保留外层事务;没有保存点时必须结束整个失败事务块。连接池不能把 INERROR 会话交给下一个请求。

处理

第一条错误后停止发送业务语句,保留根 SQLSTATE 和详情。若事先建立的保存点仍可用,就回滚到该保存点并继续外层事务;否则执行 ROLLBACK,确认连接回到 IDLE,再开启新事务。应重新评估操作,不要盲目重放根语句。

源码报文

固定主报文是 current transaction is aborted, commands ignored until end of transaction block。它描述前一条错误留下的事务状态,不能覆盖根错误的 SQLSTATE、DETAIL 或约束身份。

实测诊断

18.6 (Homebrew) / latest:根 SQLSTATE 23505;次级 SQLSTATE 25P02;根错误/次级诊断后均为 INERROR;回滚后 IDLE;行集 [[1, 'seed'], [2, 'repaired']]10.21 (Debian 10.21-1.pgdg90+1) / pg10:根 SQLSTATE 23505;次级 SQLSTATE 25P02;根错误/次级诊断后均为 INERROR;回滚后 IDLE;行集 [[1, 'seed'], [2, 'repaired']]

代表案例

运行器从共享语句清单(registry)读取下列根错误、次级诊断、回滚和有效重试语句;完整断言、环境和清理见 案例导出

-- create
CREATE TABLE items(id integer PRIMARY KEY, note text UNIQUE NOT NULL);
-- seed
INSERT INTO items VALUES (1, 'seed');
-- begin
BEGIN;
-- trigger
INSERT INTO items VALUES (2, 'seed');
-- followup
SELECT 1 AS ignored;
-- rollback
ROLLBACK;
-- repair_begin
BEGIN;
-- repair
INSERT INTO items VALUES (2, 'repaired');
-- commit
COMMIT;
-- verify
SELECT id, note FROM items ORDER BY id;

上述片段的 SQLSTATE、诊断、状态和修复断言来自共享语句清单(registry)(SHA-256 04da3240dcf3c03fe60d13715f8187350fadf5b8d1f10e5b837acd45289759cd);结构化证据

作者证据 ID:identity, abort-state, runtime。选定运行记录:runtime.25P02-batch2-latest-20260909.latest, runtime.25P02-batch2-pg10-20260909.pg10

版本与边界

选定的“重复键后出现 25P02”案例在 PostgreSQL 18.6 与 10.21 通过。它证明事务状态恢复,不表示可以原样重试重复键操作。

23505 唯一约束冲突25P01 没有活动 SQL 事务40001 可串行化失败

来源

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.postgres.18.6 (SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061)
  • doc.libpq.18.6 (SHA-256 a91ce8f29dde162245d2f35f839e8b7192f62a57e01020b80564af65edd09440) · official documentation

128 - 25P03 — 事务中空闲会话超时(idle_in_transaction_session_timeout)

PostgreSQL SQLSTATE 25P03:诊断并恢复开放事务中空闲会话被服务器终止的过程。

25P03 — 事务中空闲会话超时(idle_in_transaction_session_timeout)

速览

25P03 是终止会话的 FATAL 条件。当会话在开放事务中等待客户端下一条查询的时间超过有效 idle_in_transaction_session_timeout 时触发。选定案例使用 300 ms 作为测试触发值,不是生产建议。

字段
SQLSTATE 25P03
条件名 idle_in_transaction_session_timeout
状态 有效
已知存在于 9.6.0
锁定快照 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT
别名

含义

该超时防止会话在等待客户端期间长期持有开放事务,从而持有锁并延迟清理。它作用于事务中的空闲等待,包括 idle in transactionidle in transaction (aborted) 状态,不是正在执行的语句;statement_timeout 取消单条语句,而支持该设置的版本中 transaction_timeout 限制整个事务生命周期。选定运行只覆盖未中止的 INTRANS 路径。

诊断

会话消失前,先在该目标会话自身检查有效的 SHOW idle_in_transaction_session_timeout(或对应的 pg_settings 行)。控制连接上的 SHOWpg_settings 反映的是观察者后端,不能用来确认另一个会话实际通过 SET 得到的值。再从控制连接查看 pg_stat_activitypidusenameapplication_nameclient_addrstatexact_startstate_changequery_startquery 等字段,并筛选 state IN ('idle in transaction', 'idle in transaction (aborted)')。若状态已经中止,应把更早的根错误和 25P02 作为独立诊断保留;选定运行是未中止的 INTRANS 路径。这些字段可定位连接池或应用路径以及空闲时长,但观察者权限可能限制可见内容。再按 backend PID、SQLSTATE、error_severity = FATAL 和精确报文关联 FATAL 记录。选定的 psycopg/libpq 栈在驱动诊断和 CSV 日志中都暴露了 25P03;PG18 还提供 JSON 日志。原连接已关闭,不能在其上用 ROLLBACK 修复事务。

处理

把原会话视为已消失:从连接池移除它,重连后再判断能否重试幂等工作。要避免再次发生,应在连接归还连接池前提交或回滚,并修复留下开放事务的应用路径。不要为了压制错误而降低该超时;更短的值会更容易触发终止。可把有效值设在合法空闲时长之上;只有部署明确接受锁和清理风险时才设为 0。服务器关闭该会话时会在退出前回滚开放且尚未完成的事务;死亡连接不能再接收 ROLLBACK。对已终止会话中已知未提交的事务,不能通过该连接恢复。若是另一种网络故障发生在客户端可能已发送 COMMIT 之后,应从新连接对账业务结果再重试;并非每个 25P03 FATAL 都意味着这种不确定性。

FATAL 报文

服务器源码固定报出 terminating connection due to idle-in-transaction timeout,严重级别为 FATAL;原连接会被终止。

实测诊断

18.6 (Homebrew) / latest:FATAL SQLSTATE 25P03;主报文 terminating connection due to idle-in-transaction timeout;backend PID 26447;原连接已关闭 True;CSV 日志 25P03;JSON 日志 25P03;新连接探测 110.21 (Debian 10.21-1.pgdg90+1) / pg10:FATAL SQLSTATE 25P03;主报文 terminating connection due to idle-in-transaction timeout;backend PID 81;原连接已关闭 True;CSV 日志 25P03;JSON 日志 不适用;新连接探测 1

代表案例

下列 SQL 片段不是一次性粘贴脚本:在测试连接上执行设置、PID 和 BEGIN 后停止发送查询,由独立观察连接或日志收集器等待 FATAL;原连接终止后,另开新连接执行最后的探测。运行器从共享语句清单(registry)读取这些语句,完整断言、日志收集器关联、环境和清理见 案例导出

-- set_timeout
SET idle_in_transaction_session_timeout = '300ms';
-- backend_pid
SELECT pg_backend_pid();
-- begin
BEGIN;
-- probe
SELECT 1;

上述片段的 SQLSTATE、诊断、状态和修复断言来自共享语句清单(registry)(SHA-256 95fd079c8bca77c6e3ffc398e404a218e4f810e5fa36e30127cbc6470a6d6eb2);结构化证据

作者证据 ID:identity, timeout-path, runtime。选定运行记录:runtime.25P03-batch2c-latest-20260909.latest, runtime.25P03-batch2c-pg10-20260909.pg10

版本与边界

选定的 300 ms 终止案例在 PostgreSQL 18.6 与 10.21 通过。PG18 按配置提供 CSV 和 JSON 日志记录;PG10 只有 CSV。两个目标的新连接都成功执行 SELECT 1。超时值取决于部署,本案例不规定生产值。

25P04 事务超时25006 只读 SQL 事务57014 查询取消

来源

129 - 25P04 — 事务超时(transaction_timeout)

PostgreSQL SQLSTATE 25P04:显式或隐式事务超过 transaction_timeout 后终止会话。

25P04 — 事务超时(transaction_timeout)

速览

25P04transaction_timeout 触发的 FATAL 条件,覆盖显式 BEGIN 事务和由单条语句隐式启动的事务。选定的 18.6 案例使用 300 ms;PG10 因设置不可用而在源码/版本预检阶段跳过,不会探测未知设置。另有 PG16.15/PG17.11 的版本边界对照:PG16 返回设置不可用的 42704,PG17 实际产生 FATAL 25P04;该对照独立于选定基础案例。

字段
SQLSTATE 25P04
条件名 transaction_timeout
状态 有效
已知存在于 17.0
锁定快照 17.11, 18.6, 19beta3
ERRCODE_TRANSACTION_TIMEOUT
别名

含义

transaction_timeout 限制显式或隐式事务的存活时间,包括事务打开期间执行或等待的时间。触发后 PostgreSQL 发出 terminating connection due to transaction timeout 并终止会话。它不同于只中止一条语句的 statement_timeout,也不同于只覆盖客户端在开放事务中空闲时间的 idle_in_transaction_session_timeout。若 transaction_timeout 小于或等于其中任一设置,较长的超时会被忽略;预备事务不受此设置约束。

诊断

在支持该设置的服务器上,先在目标会话自身检查有效的 SHOW transaction_timeoutSHOW statement_timeoutSHOW idle_in_transaction_session_timeout。控制连接上的 SHOWpg_settings 反映的是观察者后端,不能用来确认另一个会话实际通过 SET 得到的值。再从控制连接查看 pg_stat_activitypidapplication_namestatexact_startstate_changequery_startquery 等字段,定位所属应用或连接池,并判断事务是在执行还是空闲。按 backend PID、SQLSTATE 25P04、error_severity = FATAL 和精确报文匹配日志收集器记录。选定的 18.6 运行中驱动也暴露了 25P04,原连接已关闭;新的连接成功执行 SELECT 1。PG10 在发送 SET transaction_timeout 之前就由最低版本预检跳过。

处理

丢弃已终止的会话并重连。对合法的长事务,可缩短工作、拆分工作单元或提高有效超时以控制在预算内;不要为了掩盖错误而降低超时。只有部署明确接受取消该保护时才设为 0。服务器关闭终止的会话时会在退出前回滚开放且尚未完成的事务;死亡连接不能再接收 ROLLBACK。已知尚未在该会话上提交的事务,不能通过该连接恢复。若另一种网络故障使客户端无法确定 COMMIT 是否到达服务器,应从新连接对账业务结果再重试;选定案例没有发送提交,不能据此声称存在这种不确定性。本批 PG10 没有兼容设置。

FATAL 报文

服务器源码固定报出 terminating connection due to transaction timeout,严重级别为 FATAL;原连接会被终止。

实测诊断

18.6 (Homebrew) / latest:FATAL SQLSTATE 25P04;主报文 terminating connection due to transaction timeout;backend PID 30576;原连接已关闭 True;CSV 日志 25P04;JSON 日志 25P04;新连接探测 110.21 (Debian 10.21-1.pgdg90+1) / pg10:案例 not_applicable(最低版本预检;未探测该目标不支持的设置)。

单独的边界对照:16.15 / pg16 因设置不可用返回 42704 并保持 IDLE,因此不计作 25P04 覆盖;17.11 / pg17 在 300 ms 后由 PID 73 产生 FATAL 25P04,CSV 与 JSON 都记录 FATAL 25P04,原连接关闭,新连接为 IDLE。这些记录不计入选定基础案例。

代表案例

下列 SQL 片段不是一次性粘贴脚本:在测试连接上执行设置、PID 和 BEGIN 后停止发送查询,由独立观察连接或日志收集器等待 FATAL;原连接终止后,另开新连接执行最后的探测。运行器从共享语句清单(registry)读取这些语句,完整断言、日志收集器关联、环境和清理见 案例导出

-- set_timeout
SET transaction_timeout = '300ms';
-- backend_pid
SELECT pg_backend_pid();
-- begin
BEGIN;
-- probe
SELECT 1;

上述片段的 SQLSTATE、诊断、状态和修复断言来自共享语句清单(registry)(SHA-256 d05a26e56716c5c8c178f741843e6b14be87423ec9d1eb1a026ff67a57ce4658);结构化证据

作者证据 ID:identitytimeout-pathruntimeruntime.version-boundary。选定基础运行记录:runtime.25P04-batch2c-latest-20260909.latest。单独的边界记录:runtime.25P04-boundary-pg16-20260909.pg16runtime.25P04-boundary-pg17-20260909.pg17

单独的边界对照已经记录了可用性结果:PG16 返回 42704,PG17 继续并实际产生 FATAL 25P04。这个边界块是分支说明,不能整块一次性粘贴执行。在 PG16 上先执行 SHOW transaction_timeout;得到预期的 42704 后,如需证明连接仍健康,应在同一连接执行 SELECT 1,然后停止,跳过 SET transaction_timeoutBEGIN 和等待超时。在 PG17 或更高版本上,只有 SHOW 成功后才在目标连接执行 SET transaction_timeout、记录 PID 并执行 BEGIN;随后停止发送查询,由观察连接或日志收集器等待旧连接出现 FATAL 并关闭,最后只在新连接上执行探测。这些边界记录用于诊断对照,不增加选定基础案例数量。

-- availability_probe
SHOW transaction_timeout;
-- set_timeout
SET transaction_timeout = '300ms';
-- backend_pid
SELECT pg_backend_pid();
-- begin
BEGIN;
-- probe
SELECT 1;

版本与边界

锁定目录首次观察到 transaction_timeout 为 17.0。选定的 18.6 案例以 CSV/JSON 日志收集证据和新连接探测通过。单独的 PG17.11 边界案例实际记录了 FATAL 25P04,PG16.15 则记录设置不可用的 42704;两者都不替代选定基础运行。PG10 是真实的 not_applicable 最低版本预检跳过:handler 不会发送或探测未知设置,因此这不构成更早版本边界证据。

25P03 事务中空闲超时40001 可串行化失败57014 查询取消

来源

130 - 26000 — invalid_sql_statement_name(预备语句名称无效)

PostgreSQL SQLSTATE 26000:预备语句会话归属、诊断与恢复。

26000 — invalid_sql_statement_name(预备语句名称无效)

速览

26000 表示 PostgreSQL 被要求使用当前后端会话中不存在的命名预备语句。这是会话资源查找失败,先检查会话是否保持不变以及语句生命周期,再修改 SQL 文本。

字段
SQLSTATE 26000
条件名 invalid_sql_statement_name
状态 有效
已知存在于 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_INVALID_SQL_STATEMENT_NAME, ERRCODE_UNDEFINED_PSTATEMENT
别名 ERRCODE_UNDEFINED_PSTATEMENT

含义

PREPARE 会在一个 PostgreSQL 会话中注册命名语句;EXECUTEDEALLOCATE 也必须在同一会话按名称查找。连接池可能在两次操作之间换了后端。核心 prepare.c 路径使用 prepared statement "%s" does not exist,其中名称由服务器动态填入;固定的扩展查询路径还会在未命名语句不存在时使用 postgres.cunnamed prepared statement does not exist

诊断

先读取驱动异常中的 SQLSTATE 和主报文,并在 PREPAREEXECUTE 周围记录后端 PID 或同等连接身份。在同一连接上查询 pg_prepared_statements,才能判断该失败会话是否存在这个名称;在另一个池连接上查询不能证明失败会话的状态。区分显式 DEALLOCATE、连接被替换和未命名语句路径,不要把它误判成 PREPARE 语法错误。

处理

如果命令位于显式事务中,先回滚失败块,再继续发命令。在真正执行它的会话上重新 PREPARE,并让应用或连接池在同一次 checkout 中完成定义和参数绑定。缺少语句本身没有执行预期操作,但重复更大的业务流程前仍应按业务请求标识和副作用检查执行正常校验。

报文

固定源码模板包括 prepare.cprepared statement "%s" does not exist,以及扩展查询路径 postgres.cunnamed prepared statement does not exist。选定案例记录的是 source_file = prepare.csource_function = FetchPreparedStatement;只有命名模板带服务器端名称替换。应根据 SQLSTATE 和结构化诊断分支,不要把任一报文当成稳定完整字符串。

代表案例

运行器从 verify/cases/26000/snippets.json(SHA-256 b9fdbb48371e0d9902cb9e055ececc4878c38422773a8a1571651d9952809032)读取下面的序列,并保证所有语句在同一连接执行;完整结果见公开案例导出结构化证据

PREPARE statement_name(integer) AS SELECT $1 + 1;
EXECUTE statement_name(1);
DEALLOCATE statement_name;
EXECUTE statement_name(1);

statement_name 是页面中的占位符。运行器会替换为唯一名称,释放它,断言 26000IDLE,随后重复 registry 中同一组 PREPAREEXECUTEDEALLOCATE 三条语句修复会话。也就是说,恢复步骤是:在同一连接重新 PREPARE,执行它,并在 checkout 结束时 DEALLOCATE;引用的是现有 prepareexecutedeallocate registry 语句,而不是第二套 SQL 定义。

选定运行案例在 PostgreSQL 18.6 和 10.21 观察到 26000:先释放同名预备语句,再在同一会话执行它,得到带动态名称的诊断,连接保持 IDLE;随后重新 PREPARE 并成功执行。

版本

锁定目录从早期历史边界到当前正式快照都记录了该条件。18.6 固定源码同时包含命名和未命名预备语句路径;运行比较只覆盖 18.6 与 10.21 的命名路径。不同版本的源码行和报文措辞可以变化,选定目标中的 SQLSTATE 仍为 26000

另见34000 游标名称无效25P02 失败事务

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • src.prepare.18.6(SHA-256 e37fbd5f7618e5554561d9293d8c3af7cf3190c62c5c6bbceb3fe8b97be17956
  • src.postgres.18.6(SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061
  • PREPARE 官方文档 · 本地调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

131 - 27000 — triggered_data_change_violation(触发的数据更改违规)

PostgreSQL SQLSTATE 27000 的来源与机制边界参考。

27000 — triggered_data_change_violation(触发的数据更改违规)

速览

27000 是源码确认的触发器保护条件。当当前命令触发的操作已经修改某行时,PostgreSQL 会使用这个码;18.6 固定源码的提示建议在需要向其他行传播变化时考虑 AFTER trigger。简单的“自身更新” BEFORE trigger 可能递归或改变触发器语义,因此本页不把它伪装成通用安全复现。

字段
SQLSTATE 27000
条件名 triggered_data_change_violation
状态 有效
已知存在于 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_TRIGGERED_DATA_CHANGE_VIOLATION
别名

含义

27000 是执行器在“当前命令触发的操作已经修改过该元组”时发出的触发数据更改违规。固定的 trigger.c 路径针对同一命令、同一元组的触发器改写保护;它不是所有触发器异常或递归触发器的统称。

诊断

先确认目标表、命令影响的行以及可能再次更新该行的 BEFORE 行级触发器。固定主模板是 tuple to be updated was already modified by an operation triggered by the current command,提示可考虑用 AFTER 触发器向其他行传播变化。只会递归的自更新测试属于另一种故障,不能证明这条路径。本批没有自然运行观察;若线上真实触发,应同时保存客户端实际事务状态。

处理

如果触发器是在向其他行传播变化,符合语义时可以改用 AFTER 触发器或一次集合式语句;若同一元组确实被两次命中,应重新设计触发器。不能套用通用重试或 CASCADE,也不能把人为构造的自更新递归说成 27000。真实显式事务失败后,先回滚再发修复 SQL。

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

可对照44000 WITH CHECK OPTION 违规23514 检查约束违规

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 源码路径(SHA-256 0a539af85b0de1a04779f92202e7bfc77d85ae6da1747ea32527c67f39084fbd

132 - 28000 — 授权规范无效(invalid_authorization_specification)

PostgreSQL SQLSTATE 28000(授权规范无效,invalid_authorization_specification)的源码证据、诊断与处理参考。

28000 — 授权规范无效

速览

SQLSTATE 28000 是 Class 28 中的 invalid_authorization_specification28000 是被拒绝的启动或授权上下文所属的类别。选定的角色不存在启动路径在建立会话前发送 C=28000、S=FATAL 以及 role "<generated>" does not exist;固定认证路径还在证书、pg_hba 和 LOGIN 资格失败时使用本类的具体报文。

字段
SQLSTATE 28000
条件名 invalid_authorization_specification
状态 有效
已知存在于 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_INVALID_AUTHORIZATION_SPECIFICATION
别名

含义

本类覆盖建立或认证连接时被拒绝的授权上下文。选定分支是启动阶段的角色查找:服务器无法为请求角色创建会话,于是发送 FATAL ErrorResponse。证书、pg_hba 和 LOGIN 资格路径仍是同一类别下的不同 producer。

选定的角色查找发生在后端进入普通会话之前。这解释了 FATAL 级别以及失败尝试没有会话级事务。不要把它与 28P01(密码认证失败)、42501(会话建立后的权限不足)或 3D000(数据库选择)混在一起;应由启动阶段和服务器字段确定分支。

启动分支指引

检查内容 选定的角色缺失分支 Class 28 的其他可能性
服务器字段 C=28000S=FATALM=role "%s" does not exist 保留服务器实际返回的代码和主报文,不能只按类别推断。
会话状态 失败尝试没有可用会话,也没有事务 后续授权检查可能发生在已建立会话中,恢复边界不同。
修复 按意图创建/重命名角色,或修正启动用户,然后重新连接 根据实际诊断修正证书、pg_hba.conf、LOGIN 属性或映射。

诊断

以服务器 ErrorResponse 或认证日志作为 SQLSTATE 依据,并先判断阶段:角色查找、pg_hba 规则、证书,还是 LOGIN 权限。选定的 collector 是原始服务器 ErrorResponse 记录,不是 csvlog/jsonlog;原始启动尝试与 psycopg 尝试彼此独立。选定运行中 psycopg 报告的驱动 SQLSTATE 为 null,失败连接没有事务;两个独立的新鲜已知角色探针仍能执行 SELECT 1,这不是日志采集器关联结论。

对于角色不存在,使用独立管理会话对照请求的启动用户和角色目录,并检查引号或大小写折叠。保留原始 CSM 字段:psycopg 的 null 只说明它自己的失败启动尝试,不表示服务器没有 SQLSTATE。新鲜探针必须是另一条连接,不能把失败尝试变成可回滚的事务。

处理

按服务器指出的原因修正角色、LOGIN/映射、证书或 pg_hba 规则,再建立新连接。失败启动连接上没有可供 ROLLBACK 的会话;没有服务器字段时不能仅凭客户端异常认定 28000,也不要盲目重放非幂等启动工作。

角色或认证配置改变后,使用准确的目标用户和数据库重新连接,并在新会话中确认身份。如果应用已经在另一条连接上发送了工作,应单独核对那部分工作;启动前的 FATAL 本身没有可重试的业务事务。

实测诊断

选定的启动角色分支以 FATAL 发出主报文 role "%s" does not exist,角色名是动态值。Class 28 的其他授权失败可能使用不同主报文。由于客户端没有得到可用会话 SQLSTATE,应以服务器 ErrorResponse 为准。

选定服务器记录为 role "u28000_missing_fbc912bb7e6f" does not exist,角色名是本次运行生成的值。原始 ErrorResponse 与 psycopg 的 null 属于两次独立启动尝试,不能拼成同一会话的两种视图。

代表案例

注册表包含服务器启动 ErrorResponse 后执行的探针。触发点是在新启动连接上使用随机角色,失败发生在会话建立前,不能用 SQL 语句重现。

SELECT 1;

18.6 服务器 ErrorResponse 为 C=28000、S=FATALrole "u28000_missing_fbc912bb7e6f" does not exist。驱动启动诊断的 SQLSTATE 为 null,失败连接没有事务;已知可用连接探针返回 1,状态 IDLE

可下载的案例与证据投影分别是 28000 案例 JSON作者证据。运行器清单为 verify/cases/28000/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.miscinit-missing-role.18.6src/backend/utils/init/miscinit.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 54bdb859c143a6c70d86067ccf2e124f59aa0852e5705bb653652e41a60af39a (source).
  • src.miscinit-missing-role.10.23src/backend/utils/init/miscinit.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 c4d2e234f96644d43aad9e9a6728df693e7f75175f05a550701413ceee70fb82 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

133 - 28P01 — invalid_password(密码无效)

密码认证在连接启动阶段失败时,PostgreSQL 会报告 SQLSTATE 28P01。应检查匹配的 pg_hba.conf 规则和角色密码,并用新的连接证明修复。

速览

28P01 是 PostgreSQL 类别 28 invalid_authorization_specification 中的 invalid_password 条件。客户端建立会话时密码认证失败,会产生这个代码。具体路径取决于认证方法、匹配的 pg_hba.conf 规则和角色保存的密码。

这是 SQL 执行前的失败。被拒绝的会话没有事务可供回滚。最终运行中,psycopg 返回了启动异常文本,但暴露的 sqlstateNone;PostgreSQL collector 记录了服务器实际发送的 FATAL SQLSTATE 28P01。不能把没有代码的驱动异常描述成客户端收到了 collector 字段。

案例 wrong_password_authentication 临时启用 md5 规则,使用错误密码连接,验证已知密码可以建立新会话并执行 SELECT 1,恢复原来的 HBA 配置,再验证新的管理连接。案例在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。run ID 和断言见公开证据 JSON

字段
SQLSTATE 28P01
条件名 invalid_password
状态 有效
已知存在于 9.0.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_PASSWORD
别名

含义与触发路径

服务器根据第一条匹配的 pg_hba.conf 规则选择认证方法。密码、MD5 和 SCRAM 路径拒绝提交的密码时,auth.c 选择 ERRCODE_INVALID_PASSWORD 并报告 FATAL。主报文模板是 password authentication failed for user "%s";服务器也可以在日志 detail 中加入匹配的 HBA 信息。

28P01 不会区分所有认证配置问题。角色不存在、角色不允许登录、证书失败,或 HBA 规则选择了其他方法,都可能使用不同的 SQLSTATE 或报文。匹配的规则和认证方法是诊断的一部分。

失败发生在连接启动阶段,后端尚未接受 SQL。连接池应丢弃被拒绝的连接尝试,在密码或 HBA 配置修好后建立新的连接。仍在使用的所有者或管理连接可以恢复临时规则,但复用它们不能证明受影响角色可以认证。

报文与诊断

下面的 SQL 语句与 runner 使用的密码设置和探针相同。运行时 known_userexample-known-secret 会替换为临时值。修改 pg_hba.conf 和使用错误密码建立连接属于启动操作,因此在 SQL 语句之间说明,而不是伪造 RAISE 或 SQL 错误。

ALTER ROLE known_user PASSWORD 'example-known-secret';
-- 在 pg_hba.conf 首行临时加入 host all all 0.0.0.0/0 md5。
-- 使用错误密码以 known_user 连接:启动阶段返回 FATAL 28P01。
-- 再使用已知密码建立连接并执行:
SELECT 1;
-- 恢复原 pg_hba.conf,建立新的管理连接并执行:
SELECT 1;

最新目标的 collector 记录形状为:

SQLSTATE: 28P01
severity: FATAL
message_primary: password authentication failed for user "<generated-role>"
detail (collector): Connection matched file "<pg_hba.conf path>" line 1: "host all all 0.0.0.0/0 md5"
source: auth.c / auth_failed / line 320
driver startup sqlstate: null
transaction: none opened
repair: known-password SELECT 1 -> 1; restore HBA; fresh owner SELECT 1 -> 1

PostgreSQL 10.21 的 collector 产生相同的主报文和 SQLSTATE,源码位置为 auth.c:329;其 collector detail 使用较早的 pg_hba.conf line 表述,并且还包含密码不匹配行。两个目标都在临时规则下用已知密码认证成功,重新加载原 HBA 配置,并让新的管理连接返回 1。驱动文本和 collector 字段是两条独立证据;本次运行中 libpq/psycopg 没有暴露启动 SQLSTATE。

诊断

记录用户、数据库、连接来源、认证方法、服务器版本和第一条匹配的 HBA 规则,不要记录密码。按时间关联失败尝试和 verbose collector 记录。collector detail 可以指出 HBA 行,而客户端启动异常可能只有 FATAL 文本。

检查目标角色存在且允许登录,密码已针对选定方法设置,并确认更早的 HBA 规则没有截获连接。正确密码配在错误的 HBA 方法上不能证明部署正确。密码轮换完成前,应等待新的连接成功。

被拒绝的会话没有事务状态需要恢复。修改 HBA 规则时保留受控的管理连接,重新加载配置,并用新的客户端测试。测试完成后精确恢复原规则,再确认新的所有者连接仍可用。

处理与修复

  • 为角色使用预期的密码和认证方法,通过不会把密码暴露到日志或命令历史的途径轮换密码。
  • 检查第一条匹配的 pg_hba.conf 规则,修正数据库、用户、地址和方法字段,然后重新加载配置。
  • 用新的连接和真实的无害查询(例如 SELECT 1)测试受影响角色。
  • 在新路径得到证明前保留管理访问,随后关闭仍保存旧密码的连接池陈旧会话。

代表性修复同时包含已知密码连接和恢复后的新管理连接。仅成功调用 pg_reload_conf() 不能证明认证已经修好,复用执行 reload 的连接也不能测试修复后的登录路径。

版本与边界

目录在第一份扫描到的定义(9.0.0 或更早)中已包含 28P01,并在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。扫描范围内没有记录该条件的定义变化;9.0 以前的引入点仍未扫描。

错误密码案例在 PostgreSQL 18.6 和 10.21 上通过。源码行号随版本变化,驱动与 collector 的 SQLSTATE 差异是本启动路径的实测边界。证书、GSSAPI、PAM、LDAP、peer 和 HBA 语法失败是独立认证路径,本证据不覆盖。

53300too_many_connections 是连接启动阶段的容量失败。57014query_canceled 发生在已连接后端执行语句时。42501insufficient_privilege 是认证后的权限检查,不是密码诊断。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留 collector 输出、驱动观察、HBA 恢复、两个目标 ID 和结构化观察。

134 - 2B000 — dependent_privilege_descriptors_still_exist(依赖权限描述符仍存在)

PostgreSQL SQLSTATE 2B000 的来源与机制边界参考。

2B000 — dependent_privilege_descriptors_still_exist(依赖权限描述符仍存在)

速览

2B000 是目录定义中的依赖权限描述符条件。本批固定源码扫描没有解析出独立的核心 2B000 抛出点,因此本页只记录定义边界,不把角色、REVOKE 或 DROP 结果擅自标成 2B000。普通对象依赖见 2BP01

字段
SQLSTATE 2B000
条件名 dependent_privilege_descriptors_still_exist
状态 有效
已知存在于 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_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST
别名

含义

2B000 表示 2B 类中的依赖权限描述符条件。固定的 PostgreSQL 18.6 调用扫描没有解析出独立的核心 ereport 路径,因此必须把它与依赖对象仍存在的 2BP01,以及 425010LP01 等具体授权/授权操作错误分开。

诊断

如果扩展或特定版本路径报告该码,应保留组件指出的对象或权限描述符,并收集主报文、DETAIL、HINT。不能从失败的 DROPGRANT 推断出 2B000:固定核心扫描没有选定的自然触发器;代表性对象依赖路径由依赖遍历器报告 2BP01

处理

不能只凭类别名执行 DROP ... CASCADE、撤销权限或重试。先找出拥有该描述符的组件,按其文档修复,再核对 ACL/依赖状态。在解析出真实服务器路径前,这一页只是源码/定义边界,不能保证普通 SQL 事务能产生 2B000

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

可对照2BP01 依赖对象仍存在;两者属于不同源码类别。

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 固定调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

135 - 2BP01 — dependent_objects_still_exist(依赖对象仍存在)

PostgreSQL SQLSTATE 2BP01:依赖对象 DROP 的诊断与有边界修复。

2BP01 — dependent_objects_still_exist(依赖对象仍存在)

速览

2BP01 表示 DROP 或相关目录操作要移除的对象仍被其他数据库对象依赖。正确处理是先理解依赖关系,决定依赖对象应保留还是删除,再重试原操作。

字段
SQLSTATE 2BP01
条件名 dependent_objects_still_exist
状态 有效
已知存在于 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_DEPENDENT_OBJECTS_STILL_EXIST
别名

含义

依赖遍历器会在对象仍被其他对象需要时发出 2BP01。代表路径中视图依赖表,因此 DROP TABLE 不能执行。主报文、DETAIL 和 CASCADE 提示都根据对象描述和依赖图动态组装。2BP01 讨论的是依赖对象;依赖权限描述符的 2B000 是另一种条件。

诊断

同时保存 SQLSTATE、主报文、DETAIL 和 HINT。选定路径的 DETAIL 会指出依赖视图。选择修复前检查视图定义和依赖元数据;pg_dependpg_get_viewdef() 可以说明对象为什么仍被保留。在选定的显式 BEGIN 块中,收到该 ERROR 后连接会在 ROLLBACK 前处于 INERROR;自动提交语句没有需要保留的外层事务。不能在失败的显式块中继续查询目录来完成可靠诊断。

处理

先回滚失败的显式事务。如果视图确实可以删除,先删视图,再删表;如果视图属于模式契约,就保留它并改写迁移方案。CASCADE 是删除依赖对象的明确请求,可能超过预期变更,因此不能把 HINT 自动当成执行指令。完成有边界的修复后,重新执行完整 DDL 计划并核对仍应存在的对象。

报文

选定源码分支的模板为 cannot drop %s because other objects depend on it,DETAIL 是动态内部文本,HINT 为 Use DROP ... CASCADE to drop the dependent objects too.。对象描述和依赖列表都是运行时值,不要把 DETAIL 当成固定的单对象模板,也不要假设所有 2BP01 路径都使用同一措辞。

代表案例

运行器从 verify/cases/2BP01/snippets.json(SHA-256 899e4fd9fb002fc293bd9efee0204e4f2622968c6d9460ad05eb9a0ebd3bac69)读取下面的依赖序列;失败 DROP 使用显式 BEGIN/ROLLBACK,修复先删已知视图再删表,完全不使用 CASCADE。见公开案例导出结构化证据

CREATE TABLE base_items(id integer PRIMARY KEY, payload text NOT NULL);
CREATE VIEW dependent_view AS SELECT id, payload FROM base_items;
BEGIN;
DROP TABLE base_items;
ROLLBACK;
DROP VIEW dependent_view;
DROP TABLE base_items;
SELECT to_regclass('base_items'), to_regclass('dependent_view');

运行器会在私有 schema 中为 registry 名称加限定名。最后两个 to_regclass 都返回 null,证明删除的是预期对象,而不是对未知依赖图静默级联。

选定案例在 PostgreSQL 18.6 和 10.21 观察到 2BP01DROP TABLE 的 DETAIL 指出依赖视图并给出 CASCADE 提示;显式事务进入 INERRORROLLBACK 恢复为 IDLE,随后先删视图再删表完成修复。

版本

目录从早期历史边界到正式快照都记录了该条件。18.6 固定源码还包括依赖、共享依赖、角色、权限、类型表和表空间等分支;运行案例只覆盖 18.6 与 10.21 的普通视图到表依赖。不能据此推断所有分支的 CASCADE 都安全。

可对照2B000 依赖权限描述符仍存在42P01 表不存在

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • src.dependency.18.6(SHA-256 1878f848dae03e08424a47a09508f3443227ad67c4bc5e0aba3ec9655d015b74
  • DROP TABLE 官方文档 · 本地调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

136 - 2D000 — invalid_transaction_termination(无效事务终止)

PostgreSQL SQLSTATE 2D000 的来源与机制边界参考。

2D000 — invalid_transaction_termination(无效事务终止)

速览

2D000 是 SPI 在过程或子事务上下文尝试无效事务终止时使用的保护码。18.6 固定路径把它与正常显式 COMMIT 区分开来;本批不把所有过程级事务错误都归为 2D000,也不使用 RAISE 伪造 SQL 案例。

字段
SQLSTATE 2D000
条件名 invalid_transaction_termination
状态 有效
已知存在于 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_INVALID_TRANSACTION_TERMINATION
别名

含义

2D000 是 SPI 的事务终止无效条件。固定 spi.c 路径在原子 SPI 上下文中拒绝 SPI_commit/SPI_rollback,并在子事务活动时分别拒绝提交或回滚。源码注释明确把限制与过程语言用子事务实现异常块联系起来。

诊断

定位尝试控制事务的过程/函数和 SPI 调用者。区分允许控制事务的顶层 CALL 与原子 SPI 上下文中的函数或异常块,并检查是否仍处于嵌套子事务。固定源码报文包括 invalid transaction terminationcannot commit while a subtransaction is activecannot roll back while a subtransaction is active;普通客户端 COMMIT 错误不能单独归类为这条路径。

处理

把事务控制移到允许的过程边界,或先让外层过程/异常块结束活动子事务,再终止顶层事务。不要在同一禁止的 SPI 上下文里再次发送 COMMIT/ROLLBACK,也不要套用通用重试。本批只记录源码路径,不用 RAISE 或不忠实的 SQL 伪造运行案例。

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

在改变过程或事务边界前,可先对照25P01 无活动 SQL 事务24000 游标状态无效

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 源码路径(SHA-256 7244b45f632583c72530832df901b788fe403c8857425dd13edb49d9f84b0c78

137 - 2F000 — sql_routine_exception

PostgreSQL SQLSTATE 2F000 的源码边界与诊断参考。

2F000

速览

SQLSTATE 2F000 是 SQL Routine Exception 类别。锁定目录中存在该定义,但已解析的 PostgreSQL 18.6 core/contrib 调用扫描没有找到原生 2F000 报告调用组。因此该类别只能组织例程相关调查,不能据此指定某个函数声明、PL/pgSQL 语句或重试规则。

字段
SQLSTATE 2F000
条件名 sql_routine_exception
状态 有效
已知存在于 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_SQL_ROUTINE_EXCEPTION
别名

含义

2F000 是类别码。其成员 2F002 表示一种标准的例程数据访问限制,但成员路径必须单独确认。PostgreSQL 可能用其他 SQLSTATE 报告其他例程错误;应保留实际成员码、消息、routine 和服务器版本,不要用类别码替换。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

记录失败发生在创建、调用还是执行例程的阶段,并确认所有者是后端、扩展、ECPG、驱动还是远端服务器。按准确成员和消息查找固定实现。只有类别码的观察不足以判断原因是数据访问规则、参数错误还是例程主体。

处理

按照实际例程实现及成员 SQLSTATE 支持的处置修复。如果条件来自远端或客户端层,应修正该所有者的声明或调用契约。在不知道执行是否开始或完成前,不要自动重试例程类别。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

2F002, 0Z000

来源

固定的errcodes 定义确认类别;SQLSTATE 附录列出其成员。锁定的 core/contrib 调用扫描未找到已解析的原生 2F000 报告调用组。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

138 - 2F002 — modifying_sql_data_not_permitted

PostgreSQL SQLSTATE 2F002 的源码边界与诊断参考。

2F002

速览

SQLSTATE 2F002 是 SQL Routine Exception 中表示例程声明的数据访问契约不允许修改 SQL 数据的标准成员。锁定的 PostgreSQL 18.6 定义包含该成员,但已解析的 core/contrib 调用扫描没有找到原生报告调用组。不能据此推断 PostgreSQL 的 VOLATILESTABLEIMMUTABLE 单独会映射到此 SQLSTATE。

字段
SQLSTATE 2F002
条件名 modifying_sql_data_not_permitted
状态 有效
已知存在于 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_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED
别名

含义

该条件描述某个实现执行例程数据访问契约时的限制。PostgreSQL 目录行只提供身份和宏,并未证明后端存在执行该限制的路径,也未指定某种例程语言。扩展、嵌入式 SQL 实现、驱动或远端服务器可能独立使用这个标准成员。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

先保留实际 SQLSTATE,并检查例程声明以及执行限制的所有者。确认尝试的语句是否修改数据、例程是否声明了限制性的数据访问特征,以及代码来自远端还是客户端实现。如果服务器返回其他代码,应按那个代码处理,不要把 2F002 当成 PostgreSQL 函数 volatility 错误的同义词。

处理

只有在实际产生者文档明确支持时,才修改例程的数据访问声明,或把修改数据的工作移到允许的例程边界。否则应修正调用方或远端契约。不要加入通用重试:数据修改被拒绝本身不能说明周围工作是否已提交。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

2F000, 0A000

来源

固定的errcodes 定义确认成员和宏;SQLSTATE 附录标识标准条件。锁定的 core/contrib 扫描未找到已解析的原生 2F002 报告调用组。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

139 - 2F003 — prohibited_sql_statement_attempted

PostgreSQL SQLSTATE 2F003 的源码与诊断参考。

2F003

速览

SQLSTATE 2F003 是 SQL Routine Exception 类别中“尝试执行被禁止 SQL 语句”的成员。固定 PostgreSQL 18.6 源码在 dblink 和 postgres_fdw 的不同连接路径中确认了该 ERROR;dblink 还覆盖了结果返回形状不符合 API 要求的路径。

字段
SQLSTATE 2F003
条件名 prohibited_sql_statement_attempted
状态 有效
已知存在于 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_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED
别名

含义

确认的消息包括 statement returning results not allowed,以及 password or GSSAPI delegated credentials required,后者带有 detail,有些路径还带 hint。postgres_fdw 的 detail 会说明 user mapping,有时 hint 会提到 password_required=false;dblink 使用自己的凭据措辞。由于同一 SQLSTATE 覆盖不同 API,必须保留实际产生者。

消息

确认的消息包括 statement returning results not allowed,以及 password or GSSAPI delegated credentials required,后者带有 detail,有些路径还带 hint。postgres_fdw 的 detail 会说明 user mapping,有时 hint 会提到 password_required=false;dblink 使用自己的凭据措辞。由于同一 SQLSTATE 覆盖不同 API,必须保留实际产生者。

诊断

对于 dblink,确认本地调用是把会返回行的命令用于无结果 API,还是连接凭据检查。对于 postgres_fdw,若消息点名这些对象,就检查 foreign server 连接、user mapping、认证方法以及服务器的 password_required 策略。保留固定 detail/hint,不要把 dblink 和 postgres_fdw 合并成一个笼统 wrapper。

处理

修正命令与 API 的搭配,或修正消息点名的连接凭据和 user mapping,然后验证远端操作。远端连接尝试可能尚未完成;重试前要保留远端/本地边界。不要仅因 dblink 或 postgres_fdw 报告 2F003 就改变事务策略。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

2F000, 38003

来源

可直接阅读固定的 dblink.cpostgres_fdw connection.c 路径;完整范围和未解决的运行边界见结构化证据记录

140 - 2F004 — reading_sql_data_not_permitted

PostgreSQL SQLSTATE 2F004 的源码与诊断参考。

2F004

速览

SQLSTATE 2F004 是 SQL Routine Exception 类别中“不允许读取 SQL 数据”的成员。锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到原生报告调用组,因此必须确认实际例程实现和数据访问契约。

字段
SQLSTATE 2F004
条件名 reading_sql_data_not_permitted
状态 有效
已知存在于 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_S_R_E_READING_SQL_DATA_NOT_PERMITTED
别名

含义

只有在实际产生者执行该规则时,2F004 才表示例程数据访问受限。客户端、扩展、ECPG 层或远端例程引擎可能独立使用此成员。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

记录例程所有者、调用阶段、实际 SQLSTATE 以及限制读取的数据访问声明。如果后端返回其他代码,应按该代码及其源码路径诊断;固定目录行不是兜底诊断。

处理

只采用实际产生者文档支持的声明或调用方修复。2F004 尚未确认 PostgreSQL 原生报告路径,也没有通用重试边界。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

2F000, 38004

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

141 - 2F005 — function_executed_no_return_statement

PostgreSQL SQLSTATE 2F005 的源码与诊断参考。

2F005

速览

SQLSTATE 2F005 是 SQL Routine Exception 类别中“函数执行时缺少 RETURN”的成员。固定的 PostgreSQL 18.6 PL/pgSQL 路径区分普通函数和触发器过程的消息。

字段
SQLSTATE 2F005
条件名 function_executed_no_return_statement
状态 有效
已知存在于 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_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT
别名

含义

确认的消息是 control reached end of function without RETURNcontrol reached end of trigger procedure without RETURN。返回要求取决于例程种类和声明的返回行为;这不是笼统的“函数返回 NULL”消息。

消息

确认的消息是 control reached end of function without RETURNcontrol reached end of trigger procedure without RETURN。返回要求取决于例程种类和声明的返回行为;这不是笼统的“函数返回 NULL”消息。

诊断

读取例程签名以及所有可能到达末尾的控制流。对于触发器过程,按触发器契约检查每个应返回触发器行或 NULL 的分支;对于返回值函数,检查每个分支是否都有兼容的 RETURN

处理

增加所需的返回路径,并在重做操作前验证例程定义。这是例程控制流修复;只有考虑过外层操作是否已经产生可见工作后,才决定重试。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

2F000, 38000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

142 - 34000 — invalid_cursor_name(游标名称无效)

PostgreSQL SQLSTATE 34000:游标生命周期、会话归属与恢复。

34000 — invalid_cursor_name(游标名称无效)

速览

34000 表示当前后端会话无法解析游标或 portal 名称。已经关闭的游标、在另一个连接池会话声明的游标、或事务结束后消失的游标,都不是“游标存在但位置错误”(24000)。

字段
SQLSTATE 34000
条件名 invalid_cursor_name
状态 有效
已知存在于 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_INVALID_CURSOR_NAME, ERRCODE_UNDEFINED_CURSOR
别名 ERRCODE_UNDEFINED_CURSOR

含义

执行器的 portal 路径在 FETCH 找不到命名 portal 时报告 cursor "%s" does not exist。游标属于后端会话;普通游标还受事务生命周期约束,除非明确声明合适的 hold 选项。因此连接池必须在预期事务边界内保持声明和使用都在同一连接。

诊断

记录 SQLSTATE、动态游标名称、后端 PID 和事务状态。检查应用是否提前 CLOSE、发生隐式提交、把连接归还池中,或已经换到另一会话。同一后端上的 pg_cursors 和会话身份可以帮助诊断;新连接不能查看或抓取旧连接拥有的游标。

处理

显式事务中的 FETCH 失败后,先回滚再发后续命令。在同一会话重新声明游标;如果工作必须跨连接池 checkout,就改为物化键或结果。只有确实需要提交后继续读取时才使用 holdable cursor;它不会让游标跨会话可用。

报文

选定核心路径使用 cursor "%s" does not exist;协议和 PL/pgSQL 路径可能使用 portal "%s" 或相同的 cursor 措辞。名称是动态值,应使用 SQLSTATE 和诊断字段,而不是跨版本、跨调用者比较完整报文。

代表案例

共享 registry verify/cases/34000/snippets.json(SHA-256 ad5b519e8ca30fd2636b1d0bace32dc18558cccc7b9d360081c27b12a1405f08)先声明并关闭游标,验证缺失 FETCH,再在同一会话回滚并重新声明。见公开案例导出结构化证据

BEGIN;
DECLARE cursor_name CURSOR FOR SELECT 1;
CLOSE cursor_name;
FETCH cursor_name;
ROLLBACK;
BEGIN;
DECLARE cursor_name CURSOR FOR SELECT 1;
FETCH cursor_name;
CLOSE cursor_name;
COMMIT;

运行器会替换唯一游标名。第一次 FETCH 特意放在 CLOSE 之后;第二次在新的 BEGIN 和声明之后执行,成功返回数据,证明是生命周期修复而非客户端模拟。

选定案例在 PostgreSQL 18.6 和 10.21 关闭命名游标后执行 FETCH,观察到 34000。失败块进入 INERROR;回滚后重新声明、抓取、关闭并提交,连接回到 IDLE

版本

锁定目录在正式快照中都记录了该条件。18.6 和 10.23 源码扫描都包含 portal、PL/pgSQL 路径;选定运行在 18.6 与 10.21 观察到相同 SQLSTATE,但源码行和调用者措辞可能变化。

可对照24000 游标状态无效以及另一个会话资源错误26000 预备语句名称无效

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • src.portalcmds.18.6(SHA-256 e71c5bdb2da67771fb5f42f18b823e8af3ee6c31d5314e97a47ad18f7788bf35
  • DECLARE 官方文档 · 本地调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

143 - 38000 — external_routine_exception

PostgreSQL SQLSTATE 38000 的源码与诊断参考。

38000

速览

SQLSTATE 38000 是外部例程异常类别。固定的 PostgreSQL 18.6 路径覆盖外部命令、UUID 库和 PL 语言处理器;这些实现必须按各自边界分别诊断。

字段
SQLSTATE 38000
条件名 external_routine_exception
状态 有效
已知存在于 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_EXTERNAL_ROUTINE_EXCEPTION
别名

含义

代表性消息包括 program "%s" failedshell command "%s" failed,二者都带内部 wait-status detail;UUID 路径还会报告 OSSP uuid library failure: %sOSSP uuid library failure: error code %duuid library failure: %d 或 UUID 版本不匹配;PL/Perl 有 didn't get a return item from function 等报文,PL/Python 会转发带可选 detail/context/hint 的 %s,PL/Tcl 则有 could not parse function return value: %s 或带上下文的 %s。应保留动态字段和实际产生者;这个类别没有一条固定消息。

消息

代表性消息包括 program "%s" failedshell command "%s" failed,二者都带内部 wait-status detail;UUID 路径还会报告 OSSP uuid library failure: %sOSSP uuid library failure: error code %duuid library failure: %d 或 UUID 版本不匹配;PL/Perl 有 didn't get a return item from function 等报文,PL/Python 会转发带可选 detail/context/hint 的 %s,PL/Tcl 则有 could not parse function return value: %s 或带上下文的 %s。应保留动态字段和实际产生者;这个类别没有一条固定消息。

诊断

根据消息和 context 确认外部边界:程序路径及等待结果、UUID 库操作,还是 PL 语言和例程。检查相关服务器配置和处理器日志,保留动态 %s 值及内部 detail。

处理

修复消息点名的外部命令、库或语言例程,并独立验证该边界。外部动作失败时可能已经产生副作用;在确认完成状态和幂等性前不要重放。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

38001, 2F000

来源

可直接阅读固定的 basebackup_to_shell.ccopyto.cuuid-ossp.cplperl.cpltcl.c 路径;完整范围和未解决的运行边界见结构化证据记录

144 - 38001 — containing_sql_not_permitted

PostgreSQL SQLSTATE 38001 的源码与诊断参考。

38001

速览

SQLSTATE 38001 是外部例程异常类别中“禁止包含 SQL”的成员。锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到原生报告调用组,因此不能把它当成已确认的 PostgreSQL 消息。

字段
SQLSTATE 38001
条件名 containing_sql_not_permitted
状态 有效
已知存在于 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_E_R_E_CONTAINING_SQL_NOT_PERMITTED
别名

含义

当所有者实现禁止外部例程包含 SQL 时,该成员描述所包含的 SQL。产生者可能是外部例程引擎、扩展、ECPG 层、驱动或远端服务器。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

保留准确成员消息、例程所有者、语言和阶段。不要从 PostgreSQL VOLATILE/STABLE 或例程名称推断禁止关系。

处理

遵循实际执行限制的实现及其声明或调用契约。锁定扫描没有建立 PostgreSQL 原生重试或修复机制。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

38000, 2F000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

145 - 38002 — modifying_sql_data_not_permitted

PostgreSQL SQLSTATE 38002 的源码与诊断参考。

38002

速览

SQLSTATE 38002 是外部例程异常类别中“不允许修改 SQL 数据”的成员。锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到原生报告调用组,不能把它与 2F002 混同。

字段
SQLSTATE 38002
条件名 modifying_sql_data_not_permitted
状态 有效
已知存在于 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_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED
别名

含义

区分依据是 SQLSTATE 和例程标准类别,而不是猜测 PostgreSQL 函数 volatility 规则。保留例程属于外部、远端还是客户端。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

检查例程声明和实际执行限制的实现,确认尝试的操作是否修改 SQL 数据以及错误来自哪一边界。

处理

只有在所有者文档支持时才修改数据访问契约,或把写操作移到允许的边界。不要推断通用重试。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

38000, 2F000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

146 - 38003 — prohibited_sql_statement_attempted

PostgreSQL SQLSTATE 38003 的源码与诊断参考。

38003

速览

SQLSTATE 38003 是外部例程异常类别中“尝试执行被禁止 SQL 语句”的成员。该定义存在,但锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到原生报告调用组;它与 2F003 不是同一个 SQLSTATE。

字段
SQLSTATE 38003
条件名 prohibited_sql_statement_attempted
状态 有效
已知存在于 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_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED
别名

含义

外部例程类别指出标准上下文;在找到源码路径或消息前,具体被禁止的语句、例程语言和所有者仍未知。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

保留实际返回的类别/成员码并检查外部例程契约。不要把 dblink 或 postgres_fdw 的 2F003 消息套到 38003。

处理

按固定文档修复所有者的例程或调用契约;未确认 PostgreSQL 原生修复路径。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

38000, 2F000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

147 - 38004 — reading_sql_data_not_permitted

PostgreSQL SQLSTATE 38004 的源码与诊断参考。

38004

速览

SQLSTATE 38004 是外部例程异常类别中“不允许读取 SQL 数据”的成员。锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到原生报告调用组,应与 2F004 分开诊断。

字段
SQLSTATE 38004
条件名 reading_sql_data_not_permitted
状态 有效
已知存在于 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_E_R_E_READING_SQL_DATA_NOT_PERMITTED
别名

含义

只有实际执行限制的外部例程实现才能指出声明、读取操作和消息字段。目录身份不等于后端语言规则。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

记录例程所有者和访问声明,再读取固定源码或协议映射。如果服务器返回 2F004,就按该成员及其所有者处理。

处理

仅按文档调整外部例程契约或调用。读取被拒绝时不要自动重试。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

38000, 2F000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

148 - 39000 — external_routine_invocation_exception

PostgreSQL SQLSTATE 39000 的源码与诊断参考。

39000

速览

SQLSTATE 39000 是外部例程调用异常类别。固定的 PostgreSQL 18.6 pgcrypto 路径会为加密库失败和输入长度无效报告该 ERROR;具体函数与动态错误文本决定诊断方向。

字段
SQLSTATE 39000
条件名 external_routine_invocation_exception
状态 有效
已知存在于 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_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION
别名

含义

代表性消息包括 crypt(3) returned NULLencrypt error: %sdecrypt error: %sencrypt_iv error: %sdecrypt_iv error: %sLength not in range。多个主消息会直接插入 px_strerror(err) 返回的动态库文本;这里的动态内容属于主消息,不是独立的 DETAIL 字段。

消息

代表性消息包括 crypt(3) returned NULLencrypt error: %sdecrypt error: %sencrypt_iv error: %sdecrypt_iv error: %sLength not in range。多个变体把 px_strerror(err) 返回的动态库文本直接放入主消息;它不是独立的 DETAIL 字段。

诊断

确认 pgcrypto 函数和操作(crypt、加解密、IV 形式或长度校验)。保留动态错误字符串,检查输入长度、key/IV 参数和库边界;不要把库错误与远端例程的 SQLSTATE 合并。

处理

修正点名的输入或库/配置问题,并验证同一 pgcrypto 操作。只有操作可安全重复且没有完成外部可见工作时才重试;加密调用失败不能成为重放外层写入的理由。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

39001, 2F000

来源

可直接阅读固定的 pgcrypto.cpgp-cfb.cpx.c 路径;完整范围和未解决的运行边界见结构化证据记录

149 - 39001 — invalid_sqlstate_returned

PostgreSQL SQLSTATE 39001 的源码与诊断参考。

39001

速览

SQLSTATE 39001 是外部例程调用异常类别中“返回无效 SQLSTATE”的成员。锁定的 PostgreSQL 18.6 core/contrib 扫描没有找到当前 PostgreSQL 处理器的报告路径。

字段
SQLSTATE 39001
条件名 invalid_sqlstate_returned
状态 有效
已知存在于 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_E_R_I_E_INVALID_SQLSTATE_RETURNED
别名

含义

保留返回文本、外部语言、例程以及拒绝它的包装层。不要把该成员替换为 XX000,也不要从例程名称猜测无效值。

消息

由于有界扫描没有解析出原生报告调用,本页不采用未经确认的 PostgreSQL 固定消息变体。

诊断

查找固定的外部例程处理器或驱动校验器,检查五字符值和消息。有界扫描没有解析出原生源码边界。

处理

按所有者规则修正例程返回的 SQLSTATE 或接口契约。在确认无效返回和完成状态前不要重试。

版本

锁定目录将该条件的已知下界记为 PostgreSQL 7.4;事实块列出已发布快照,源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

39000, 2F000

来源

详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。

150 - 39004 — null_value_not_allowed

PostgreSQL SQLSTATE 39004 的源码与诊断参考。

39004

速览

39004 是 SQL Routine Exception 类中的 null_value_not_allowed。本页只根据固定定义和有界源码扫描说明定位方法,不把条件名扩展成未经证实的具体调用。

字段
SQLSTATE 39004
条件名 null_value_not_allowed
状态 有效
已知存在于 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_E_R_I_E_NULL_VALUE_NOT_ALLOWED
别名

含义

它表示某个 routine、扩展或其调用边界拒绝了不允许的 NULL。固定 PostgreSQL 18.6 调用归档没有解析出该条件的报告路径,因此不能仅凭 SQLSTATE 判断是参数、返回值、触发器还是其他 routine 约束。

诊断

先保存完整 ErrorResponse 的 message、detail、hint、schema、table、column、routine 与位置字段,再按实际 routine 或扩展实现搜索 ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED。若代码来自客户端封装或扩展,要检查它实际选择的 SQLSTATE;本页的有界扫描不能替代对部署版本的 wrapper 源码检查。

处置

修正诊断中指明的 NULL 输入或 routine 契约,并重新核对调用方与实现方的边界。没有具体报告该码的路径时,不要凭条件名改事务策略、盲目重试或声称某个 SQL 语句必然触发它。

版本

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;这只是定义存在边界,未确认精确引入实现。

39000, 39P01

来源

详见结构化的证据记录,其中列出固定源码链接、消息模板与范围限制。

151 - 39P01 — trigger_protocol_violated

PostgreSQL SQLSTATE 39P01 的源码与诊断参考。

39P01

速览

39P01 是 trigger_protocol_violated。固定源码确认它同时出现在核心 trigger manager、contrib/tcn 以及 PL/Perl trigger 返回值检查中,消息和严重级别取决于具体路径。

字段
SQLSTATE 39P01
条件名 trigger_protocol_violated
状态 有效
已知存在于 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_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED
别名

含义

这是 trigger 调用契约不成立:核心管理器可能报告 trigger function %u returned null valueBEFORE STATEMENT trigger cannot return a value;tcn 函数在错误的 timing/level/参数条件下被调用,或表没有主键;PL/Perl DELETE trigger 的修改可能被 WARNING 忽略,非法返回值则是 ERROR。

诊断

先按 message 区分来源:核心管理器检查 isnull 标志和 BEFORE STATEMENT 返回契约;tcn 要核对 AFTER、FOR EACH ROW、参数个数和主键;PL/Perl 要核对返回是否为 undefSKIPMODIFY。DELETE 修改被忽略的报文是 WARNING,非法返回报文是 ERROR;不要把所有 39P01 都归为同一个 trigger 类型。

处置

修正 trigger 的 timing、level、事件、参数和返回值契约;对 tcn 还要核对表主键和调用顺序。PL/Perl 的 WARNING 表示 DELETE 行修改被忽略,非法返回值则使调用失败;先确认原操作是否完成和业务是否接受该结果,再决定后续写入。修复契约后才重新执行。

版本

锁定目录从 7.4 记录该条件,并在正式快照及 19beta3 中出现;源码路径取 PostgreSQL 18.6。

39P02, 39P03, 2F005

来源

可直接阅读固定的 trigger.ctcn.cplperl.c 路径;完整范围见结构化证据记录

152 - 39P02 — srf_protocol_violated

PostgreSQL SQLSTATE 39P02 的源码与诊断参考。

39P02

速览

39P02 是 srf_protocol_violated。固定 executor 源码确认它检查 set-returning function 的 value-per-call、materialize 以及 returnMode 契约。

字段
SQLSTATE 39P02
条件名 srf_protocol_violated
状态 有效
已知存在于 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_E_R_I_E_SRF_PROTOCOL_VIOLATED
别名

含义

SQL 执行器收到的 ReturnSetInfo 状态与函数声明/实现不一致时,会报告此条件:报文可能是 table-function protocol for value-per-call mode was not followedtable-function protocol for materialize mode was not followedunrecognized table-function returnMode: %d。它描述 SRF 协议,不是普通 SELECT 的行数结果。

诊断

从完整消息判断是哪一类模式,再检查扩展或 C 函数如何设置 rsinfo.returnModeisDonereturnSet 以及结果存储。优先定位提供该 set-returning function 的函数体和部署版本;不要把客户端收到的空结果误判成 39P02。

处置

修正 SRF 实现以遵守所选 value-per-call 或 materialize 协议,并重新验证其 ReturnSetInfo 字段与返回声明。修复函数契约后再重试调用;仅改变 SQL 的 LIMIT、事务或客户端重试策略不能修复该 executor 协议错误。

版本

锁定目录从 7.4 记录该条件,并在正式快照及 19beta3 中出现;固定报告该码的路径 为 PostgreSQL 18.6 execSRF.c

39P01, 39P03, 2F002

来源

可直接阅读固定的 execSRF.c 以及 materialize 路径(665-686 行);完整范围见结构化证据记录

153 - 39P03 — event_trigger_protocol_violated

PostgreSQL SQLSTATE 39P03 的源码与诊断参考。

39P03

速览

39P03 是 event_trigger_protocol_violated。固定核心源码确认多个 event-trigger helper 会检查当前事件上下文。

字段
SQLSTATE 39P03
条件名 event_trigger_protocol_violated
状态 有效
已知存在于 9.5.0
锁定快照 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_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED
别名

含义

调用 pg_event_trigger_dropped_objects()、table-rewrite helper 或 DDL helper 时,如果当前函数不是源码要求的 sql_drop、table_rewrite 或 event trigger function,就会报告该条件。固定报文中的 %s 会带出具体函数名;这属于调用上下文错误,不是对象不存在。

诊断

先保留完整 message,确认被调用的 helper 以及实际 event trigger 类型。sql_droptable_rewrite 和一般 event-trigger 上下文是不同边界;不要把这类错误解释成对象不存在或普通函数返回错误。

处置

把 helper 调用放到匹配的 event trigger function 和事件中,或移除不适用的调用。核对部署版本的 event-trigger 定义与调用顺序后再重新执行 DDL;单纯重试原 DDL 不会改变当前上下文。

版本

锁定目录从 9.5.0 记录该条件,并在 9.5 之后的正式快照及 19beta3 中出现;固定报告该码的路径 为 PostgreSQL 18.6。

39P01, 39P02, P0004

来源

可直接阅读固定的 event_trigger.c helper 路径;完整范围见结构化证据记录

154 - 3B000 — savepoint_exception(保存点异常)

PostgreSQL SQLSTATE 3B000 的来源与机制边界参考。

3B000 — savepoint_exception(保存点异常)

速览

3B000 是保存点异常类别的定义。固定核心调用扫描解析到的是更具体的缺失保存点路径 3B001,没有独立的通用 3B000 抛出点。诊断保存点失败时应使用服务器实际给出的具体 SQLSTATE;本页不编造类别级 RAISE 案例。

字段
SQLSTATE 3B000
条件名 savepoint_exception
状态 有效
已知存在于 8.0.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_SAVEPOINT_EXCEPTION
别名

含义

3B000 是 3B 类的保存点异常条件。固定扫描解析到具体的缺失保存点码 3B001,没有独立的通用类码核心抛出点。因此服务器给出具体码时,应按 3B001 诊断找不到的保存点名称。

诊断

保存请求的保存点名称、是否存在显式事务,以及标记是否已释放或属于另一层嵌套。先读取服务器给出的具体 SQLSTATE:没有事务块时 ROLLBACK TO SAVEPOINT25P01;显式块中缺少标记,在选定源码中由 3B001 表示。本页没有独立的自然运行案例。

处理

按具体错误选择边界:先开启事务再创建保存点;显式事务失败后先回滚,再建立新标记。不要伪造 3B000 的重试或使用 CASCADE;本页保持定义边界,缺失名称请看有源码依据的 3B001 路径。

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

具体的缺失保存点路径见3B001 保存点说明无效

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 固定调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

155 - 3B001 — invalid_savepoint_specification(保存点说明无效)

PostgreSQL SQLSTATE 3B001:缺失保存点、事务状态与恢复。

3B001 — invalid_savepoint_specification(保存点说明无效)

速览

3B001 表示保存点操作引用了当前事务层级中不存在的保存点。它不同于 25P01:后者表示根本没有活动事务块。

字段
SQLSTATE 3B001
条件名 invalid_savepoint_specification
状态 有效
已知存在于 8.0.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_S_E_INVALID_SPECIFICATION
别名

含义

ROLLBACK TO SAVEPOINT 或相关操作无法在当前保存点栈中找到名称时,事务管理器会发出 3B001。PG18 源码模板包含名称;PG10 源码仍使用较早的 no such savepoint 措辞。缺失名称是事务结构问题,不是表数据冲突。

诊断

保存 SQLSTATE、主报文、事务状态和完整保存点序列。检查拼写、保存点是否已经 RELEASE,以及嵌套过程或子事务是否改变了当前层级。显式事务中的 ERROR 会令连接处于 INERROR;回滚之前不要在那里继续执行目录查询或修复 SQL。

处理

回滚失败块,开启新的显式事务,并建立名称和嵌套层级都明确的保存点。如果希望保留部分工作,应在风险语句前建立正确名称的保存点,并只回滚到已存在的标记;错误发生后不能凭空恢复缺失标记。重试应视为新的事务计划,并保留业务幂等检查。

报文

18.6 固定源码包含 savepoint "%s" does not exist 及当前层级的相关变体;选定 PG10 输出为 no such savepoint。这些是有源码依据的版本/调用差异,应根据 3B001 和事务状态处理,不要依赖单一英文完整报文。

代表案例

verify/cases/3B001/snippets.json(SHA-256 595ce7692e34d36cc31df94c65c7040ee9bc4558fa887c23b56ba3187d235deb)包含显式 BEGIN、已存在的 present 保存点、ROLLBACK TO SAVEPOINT missing,以及回滚后的修复序列。见公开案例导出结构化证据

BEGIN;
SAVEPOINT present;
ROLLBACK TO SAVEPOINT missing;
ROLLBACK;
BEGIN;
SAVEPOINT present;
RELEASE SAVEPOINT present;
COMMIT;

运行器使用 autocommit 只是为了让 registry 中的 BEGIN/ROLLBACK/COMMIT 边界完全显式;它断言缺失标记后是 INERROR,恢复提交后是 IDLE

选定案例在 PostgreSQL 18.6 和 10.21 观察到 3B001。PG18 报 savepoint "missing" does not exist,PG10 报 no such savepoint;两者都让显式事务在 ROLLBACK 前保持 INERROR,之后合法保存点序列可以提交。

版本

目录从 8.0.0 或更早边界到正式快照都记录了 3B001。选定的 18.6 与 10.21 运行证明 SQLSTATE 和恢复边界;主要报文则从旧版泛化措辞变为包含保存点名称的模板。

可对照3B000 保存点异常以及没有事务块时的25P01 无活动 SQL 事务

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • src.xact.18.6(SHA-256 75b012c0b047d1dc905a30975c244beec366e45eac0dbf109fd21bcd611a8e39
  • src.xact.10.23(SHA-256 9120bd418bd0f18e3f1065a3772c92ff68f3be54e1a8c6d415043197f6daa47c
  • SAVEPOINT 官方文档 · 本地调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

156 - 3D000 — 目录名称无效(invalid_catalog_name)

PostgreSQL SQLSTATE 3D000(目录名称无效,invalid_catalog_name)的源码证据、诊断与处理参考。

3D000 — 目录名称无效

速览

SQLSTATE 3D000 是 Class 3D 中的 invalid_catalog_name3D000 表示数据库/目录名称无效。请求的数据库不存在时,它可以在启动完成前出现;固定的 dbcommands.c 路径也会在 SQL 命令解析不存在的数据库或模板时发出它。选定启动案例报告 C=3D000、S=FATALdatabase "<generated>" does not exist;这只是其中一个阶段,不代表整个类别。

字段
SQLSTATE 3D000
条件名 invalid_catalog_name
状态 有效
已知存在于 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_INVALID_CATALOG_NAME, ERRCODE_UNDEFINED_DATABASE
别名 ERRCODE_UNDEFINED_DATABASE

含义

此码覆盖不止一个阶段的数据库/目录解析。请求数据库不存在时,postinit.c 在启动阶段发出选定的 FATAL;dbcommands.c 则在 SQL 命令解析不存在的数据库或模板时使用同一条件。因此启动记录只是一个具体 producer,不是所有 3D000 的统一描述。

要把阶段作为诊断的一部分。缺失数据库的启动 DSN 产生服务器 FATAL,没有会话级事务;已建立的管理会话执行数据库/模板查找命令时可能产生 ERROR,此时适用普通回滚或保存点恢复。代码本身不能告诉你失败发生在哪个阶段。

阶段指引

阶段 固定 producer 恢复边界
启动选择数据库 postinit.cFATAL 报告 database "%s" does not exist 从控制数据库修正 DSN 或创建/重命名数据库,再建立新连接;没有可回滚的会话。
SQL 命令或模板查找 dbcommands.c 在处理管理命令时使用 3D000 检查命令和事务;显式事务中的 ERROR 需要先 ROLLBACK 或回到有意建立的保存点。

诊断

检查数据库名、数据库是否被重命名或删除、发生错误的命令阶段,以及可用的控制数据库。选定的 collector 是原始服务器 ErrorResponse 记录,不是 csvlog/jsonlog;原始启动尝试与 psycopg 尝试彼此独立。选定运行使用相互独立的启动尝试:psycopg 的驱动 SQLSTATE 为 null 且没有事务,服务器原始 ErrorResponse 与新鲜的已知数据库探针共同确认服务器码和恢复路径。不要把数据库不存在与 3F000 的 schema 解析混淆。

对于启动失败,检查客户端默认值、URL 解码和环境变量展开后的准确数据库参数,再查看原始服务器 CSM 字段。对于已建立会话中的 SQL 命令,另行记录命令文本和事务状态。成功的控制数据库探针只证明可以建立新会话,不证明缺失数据库的原始尝试拥有事务。

处理

使用现有控制数据库检查或创建目标数据库,或修正 DSN/命令目标后重新建立连接。会话启动前没有 ROLLBACK 可执行;SQL 命令路径应在所属管理事务中修复,并重新核对目标目录。

如果数据库是有意删除的,应修正应用目标或迁移,而不是重复同一启动请求。如果管理命令是在已有会话中失败,先恢复该事务,再执行目录修改。重复其他连接发送的工作前先对账;启动失败本身没有在缺失数据库中执行 SQL。

实测诊断

选定的启动分支以 FATAL 发出主报文 database "%s" does not exist,数据库名是动态值。固定的 SQL 命令路径使用同一 SQLSTATE,但外围操作和事务边界可能不同。只有客户端启动异常而没有服务器 ErrorResponse,证据不足。

选定名称 c3d000_missing_cff0e8d38be4 是本次运行生成的值。服务器 ErrorResponse 为 C=3D000S=FATAL;psycopg 启动的 sqlstate=null 与已知数据库探针属于独立尝试,不是同一会话的其他视图。

代表案例

注册表包含服务器启动 ErrorResponse 后执行的探针。触发点是在新启动连接上使用随机数据库名,失败发生在会话建立前,不能用 SQL 语句重现。

SELECT 1;

18.6 服务器 ErrorResponse 为 C=3D000、S=FATALdatabase "c3d000_missing_cff0e8d38be4" does not exist。驱动启动诊断的 SQLSTATE 为 null,失败连接没有事务;已知可用连接探针返回 1,状态 IDLE

可下载的案例与证据投影分别是 3D000 案例 JSON作者证据。运行器清单为 verify/cases/3D000/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.postinit-missing-db.18.6src/backend/utils/init/postinit.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 abcf80637b153d3aa6f0d2b600943af0a2b4d9a393d05a844db91f8b6b66d0d7 (source).
  • src.postinit-missing-db.10.23src/backend/utils/init/postinit.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 be912628b29f34afc7b7fbc9d2f480c5ac9cb6ce013a1d992fc7415a311a95ed (source).
  • src.dbcommands-missing-database.18.6src/backend/commands/dbcommands.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 64b77d2197dce16eb1ad19d8168382459d621a03df0b00be157f7db39ca22acf (source).
  • src.dbcommands-missing-database.10.23src/backend/commands/dbcommands.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 cf9e069415deb7d50ef931048616ae7f9a459d6db64e3d54a0062e8334970ce6 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

157 - 3F000 — 模式名称无效(invalid_schema_name)

PostgreSQL SQLSTATE 3F000(模式名称无效,invalid_schema_name)的源码证据、诊断与处理参考。

3F000 — 模式名称无效

速览

SQLSTATE 3F000 是 Class 3F 中的 invalid_schema_name3F000 表示已建立会话无法解析 schema 名称。选定的限定表路径得到 schema "<generated>" does not exist;固定的 namespace 和 schema 命令路径还覆盖对象创建等 SQL 阶段的解析,它不只是一个 search_path 提示。

字段
SQLSTATE 3F000
条件名 invalid_schema_name
状态 有效
已知存在于 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_INVALID_SCHEMA_NAME, ERRCODE_UNDEFINED_SCHEMA
别名 ERRCODE_UNDEFINED_SCHEMA

含义

当 schema 名称本身无法解析时,namespace 查找会发出此条件。限定引用不存在的 schema 时使用 schema "%s" does not exist;未限定的 CREATE 没有可用创建命名空间时使用 no schema has been selected to create in。两者都是 schema 解析分支。普通未限定关系查找不到关系时使用 42P01,即使原因是 search_path 不合适;权限不足则进入 42501

首先要判断失败的名称是 schema 还是关系。missing_schema.repaired_table 这样的限定引用会要求 namespace 代码解析准确的 schema,可以产生 3F000;没有显式 schema 的 CREATE 在没有可选创建 schema 时也可以产生 3F000。相反,SELECT * FROM missing_table 是未限定关系查找,通常产生 42P01search_path 只决定搜索哪些关系,不会把该 SQLSTATE 变成 3F000。角色缺少所需权限时进入 42501。即使应用都报告“找不到 schema”,这些分支的修复也不同。

诊断

区分明确缺失的 schema、没有选定创建 schema 的 CREATE、未限定关系查找,以及 42501 权限不足。选定自动提交会话在 ERROR 后保持 IDLE;所有者显式创建目标 schema 和表,插入一行,并在明确命名空间下核对。检查失败命令使用的相同角色和数据库。

使用失败命令的相同角色和数据库检查标识符,例如查看 current_schemas(true),并确认目标 schema 能否在目录中解析。再核对命令是否限定名称:选定案例有意引用不存在的限定 schema;如果是未限定 CREATE,要检查 search_path 是否有可用创建目标;如果是未限定关系读取,关系缺失应归为 42P01,而不是 3F000。显式事务中的选定 ERROR 可能使事务进入 INERROR;自动提交的 IDLE 不是通用恢复结果。

处理

使用迁移或所有者连接执行 CREATE SCHEMA,设置或限定目标命名空间,并用同一角色验证对象。对于 no schema has been selected to create in,应选择允许创建的 schema 或限定 CREATE;对于未限定的缺失关系,应修复关系名或目标 search_path,在关系可解析前应预期 42P01。不要通过添加无关 schema 到 search_path 掩盖命名空间错误;如果名称是有意删除的,应修复迁移或目标,而不是原样重试。

创建或暴露 schema 后,用同一角色重跑准确的限定语句,并核对最终对象。若失败语句位于显式事务中,应先回滚或回到预先设计的保存点,再执行无关 DDL。不要用扩大 schema 权限代替检查应用连接的数据库或使用的标识符。

实测诊断

固定的 namespace 路径在明确缺失 schema 时以 ERROR 发出主报文 schema "%s" does not exist,在未限定 CREATE 没有活动创建命名空间时发出 no schema has been selected to create in。选定的限定表案例没有固定 DETAIL 或 HINT。未限定关系查找不到时是独立的 42P01 relation "%s" does not exist 路径,角色权限不足则是 42501

选定的动态名称为 c3f000_invalid_schema_name_missing,错误发生在会话建立后,没有固定 DETAIL 或 HINT。这与源码确认的 schema 命令路径,以及启动阶段的客户端失败不同。

代表案例

此 SQL 块限定不存在的 schema,创建 schema 与表,插入一行并核对,最后删除临时 schema。

CREATE TABLE missing_schema.repaired_table (id integer);
CREATE SCHEMA missing_schema;
CREATE TABLE missing_schema.repaired_table (id integer);
INSERT INTO missing_schema.repaired_table VALUES (1);
SELECT count(*) FROM missing_schema.repaired_table;
DROP SCHEMA missing_schema CASCADE;

18.6 运行记录 SQLSTATE 为 3F000,主报文 schema "c3f000_invalid_schema_name_missing" does not exist;断言的错误后状态为 IDLE,随后探针/修复成功。18.6 与 10.21 的断言和清理均通过。

可下载的案例与证据投影分别是 3F000 案例 JSON作者证据。运行器清单为 verify/cases/3F000/cases.json;发布前会将页面 SQL 与共享注册表比对。

版本

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.namespace-missing-schema.18.6src/backend/catalog/namespace.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 8c9e6a99e84fa2cec8a9b1de2ecbe3966a13f4ad68c6ccfbfb8134a754d73e56 (source).
  • src.namespace-missing-schema.10.23src/backend/catalog/namespace.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 74833354740d0e5679507d07b3c6e41aea01c2cb30adcd1e238bed3ebf96ddc6 (source).
  • src.namespace-creation-no-schema.10.23src/backend/catalog/namespace.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 74833354740d0e5679507d07b3c6e41aea01c2cb30adcd1e238bed3ebf96ddc6 (source).
  • src.parse-relation-undefined-table.10.23src/backend/parser/parse_relation.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 a34f40fc93fa5df0015fe5af5ee7761ccba2d16a791cda69ae07848ed27616b5 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed local call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c; these scans preserve the resolved call context used by the claims.

158 - 40000 — transaction_rollback(事务回滚)

PostgreSQL SQLSTATE 40000 的来源与机制边界参考。

40000 — transaction_rollback(事务回滚)

速览

40000 是事务回滚的总括条件。18.6 固定源码包含 transaction aborted during system catalog scan 的内部系统目录扫描路径;复现它需要安全 SQL 案例之外的内部故障或可见性条件。不要把序列化失败、死锁或任意客户端取消改称 40000。

字段
SQLSTATE 40000
条件名 transaction_rollback
状态 有效
已知存在于 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_TRANSACTION_ROLLBACK
别名

含义

40000 是宽泛的事务回滚条件。genam.c 中解析到的核心路径是防御性内部错误:系统目录扫描期间事务已中止。它不是 40001 表示的常规客户端重试路径,也不是死锁报告。

诊断

若真实出现 40000,保存服务器日志、后端 PID、操作和源码诊断;固定主模板是 transaction aborted during system catalog scan。检查日志是否指向内部目录/索引可见性问题或服务器故障。客户端 ROLLBACK、序列化失败或语句取消都不能证明该码,选定扫描也没有安全的纯 SQL 复现。

处理

按服务器要求结束失败事务,并在重试前调查目录/索引和服务器健康状态。只有会话不可用时才重连,重做写入前先核对持久化结果。不要把 4000140P01 或普通回滚改称 40000;本页只记录内部源码边界。

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

可对照有明确机制的40001 序列化失败40P01 检测到死锁

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 源码路径(SHA-256 11897b1d8b1ae1f4a1bef9a72e740da7aa83579abf84e4ca5ebacd6530874c28

159 - 40001 — serialization_failure:序列化失败

当可串行化事务无法与并发更新形成一致的提交顺序时,PostgreSQL 会报告 SQLSTATE 40001。应回滚完整事务,并从新快照开始重试。

速览

40001 是 PostgreSQL 类别 40 transaction_rollback 中的 serialization_failure 条件。它告诉客户端,事务观察到的顺序无法与并发事务组成可串行化顺序,因此 PostgreSQL 中止冲突事务,让客户端重新执行。

代表性案例启动两个 SERIALIZABLE 事务,让它们读取同一值。第一个事务更新并提交;旧快照事务随后收到 could not serialize access due to concurrent update,进入 INERROR,只有 ROLLBACK 后才回到 IDLE。新的可串行化事务读取已提交值,执行 registry 中固定的 SET value = 2 操作并提交最终结果;这证明的是事务边界,不是业务计算逻辑。

运行 40001-manual-boundary-final-20260909 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。逐目标断言和结构化观察见公开证据 JSON

字段
SQLSTATE 40001
条件名 serialization_failure
状态 有效
已知存在于 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_T_R_SERIALIZATION_FAILURE
别名

含义与触发路径

SERIALIZABLE 隔离级别下,PostgreSQL 跟踪谓词和元组冲突;如果事务结果依赖一个无法串行化的顺序,就会拒绝该事务。旧事务更新之前已读取、后来被并发事务更新的行,是其中一个具体路径。SQLSTATE 说明事务结果,不说明业务操作是否应该重试。

执行器的更新路径使用 ERRCODE_T_R_SERIALIZATION_FAILUREcould not serialize access due to concurrent update 源码报文。其他序列化冲突可能使用不同报文,恢复冲突也可能附带 detail,但仍表达事务回滚语义。应用日志应保存完整诊断以及事务的读写集合。

4000123505 不同:用户主动请求的重复值不自动成为序列化失败,即使某些并发生成键的设计会产生应用认为可重试的唯一冲突。应根据操作语义和完整事务历史决定重试策略。

报文与诊断

下面的调度需要两个会话分别建立最初的快照。最后一段使用新的连接和新的可串行化快照,这是完整重试的必要部分。

CREATE TABLE serial_rows(id integer PRIMARY KEY, value integer NOT NULL);
INSERT INTO serial_rows VALUES (1, 0);

-- 在第一次提交前打开两个 SERIALIZABLE 快照。
BEGIN ISOLATION LEVEL SERIALIZABLE;
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- first 会话读到 0;stale 会话也读到同一个 0。
SELECT value FROM serial_rows WHERE id = 1;
SELECT value FROM serial_rows WHERE id = 1;

-- first 会话写入 1 并提交;随后 stale 会话用旧快照写入。
UPDATE serial_rows SET value = 1 WHERE id = 1;
COMMIT;
UPDATE serial_rows SET value = 2 WHERE id = 1;
-- UPDATE 报告 40001,事务变为 INERROR。
ROLLBACK;

-- 新的重试事务:读取新值,重新执行操作并提交。
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT value FROM serial_rows WHERE id = 1;
UPDATE serial_rows SET value = 2 WHERE id = 1;
COMMIT;
SELECT value FROM serial_rows WHERE id = 1;

PostgreSQL 18.6 返回:

SQLSTATE: 40001
severity: ERROR
message_primary: could not serialize access due to concurrent update
message_detail: <none>
source: nodeModifyTable.c / ExecUpdate / line 2604

PostgreSQL 10.21 的主报文相同,nodeModifyTable.c 行号随版本变化。本路径没有 message_detail;其他冲突来源可能附带更多字段。SQLSTATE 和事务已经中止的状态是稳定的重试信号。

诊断

记录 SQLSTATE、严重级别、主报文、detail、hint、上下文、隔离级别、建立快照的语句以及事务状态。确认哪个事务先提交,以及哪些读取已过期。runner 断言两个初始读取都是 0,first 提交后为 IDLE,stale 事务在回滚前为 INERROR

不要在失败事务上继续查询。先回滚,再以新的事务开始,并重复完整的读取、决策和写入。只重放最后一条 UPDATE 可能基于已经失效的快照作出决定。

处理与修复

当操作为此设计时,应把 40001 当作事务重试信号:

  • 回滚整个失败事务并释放锁。
  • 按要求的隔离级别启动新事务,重新读取业务决策依赖的所有值。
  • 使用有限退避和最大重试次数重新执行操作。
  • 让操作具备幂等性,并在提交后验证最终业务结果。

代表性重试读取 1、写入 2、以 IDLE 状态提交,独立读取观察到最终值 2。这个隔离案例中的固定赋值不能证明生产环境任意计算都可重放;应用必须从新快照重新计算。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 40001,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。9.0 到 9.1 之间记录了类别标题变化;目录保留该变化,扫描范围内条件没有其他定义变化。

旧快照更新案例在 PostgreSQL 18.6 和 10.21 上均通过。源码行号和冲突 detail 会因版本和冲突类型变化。本证据只覆盖旧快照更新及其新的完整重试,不声称所有 40001 路径使用相同报文,也不声称所有事务都能安全重试。

40P01deadlock_detected 同样会中止事务并可能要求完整重试,但触发原因是锁环。23505unique_violation 是不同的完整性条件,不能自动重试。23503foreign_key_violation 可能是持久的数据关系错误。25P02in_failed_sql_transaction 是失败事务回滚前的后续状态。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留精确目标 ID 和结构化观察。

160 - 40002 — transaction_integrity_constraint_violation(事务完整性约束违规)

PostgreSQL SQLSTATE 40002 的来源与机制边界参考。

40002 — transaction_integrity_constraint_violation(事务完整性约束违规)

速览

40002 是目录定义的事务完整性条件。本批固定扫描没有解析出独立的 PostgreSQL 核心 40002 抛出点,因此不把外键、唯一性或其他具体约束错误重新标成这个总括码。应保存操作实际发出的 SQLSTATE。

字段
SQLSTATE 40002
条件名 transaction_integrity_constraint_violation
状态 有效
已知存在于 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_T_R_INTEGRITY_CONSTRAINT_VIOLATION
别名

含义

40002 表示 40 类的事务完整性约束违规,但固定的 PostgreSQL 核心扫描没有解析出独立的 40002 调用点。PostgreSQL 的具体完整性机制通常报告 23 类具体码,例如 2350223503235052351423P01

诊断

从错误中读取实际 SQLSTATE、约束名、关系、列和 DETAIL。服务器给出具体 23 类码时,应按该约束及事务状态诊断;不能因为操作发生在事务中就升级为 40002。本页没有选定的自然运行案例,也没有服务器特定报文模板。

处理

修复具体约束违规和事务边界,再核对预期持久化状态。不要添加通用重试,也不要把已知 235xx/23P01 结果改称 40002;只有真实组件提供该码及其证据时才使用这一类定义。

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

服务器给出具体完整性码时,应使用它,例如23503 外键违规23505 唯一性违规

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 固定调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

161 - 40003 — statement_completion_unknown(语句完成状态未知)

PostgreSQL SQLSTATE 40003 的来源与机制边界参考。

40003 — statement_completion_unknown(语句完成状态未知)

速览

40003 描述语句完成状态不确定,通常是连接或协议边界上的结果核对问题。本批固定核心扫描没有提供安全的 SQL-only 自然触发方式。客户端超时或伪造 RAISE 都不能证明服务器完成状态不确定;重试前先核对持久化业务状态。

字段
SQLSTATE 40003
条件名 statement_completion_unknown
状态 有效
已知存在于 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_T_R_STATEMENT_COMPLETION_UNKNOWN
别名

含义

40003 表示语句完成状态未知:连接或传输失败后,客户端无法判断服务器是否已经完成语句。它是结果可知性的边界,不能证明语句失败,也不能指示盲目回滚。

诊断

用请求标识或幂等键关联服务器日志、后端活动、提交记录和持久化业务状态。套接字异常通常没有服务器 SQLSTATE,固定扫描也没有安全的核心纯 SQL 40003 触发器。客户端超时、断链,以及在新会话上执行 ROLLBACK 都是独立事实,不能证明原语句已撤销。

处理

重试前先核对:在新的健康会话上查询权威持久化状态;只有同时匹配原请求和业务结果后,幂等键才能表示“已处理”;再由应用判断是否可重复执行。不要声称通用重试或回滚能解决未知完成状态,也不要用 RAISE 或本地超时伪造 40003

版本

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径;不能仅从定义推导精确行为引入版本或更广的运行覆盖。

可对照服务器明确确认可重试的40001 序列化失败;40003 必须先核对结果。

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • 固定调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

162 - 40P01 — deadlock_detected:检测到死锁

当事务形成锁等待环时,PostgreSQL 会报告 SQLSTATE 40P01。应回滚受害事务、统一加锁顺序,并且只在业务语义允许时重试完整操作。

速览

40P01 是 PostgreSQL 类别 40 transaction_rollback 中的 deadlock_detected 条件。它表示锁管理器发现事务之间形成等待环,因此选择一个受害事务并中止它。

主报文是 deadlock detected。服务器可能附带动态构造的等待图 detail、提示查看服务器日志的 hint,以及说明被中断语句的上下文。进程 ID、事务 ID 和具体等待图都随运行变化;应按 SQLSTATE 分支并保存结构化字段,不要匹配这些动态值。

代表性案例先让两个会话分别持有相反的行锁,再用 threading.Barrier 放行两个交叉请求,同时由独立观察会话采样 pg_stat_activitywait_event_type=Lock。观察会话不负责放行请求。一个会话收到 40P01 后事务为 INERROR;幸存会话完成操作,随后两个会话都回到 IDLE。新的事务按顺序取得两把行锁并提交完整重试。

运行 40P01-manual-boundary-final-20260909 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。逐目标断言和结构化观察保存在公开证据 JSON中。

字段
SQLSTATE 40P01
条件名 deadlock_detected
状态 有效
已知存在于 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_T_R_DEADLOCK_DETECTED
别名

含义与触发路径

死锁需要等待图中出现环。常见形式是会话 A 锁住第 1 行后请求第 2 行,同时会话 B 锁住第 2 行后请求第 1 行。PostgreSQL 的死锁检测器会在配置的 deadlock timeout 到期后检查锁图,DeadLockReport 随后报告该条件。

这个错误说明事务协调失败,不表示行数据损坏。受害事务的全部工作都会中止。另一个事务可能在检测器打破环后继续,但它成功完成并不意味着受害事务的预期工作已经应用。

40P01 不等于最终成功的锁等待,也不同于由 statement timeout 引起的 57014。本案例观察到的 pg_stat_activity 锁等待用于证明死锁准备顺序;服务器返回的 deadlock detected 才是最终条件。

报文与诊断

下面的调度是代表性操作。应在两个连接上分别执行会话 A 和 B;两个会话先各自持有一把行锁,随后由 barrier 放行交叉请求,独立观察会话在请求等待期间采样两个 backend。观察会话不是放行条件。

CREATE TABLE locks(id integer PRIMARY KEY, marker text NOT NULL);
INSERT INTO locks VALUES (1, 'seed-1'), (2, 'seed-2');

-- 会话 A:开始事务、设置 deadlock_timeout,并锁住 id = 1。
BEGIN;
SET deadlock_timeout = '100ms';
UPDATE locks SET marker = 'first-1' WHERE id = 1;

-- 会话 B:开始事务、设置 deadlock_timeout,并锁住 id = 2。
BEGIN;
SET deadlock_timeout = '100ms';
UPDATE locks SET marker = 'second-2' WHERE id = 2;

-- 明确的 barrier 让两个请求同时进入锁循环。
UPDATE locks SET marker = 'first-2' WHERE id = 2;
UPDATE locks SET marker = 'second-1' WHERE id = 1;

-- 受害事务必须 ROLLBACK;幸存事务可以 COMMIT。
ROLLBACK;
COMMIT;

-- 新的重试连接按同一顺序取得锁,并验证两行。
BEGIN;
UPDATE locks SET marker = 'retry-1' WHERE id = 1;
UPDATE locks SET marker = 'retry-2' WHERE id = 2;
COMMIT;
SELECT id, marker FROM locks ORDER BY id;

PostgreSQL 18.6 对受害事务返回的形状为:

SQLSTATE: 40P01
severity: ERROR
message_primary: deadlock detected
message_detail: Process <pid-a> waits for ShareLock on transaction <xid-b>; blocked by process <pid-b>.
Process <pid-b> waits for ShareLock on transaction <xid-a>; blocked by process <pid-a>.
message_hint: See server log for query details.
context: while updating tuple (0,2) in relation "locks"
source: deadlock.c / DeadLockReport / line 1138

PG10 运行得到相同的主报文和字段,但源码行号随版本变化。detail 来自实时等待图,因此此处用运行时占位符表示进程和事务标识。hint 并不保证客户端一定收到对应的服务器日志条目,它是在日志已配置时指向调查位置。

诊断

记录 SQLSTATE、严重级别、主报文、detail、hint、上下文、失败语句、backend PID 和事务状态。在等待仍存在时检查 pg_stat_activity 及相关锁视图。有用的观察应包含 wait_event_type=Lock、等待事件、当前查询和参与的 PID;单纯 sleep 不能建立死锁证据。

应根据实际应用代码及所有访问同一行或 advisory lock 的路径整理加锁顺序,并检查触发器、外键、索引或后台 worker 是否取得了额外的锁。deadlock_timeout 只控制何时检测,调大它会改变检测延迟,不能消除等待环。

错误发生后,受害连接必须先 ROLLBACK,因为此时为 INERROR;幸存连接在提交前可能为 INTRANS。runner 验证了显式清理后两者都回到 IDLE,并在重试前读取了数据。

处理与修复

回滚受害事务并释放其锁,再选择完整修复:

  • 让所有代码路径按一致顺序取得同一组锁,最好显式排序键值。
  • 缩短事务,不要在持有数据库锁时等待外部工作。
  • 只有在操作可重复且结果具备幂等语义时,才从头重试整个事务,包括读取和加锁。
  • 重试后验证已提交的业务结果;幸存事务的部分更新不能证明受害事务的工作成功。

本案例的修复按顺序锁定第 1 行和第 2 行,提交 retry-1retry-2,并在连接为 IDLE 时读取两行。生产实现仍需有限的重试预算和应用级幂等键;单凭 SQLSTATE 不能判断重复操作是否安全。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 40P01,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。9.0 头文件视图到 9.1 文本定义之间记录了类别标题变化;这只是目录观察,不是代码引入日期。扫描范围内条件行没有其他定义变化。

双会话案例在 PostgreSQL 18.6 和 10.21 上均通过。检测时点、锁类型和 detail 取决于工作负载与设置;本页采用 SQLSTATE 及事务回滚要求作为兼容边界,而不是固定的进程 ID detail。

40001serialization_failure 同样要求从新快照开始重试完整事务。57014query_canceled 表示取消,不表示锁环。23503foreign_key_violation23505unique_violation 是可能出现在锁顺序需要复核的事务中的完整性条件。25P02in_failed_sql_transaction 是受害事务中止后出现的后续状态。

来源

结构化证据记录在公开证据 JSON中。所有源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留各目标的精确 ID 和结构化观察。

163 - 42000 — 语法错误或访问规则违反(syntax_error_or_access_rule_violation)

PostgreSQL SQLSTATE 42000(语法错误或访问规则违反,syntax_error_or_access_rule_violation)的源码证据、诊断与处理参考。

42000 — 语法错误或访问规则违反

速览

SQLSTATE 42000 是 Class 42 中的 syntax_error_or_access_rule_violation42000 是“语法错误或访问规则违反”的宽泛总类。本批固定 PostgreSQL 路径报告 42501、42601 等具体子码,因此只记录定义边界。

字段
SQLSTATE 42000
条件名 syntax_error_or_access_rule_violation
状态 有效
已知存在于 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_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION
别名

含义

42000 是“语法错误或访问规则违反”的宽泛总类。本批固定 PostgreSQL 路径报告 42501、42601 等具体子码,因此只记录定义边界。

诊断

先按服务器 SQLSTATE 和命令阶段分类。客户端解析异常或本地抛出的异常不能证明总类码,也不要把具体子码扩大记录为 42000。

处理

按诊断中指出的具体语法或访问规则修复并重试该命令,在日志和指标中保留子码。

报文

本页没有选定的自然 producer,也没有为该总类确认固定子报文。本批具体后端路径报告的是 4250142601 等子 SQLSTATE;只有客户端异常而没有服务器 SQLSTATE 时,不能据此认定 42000

代表案例

本页没有选定的自然 SQL 运行;这里只记录固定源码边界,不使用伪造触发器。

版本

本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能证明所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

164 - 42501 — 权限不足(insufficient_privilege)

PostgreSQL SQLSTATE 42501(权限不足,insufficient_privilege)的源码证据、诊断与处理参考。

42501 — 权限不足

速览

SQLSTATE 42501 是 Class 42 中的 insufficient_privilege42501 表示权限不足。选定的自然路径让另一个角色在只有 schema USAGE、没有 sequence USAGE 时调用 runner 自有序列的 nextval,服务器报告 permission denied for sequence %s

字段
SQLSTATE 42501
条件名 insufficient_privilege
状态 有效
已知存在于 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_INSUFFICIENT_PRIVILEGE
别名

含义

42501 表示权限不足。在选定路径中,nextval 进入 nextval_internal,先按有效的 GetUserId() 检查序列访问权限,再推进序列。schema 的 USAGE 只允许受限角色解析该 schema 中的对象,并不会授予本次调用所需的序列权限,因此服务器发出 ERROR 主报文 permission denied for sequence %s;其中序列名是动态值。

这里的 owner 边界很重要:owner 或管理员连接负责准备一次性 schema 和序列,另一个受限角色连接负责执行 nextval。实际修复是由 owner/管理员连接窄授 GRANT USAGE ON SEQUENCE ...,再让同一个受限角色重试;这不表示受限角色可以自行给自己授权。

同一 SQLSTATE 还覆盖其他权限边界。通用 ACL 检查器可以报告 permission denied for relation %spermission denied for schema %s 或列级形式;只允许 owner 的操作则使用 must be owner of relation %s 或相应对象类型。行级安全是执行器的另一层检查:表 ACL 通过时,INSERTUPDATE 的行仍可能违反策略并报 new row violates row-level security policy ...。这些是固定源码确认的 producer 分支,不是选定序列运行的额外观察。

诊断

检查 current_usersession_user、任何 SET ROLE、数据库、schema、准确关系或列,以及相应 ACL。把准备/授权连接与探测连接分开:将 runner_hostrunner_portrunner_dbrunner_user 替换为真实一次性目标和 owner/管理员凭据,再用另一个连接以生成的受限角色(例如 syntax_role)执行 nextval。否则连接池可能让 ACL 变更看起来作用到了另一个 backend。如果主报文点名关系、schema 或列,应检查该对象的权限,而不是假设都是 sequence USAGEmust be owner 要检查对象 owner 和生效角色;RLS 主报文则要检查适用于该角色的策略 USING/WITH CHECK。选定的自动提交探测得到 ERROR 后同一探测会话仍为 IDLE;显式事务则要先按自己的错误状态处理,再继续操作。它不同于 28000 的启动授权失败和 0A000 的功能不支持。

处理

由 owner/管理员连接只授予准确对象所需的权限(本例为 sequence USAGE),或使用应用设计所需的 owner/security-definer 或 RLS 策略。修改 ACL 后在同一个受限角色会话重试 nextval,并核对返回值和会话状态。超级用户确实会绕过 ACL,但不要把角色升为超级用户来替代有针对性的最小授权;schema USAGE、表权限和序列权限是不同检查。owner-only 失败应使用 owner/迁移角色,或有意识地变更 owner,而不是把 ACL 授权当成 owner 转移。如果涉及角色成员关系或 SET ROLE,还要检查实际生效角色。

报文

选定序列源码路径以 SQLSTATE 42501 发出明确的 ERROR,主报文为 permission denied for sequence %s%s 是解析出的序列关系名;该路径没有 DETAIL 或 HINT。其他固定 ACL 分支使用 permission denied for relation %spermission denied for schema %spermission denied for column "%s" of relation "%s";owner-only 检查使用 must be owner of relation %s 或相应对象类型。RLS WITH CHECK 分支使用 new row violates row-level security policy ... 主报文。只有客户端异常而没有针对具体分支的服务器 SQLSTATE 和主报文时,不能据此识别该 42501 producer。

代表案例

本页使用与运行器注册表相同的语句。owner/管理员连接创建序列并授予 schema USAGE;受限角色连接执行两次 nextval 探测。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值,runner_hostrunner_portrunner_dbrunner_user 等连接占位符也必须替换为真实目标,不能照抄字面值。

CREATE SEQUENCE syntax_schema.syntax_sequence START WITH 1;
GRANT USAGE ON SCHEMA syntax_schema TO syntax_role;
SELECT nextval('syntax_schema.syntax_sequence');
GRANT USAGE ON SEQUENCE syntax_schema.syntax_sequence TO syntax_role;
SELECT nextval('syntax_schema.syntax_sequence');

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42501 案例 JSON作者证据。运行器清单为 verify/cases/42501/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.sequence-permission.18.6src/backend/commands/sequence.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 3e5afe17d5a84862fae502a5481211220368f1d639e9d07ba6f96ee8be92a8d8 (source).
  • src.sequence-permission.10.23src/backend/commands/sequence.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 5510e1266e8d8c548a4318d753392e92e689d348f3353a2aa53d8dea871c44ab (source).
  • src.aclcheck-errors.18.6 / src.aclcheck-errors.10.23 — fixed src/backend/catalog/aclchk.c ACL-kind tables map no-privilege and not-owner results to relation/schema/column messages; blob SHA-256 9700258318959b47c42edb423418fb511dd3a008023e732f601eecf4c80868f8 / 3a4330bd55ea8c0ec12324d7046ec31d64c920f99196235b84612d6cd1a4b26c (18.6 source, 10.23 source).
  • src.rls-errors.18.6 / src.rls-errors.10.23 — fixed src/backend/executor/execMain.c row-level security WITH CHECK errors; blob SHA-256 33b97337fa23a649c5e7a092e1bd405a54e8503529236c62c9d5bb93a1774a8d / 386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a (18.6 source, 10.23 source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

165 - 42601 — 语法错误(syntax_error)

PostgreSQL SQLSTATE 42601(语法错误,syntax_error)的源码证据、诊断与处理参考。

42601 — 语法错误

速览

SQLSTATE 42601 是 Class 42 中的 syntax_error42601 表示语法错误。选定的解析器路径拒绝 LIMIT 1, 2,主报文为 LIMIT #,# syntax is not supported,提示为 Use separate LIMIT and OFFSET clauses.

字段
SQLSTATE 42601
条件名 syntax_error
状态 有效
已知存在于 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_SYNTAX_ERROR
别名

含义

42601 表示语法错误。选定的 gram.y 分支在解析阶段拒绝逗号写法,发出 ERROR 主报文 LIMIT #,# syntax is not supported 和提示 Use separate LIMIT and OFFSET clauses. 因此在 PostgreSQL 中逗号写法不是“跳过 1 行再取 2 行”的请求;两个数必须分别写成两个子句。

扫描器和语法分析器共同实现一般的 42601 路径。scanner_yyerror 设置 SQLSTATE:当前位置仍有 token 时报告 syntax error at or near "%s",扫描器到达输入缓冲区末尾时报告 syntax error at end of input,并附带词法位置。语法动作也可以通过同一格式化路径提供更具体的报文。选定的 LIMIT 分支只是其中一个 producer,并不是所有 42601 都必须包含它。

诊断

记录完整语句、解析位置、服务器版本和提示。对于 at or near,检查 POSITION 指向的 token 及其前面的文本;对于 at end of input,检查未闭合的引号、美元引号、括号、注释或生成的子句。保留 query builder 实际发送的字节(包括分隔符和替换片段),先把完整语句交给服务器解析,再改变语义。解析器在执行前拒绝该语法,因此选定的自动提交会话仍为 IDLE,失败语句不会产生行。在显式事务中,同样的语句级 ERROR 会让事务进入失败状态,直到 ROLLBACK 或合适的保存点操作;这与选定的自动提交观察是不同的会话边界。不要把语法错误与对象不存在或“已识别但当前上下文不支持”的功能混淆。

处理

按提示改写语法。对选定的三行有序查询,应把 LIMIT 1, 2 改为 LIMIT 2 OFFSET 1,结果为 [2, 3]LIMIT 1 OFFSET 0 会产生不同结果,不能作为等价修复。生成分页 SQL 的查询构造器应按方言处理。

对于一般扫描器错误,应按位置修复缺失或错放的 token、引号、注释分隔符或 query builder 片段,然后重新解析完整语句。不能因为另一个 42601 也使用同一 SQLSTATE,就套用 LIMIT 改写。

报文

选定解析器分支以明确的 ERROR 发出主报文 LIMIT #,# syntax is not supported 和 HINT Use separate LIMIT and OFFSET clauses. 扫描器的固定一般分支使用 syntax error at or near "%s"syntax error at end of input,位置由词法扫描器生成。LIMIT 主报文/HINT 只能识别选定的分页子路径;只有客户端异常而没有该具体分支的服务器 SQLSTATE 和诊断时,不能识别该子路径,而其他合法 42601 producer 可以有不同主报文。

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

SELECT n FROM generate_series(1, 3) AS s(n) ORDER BY n LIMIT 1, 2;
SELECT n FROM generate_series(1, 3) AS s(n) ORDER BY n LIMIT 2 OFFSET 1;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42601 案例 JSON作者证据。运行器清单为 verify/cases/42601/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.limit-comma.18.6src/backend/parser/gram.y at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 7e548b673a1e03eb3a56c5eb9ad92d8e11095fac76e14cb258ca851f58274724 (source).
  • src.limit-comma.10.23src/backend/parser/gram.y at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 cebad6a5a2bdf68e9e5a4d2e04fa7f5dbf37efac99f5edb73cc661dae1536bad (source).
  • src.scanner-syntax.18.6 / src.scanner-syntax.10.23 — fixed src/backend/parser/scan.l scanner_yyerror 分支处理 at end of inputat or near;blob SHA-256 bf453f1ae3c22b84fea6f8e8bed4fda476b7cfa49b234efbf92ca228234d0293 / a006581a25c659d59b29837010617503ff431f881e3cf0b54a99aa1cc445fe6c (18.6 source, 10.23 source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

166 - 42602 — 名称无效(invalid_name)

PostgreSQL SQLSTATE 42602(名称无效,invalid_name)的源码证据、诊断与处理参考。

42602 — 名称无效

速览

SQLSTATE 42602 是 Class 42 中的 invalid_name42602 表示名称无效。选定的 enum 路径拒绝 64 字节标签,主报文为 invalid enum label "%s",并给出长度 DETAIL;随后可以添加短标签。

字段
SQLSTATE 42602
条件名 invalid_name
状态 有效
已知存在于 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_INVALID_NAME
别名

含义

42602 表示名称无效。在 AddEnumLabel 中,PostgreSQL 会在修改目录前把输入的 enum 标签与 NAMEDATALEN - 1 比较。选定的 64 字节标签因此产生明确的 ERROR,主报文为 invalid enum label "%s",并给出长度 DETAIL;随后可以添加短标签。这是 enum 标签的具体路径,不能据此断言所有无效对象名称都由同一 producer 产生。

诊断

检查对象类型以及 DETAIL 中的准确长度措辞。本批在 18.6 与 10.21 观察 enum 标签路径:18.6 的源码/运行报文是 Labels must be 63 bytes or less.,10.21 是 Labels must be 63 characters or less. 仅凭这两个措辞不能推断长度机制改变;两份固定源码都把标签与 NAMEDATALEN - 1 比较。失败的 DDL 在自动提交中是 ERROR,选定会话仍为 IDLE

处理

使用限制以内的标签,或把较长的用户值存为数据。失败语句返回后再添加合法短标签;选定修复后 enum 中有 okshort。不要静默截断 enum 标签,也不要把该 enum 专用路径推广成所有名称错误。

报文

选定源码路径以明确的 ERROR 发出主报文 invalid enum label "%s"。DETAIL 在 18.6 为 Labels must be 63 bytes or less.,在 10.21 为 Labels must be 63 characters or less.,标签文本是动态值。只有客户端异常而没有服务器 SQLSTATE、主报文和长度 DETAIL 时,不能据此识别这个选定的 enum 标签子路径;其他固定 producer 可以使用同一 SQLSTATE 和不同诊断。

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TYPE syntax_schema.syntax_enum AS ENUM ('ok');
ALTER TYPE syntax_schema.syntax_enum ADD VALUE 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
ALTER TYPE syntax_schema.syntax_enum ADD VALUE 'short';
SELECT enum_range(NULL::syntax_schema.syntax_enum)::text[];

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42602 案例 JSON作者证据。运行器清单为 verify/cases/42602/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.enum-invalid-label.18.6src/backend/catalog/pg_enum.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 849793e92baf9c0e4e8950f8472e2772289c22c58a4ea93997ef0218d7e4b3fc (source).
  • src.enum-invalid-label.10.23src/backend/catalog/pg_enum.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 08076bbd661f4c400cf9741f4cfe89c5b0daf3383e4a3e6ac10f3f8f4bec16a6 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

167 - 42611 — 列定义无效(invalid_column_definition)

PostgreSQL SQLSTATE 42611(列定义无效,invalid_column_definition)的源码证据、诊断与处理参考。

42611 — 列定义无效

速览

SQLSTATE 42611 是 Class 42 中的 invalid_column_definition42611 表示列定义无效。选定案例中的两个继承父表为 id 定义了不同默认值;子表 DDL 失败并报告 column "%s" inherits conflicting default values,提示显式指定默认值。

字段
SQLSTATE 42611
条件名 invalid_column_definition
状态 有效
已知存在于 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_INVALID_COLUMN_DEFINITION
别名

含义

42611 表示列定义无效。在 MergeAttributes 中,PostgreSQL 按父表顺序合并同名列。如果继承来的默认表达式不相等,且子表没有覆盖它,最终检查会发出 ERRORcolumn "%s" inherits conflicting default values,并提示显式指定默认值。选定案例的两个父表为 id 定义了不同默认值。

诊断

检查 INHERITS 列表中的每个父表,比较同名列的类型、排序规则、可空性和默认表达式。相同默认值可以合并;子表本地默认值可以覆盖继承冲突。选定 DDL 的 ERROR 后自动提交会话仍为 IDLE;这是继承默认值分支,不是一般的重复列错误,也不是类型/排序规则冲突。

处理

按服务器提示在子表定义中显式声明预期默认值,然后插入 DEFAULT VALUES 并核对结果。如果父表本应一致,应直接修复父表迁移;如果差异是有意的,就把子表覆盖值明确写在 DDL 中。选定修复返回 1,但这是案例值,不代表所有场景都应选择同一策略。

报文

选定源码分支以明确的 ERROR 发出主报文 column "%s" inherits conflicting default values 和 HINT To resolve the conflict, specify a default explicitly. %s 是冲突列名。只有客户端异常而没有服务器 SQLSTATE、主报文和 HINT 时,不能据此识别这个选定的继承默认值子路径;其他固定 producer 可以使用同一 SQLSTATE 和不同诊断。

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.parent_one (id integer DEFAULT 1);
CREATE TABLE syntax_schema.parent_two (id integer DEFAULT 2);
CREATE TABLE syntax_schema.child_bad () INHERITS (syntax_schema.parent_one, syntax_schema.parent_two);
CREATE TABLE syntax_schema.child_good (id integer DEFAULT 1) INHERITS (syntax_schema.parent_one, syntax_schema.parent_two);
INSERT INTO syntax_schema.child_good DEFAULT VALUES RETURNING id;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42611 案例 JSON作者证据。运行器清单为 verify/cases/42611/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.inherited-conflicting-default.18.6src/backend/commands/tablecmds.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9 (source).
  • src.inherited-conflicting-default.10.23src/backend/commands/tablecmds.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

168 - 42622 — 名称过长(name_too_long)

PostgreSQL SQLSTATE 42622(名称过长,name_too_long)的源码证据、诊断与处理参考。

42622 — 名称过长

速览

SQLSTATE 42622 是 Class 42 中的 name_too_long42622 表示名称过长。固定源码路径包括超长 SQL 标识符的扫描器 NOTICE 和二进制 name 接收 ERROR;普通文本输入也可能直接截断而不产生这两种诊断。

字段
SQLSTATE 42622
条件名 name_too_long
状态 有效
已知存在于 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_NAME_TOO_LONG
别名

含义

42622 表示名称过长,并有不止一个 producer。二进制 name 接收函数 namerecv 通过 pq_getmsgtext 读取外部文本,把字节数与 NAMEDATALEN 比较,并在复制值前以 ERROR 发出 identifier too long 和长度 DETAIL。解析器的 truncate_identifier 路径不同:它把超长 SQL 标识符截到多字节边界,然后由扫描器以 warn = true 调用时发出带 SQLSTATE 42622NOTICE,说明标识符将被截断。普通文本输入走独立的 namein,可能静默截断,不会进入 namerecv

诊断

先区分输入边界和 severity。二进制类型接收失败有 identifier too long 主报文和长度 DETAIL;SQL 标识符可能产生包含原名与截断名的 NOTICE;text cast 到 name 则可能静默截断。二进制输入要记录 format code 和 type OID,扫描器输入则记录准确 SQL 标识符和服务器 NOTICE。本批有意没有选定自然 runtime:选定版本的 text cast 会截断,不能把它当成任一源码分支的证据。固定 guard 不表示每个超长值或标识符都属于同一已观察路径。

处理

在相应输入边界执行长度校验,把较长应用值存为 text 或其他合适类型。如果二进制客户端确实发送了超长 name 值,应在该边界修复编码器或应用 schema;如果问题是扫描器 NOTICE,就缩短或重命名 SQL 标识符并检查目录中的最终名称。不要用 RAISE 伪造此码,不要把静默文本截断当作证据,也不要把一种 severity/path 改报成另一种。

报文

固定扫描器分支以明确的 NOTICE 和 SQLSTATE 42622 发出主报文。REL_18_6 的原始主报文模板是 identifier "%s" will be truncated to "%.*s";REL_10_23 是 identifier "%s" will be truncated to "%s"。固定 namerecv 分支以明确的 ERROR 发出主报文 identifier too long 和 DETAIL Identifier must be less than %d characters.%d 在该源码路径中是 NAMEDATALEN。两者都只在本页确认源码边界,文本输入路径可能静默。只有客户端异常或 NOTICE 而没有服务器 SQLSTATE 及对应扫描器/二进制上下文时,不能识别某个 42622 路径。

代表案例

本页没有选定的自然 SQL 运行;这里只记录固定源码边界,不使用伪造触发器。

版本

本页没有选定的自然 SQL 运行;固定的 REL_18_6/REL_10_23 源码边界不能证明所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.name-recv-too-long.18.6src/backend/utils/adt/name.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 4c4b4dc71f55ba73dbc24dd94b3385986fdb3179702b3d100cbad7ab00db7762 (source).
  • src.name-recv-too-long.10.23src/backend/utils/adt/name.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 7c7da791e528aafdbf26930cd4bd34386806818c19d2ee4b78bbe138b93f4a84 (source).
  • src.identifier-truncate.18.6 / src.identifier-truncate.10.23 — fixed parser truncate_identifier NOTICE 分支;blob SHA-256 99cc6839927c19a9f85a1e5fbc8e848b376a7073477a04a0bbfe106ecdb2273f / 3c59a33f3cb5eaa0c3932859eb15e927f459a5feb5f40ca96fef5ef74495d67c (18.6 source, 10.23 source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

169 - 42701 — 重复列(duplicate_column)

PostgreSQL SQLSTATE 42701(重复列,duplicate_column)的源码证据、诊断与处理参考。

42701 — 重复列

速览

SQLSTATE 42701 是 Class 42 中的 duplicate_column42701 表示重复列。选定的 CREATE TABLE 路径两次列出 id,在创建修正后的不同列之前报告 column "%s" specified more than once

字段
SQLSTATE 42701
条件名 duplicate_column
状态 有效
已知存在于 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_DUPLICATE_COLUMN
别名

含义

42701 表示重复列。在处理表定义时,PostgreSQL 会先比较本地 ColumnDef 名称,再合并继承属性。因此在一个定义中两次列出同名列会在创建修复表前报告 ERRORcolumn "%s" specified more than once。这个本地名称检查不同于继承默认值、类型或排序规则冲突;后者可能使用其他 SQLSTATE。

诊断

检查展开后的生成列列表,包括带引号标识符,以及拼接到同一个 CREATE TABLE 中的迁移片段。PostgreSQL 在普通名称处理后比较标识符,因此意外重复的未引用名称仍然是同一列名。选定 DDL 的 ERROR 后自动提交会话仍为 IDLE;显式 BEGIN 中同样的错误会让事务进入 INERROR,必须 ROLLBACK 或回滚到合适保存点后再重试。要把它与 42611 的继承默认值冲突,以及继承列合并时的类型/排序规则错误区分开。

处理

删除重复定义或给它一个有意的不同名称,重新执行完整 DDL,并检查最终目录。如果重复来自已经执行过的迁移,先比较现有表定义,再决定使用 ALTER TABLE 还是新的 CREATE TABLE;不要假设失败的 CREATE TABLE 留下了半成品关系。选定修复创建 idpayload 两列并确认列数。

报文

选定的 tablecmds.c 分支以明确的 ERROR 发出主报文 column "%s" specified more than once%s 是重复列名。相邻源码分支可能为继承类型/排序规则冲突发出其他 SQLSTATE。只有客户端异常而没有服务器 SQLSTATE 和主报文时,不能据此认定 42701

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.duplicate_table (id integer, id text);
CREATE TABLE syntax_schema.repaired_table (id integer, payload text);
SELECT count(*) FROM information_schema.columns WHERE table_schema = 'syntax_schema_name' AND table_name = 'repaired_table_name';

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42701 案例 JSON作者证据。运行器清单为 verify/cases/42701/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.duplicate-column.18.6src/backend/commands/tablecmds.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9 (source).
  • src.duplicate-column.10.23src/backend/commands/tablecmds.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

170 - 42702 — 列引用歧义(ambiguous_column)

PostgreSQL SQLSTATE 42702(列引用歧义,ambiguous_column)的源码证据、诊断与处理参考。

42702 — 列引用歧义

速览

SQLSTATE 42702 是 Class 42 中的 ambiguous_column42702 表示列引用歧义。选定 join 使用两个真实表的 id,未限定的 SELECT id 报告 column reference "%s" is ambiguous

字段
SQLSTATE 42702
条件名 ambiguous_column
状态 有效
已知存在于 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_AMBIGUOUS_COLUMN
别名

含义

42702 表示列引用歧义。在 colNameToVar 中,PostgreSQL 会扫描当前可见 namespace 的未限定名称。如果同一次查找中有两个可见 range-table 条目都匹配,就会在执行前以 ERROR 发出 column reference "%s" is ambiguous;选定 join 的两张真实表都暴露了 id。这个分支属于名称解析,行值是否相同不能消除歧义。

诊断

检查别名、CTE、连接输入、lateral 可见性,以及当前查询范围内提供该名称的每个关系。即使两列值相同,未限定名称仍可能有歧义,因为 PostgreSQL 必须先解析来源再执行查询。这是解析阶段的名称解析,因此选定自动提交会话仍为 IDLE;它不同于没有匹配列的 42703。显式事务仍遵循语句级 ERROR 的通常事务状态规则。

处理

使用稳定的表别名限定预期列(或从范围中移除非预期关系),然后核对返回行。不要依赖连接顺序或相同值“解决”歧义。如果生成 SQL 会引入别名或 CTE,应把限定写进查询构造器契约,并测试选定的来源列。

报文

选定的 parse_relation.c 分支以明确的 ERROR 发出主报文 column reference "%s" is ambiguous%s 是未解析的列名,解析位置随语句上下文变化。只有客户端异常而没有服务器 SQLSTATE 和主报文时,不能据此认定 42702

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.left_table (id integer);
CREATE TABLE syntax_schema.right_table (id integer);
INSERT INTO syntax_schema.left_table VALUES (1);
INSERT INTO syntax_schema.right_table VALUES (1);
SELECT id FROM syntax_schema.left_table, syntax_schema.right_table;
SELECT syntax_schema.left_table.id FROM syntax_schema.left_table, syntax_schema.right_table;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42702 案例 JSON作者证据。运行器清单为 verify/cases/42702/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.ambiguous-column.18.6src/backend/parser/parse_relation.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a (source).
  • src.ambiguous-column.10.23src/backend/parser/parse_relation.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 a34f40fc93fa5df0015fe5af5ee7761ccba2d16a791cda69ae07848ed27616b5 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

171 - 42703 — 未定义列(undefined_column)

PostgreSQL SQLSTATE 42703(未定义列,undefined_column)的源码证据、诊断与处理参考。

42703 — 未定义列

速览

SQLSTATE 42703 是 Class 42 中的 undefined_column42703 表示未定义列。选定查询在真实表上引用 missing_column,报告 column "%s" does not exist;改为已定义的 id 后成功。

字段
SQLSTATE 42703
条件名 undefined_column
状态 有效
已知存在于 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_UNDEFINED_COLUMN
别名

含义

42703 表示未定义列。当关系已经解析出来、但引用的列不在可见查询范围内时,errorMissingColumn 会在 range table 中寻找有用建议并发出 ERRORcolumn "%s" does not exist(如果指定了关系,也可能使用限定形式)。选定查询在真实表上引用 missing_column,改为已定义的 id 后成功。

诊断

检查准确关系、别名、解析范围、带引号的拼写/大小写和迁移版本。如果解析器找到接近候选列,可能追加 HINT;选定路径没有 HINT。解析器在执行前报告错误,自动提交会话仍为 IDLE;显式 BEGIN 中会让事务进入 INERROR,必须 ROLLBACK 或回滚到合适保存点后再重试。要把缺列与 42P01(未限定关系不存在)、3F000(schema/创建 namespace 不存在)以及 42702(多个可见列匹配)区分开。

处理

修正列名或迁移后针对预期关系重新执行。如果应用支持多个 schema 或版本,应限定关系并先部署匹配的迁移。带引号且大小写不同的标识符是不同名称;修改应用 SQL 前应通过目录或 introspection 确认已部署的拼写。

报文

选定的 errorMissingColumn 分支以明确的 ERROR 发出主报文 column "%s" does not exist%s 是未解析列名,其他源码分支可能追加建议 HINT 或使用带关系限定的形式。只有客户端异常而没有服务器 SQLSTATE 和主报文时,不能据此认定 42703

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.column_table (id integer);
INSERT INTO syntax_schema.column_table VALUES (1);
SELECT missing_column FROM syntax_schema.column_table;
SELECT id FROM syntax_schema.column_table;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42703 案例 JSON作者证据。运行器清单为 verify/cases/42703/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.undefined-column.18.6src/backend/parser/parse_relation.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a (source).
  • src.undefined-column.10.23src/backend/parser/parse_relation.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 a34f40fc93fa5df0015fe5af5ee7761ccba2d16a791cda69ae07848ed27616b5 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

172 - 42704 — 未定义对象(undefined_object)

PostgreSQL SQLSTATE 42704(未定义对象,undefined_object)的源码证据、诊断与处理参考。

42704 — 未定义对象

速览

SQLSTATE 42704 是 Class 42 中的 undefined_object42704 表示未定义对象。选定 DROP TRIGGER 路径在真实表上指定不存在的触发器,报告 trigger "%s" for table "%s" does not exist;随后可以创建并删除真实触发器。

字段
SQLSTATE 42704
条件名 undefined_object
状态 有效
已知存在于 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_UNDEFINED_OBJECT
别名

含义

42704 表示未定义对象。get_trigger_oid 按已解析关系 OID 和触发器名称扫描 pg_trigger;当 DROP TRIGGER 要求对象而没有匹配行时,会发出 ERRORtrigger "%s" for table "%s" does not exist。选定路径在真实表上指定不存在的触发器,随后用创建并删除真实触发器验证修复生命周期。

对象类型决定查找方式和报文:固定分支包括类型名解析失败的 type "%s" does not exist、角色查找失败的 role "%s" does not exist、按关系 OID 扫描约束失败的 constraint "%s" for table "%s" does not exist,以及在访问方法下解析限定名或 search_path 中 opclass 失败的 operator class "%s" does not exist for access method "%s"。选定路径更具体:get_trigger_oid 按关系 OID 和触发器名查 pg_trigger,当前表没有匹配行时发出 trigger "%s" for table "%s" does not exist;随后案例只为验证修复生命周期而创建并删除真实触发器。

诊断

先按主报文分类。对于选定触发器分支,检查 DDL 实际解析到的带 schema 关系、准确触发器名称(包括带引号大小写)和迁移顺序;触发器可能存在于另一张表,但由于源码按关系 OID 和名称查找,在当前关系上仍不存在。对于类型或角色报文,检查准确限定名以及 type/role 目录;对于约束报文,检查关系 OID/名称组合和迁移顺序;对于 opclass 报文,检查访问方法以及 opclass 查找使用的 schema/search_path。schema 缺失或未限定关系不存在属于另一类 namespace/未定义关系诊断,权限失败则是 42501。未找到对象的 ERROR 后选定自动提交会话仍为 IDLE;显式 BEGIN 中它会让事务进入 INERROR,直到 ROLLBACK 或回滚到合适保存点。它不同于 dblink 句柄错误 08003 和预备语句名称错误 26000。

处理

按报文指出的对象类型修复:改正限定名或 search_path,按依赖顺序应用前置迁移,或在对应 owner 的迁移中创建/重命名预期的 type、role、constraint 或 operator class。仅对选定触发器案例,才应显式操作目标关系,核对 owner、时机/事件、行级或语句级定义及函数,并在迁移要求时删除准确触发器。如果对象本来就是可选的,应有意识地选择幂等迁移策略;不要用 CASCADE、无关对象或通用的“先创建再删除”作为修复。显式事务报错后,先回滚事务或合适保存点,再重试。

报文

选定的 get_trigger_oid 分支以明确的 ERROR 发出主报文 trigger "%s" for table "%s" does not exist;触发器名和表名都是动态值。其他固定未定义对象分支发出 type "%s" does not existrole "%s" does not existconstraint "%s" for table "%s" does not existoperator class "%s" does not exist for access method "%s"。只有客户端异常而没有对应对象类型的服务器 SQLSTATE 和主报文时,不能据此识别 42704

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.trigger_table (id integer);
DROP TRIGGER missing_trigger ON syntax_schema.trigger_table;
CREATE FUNCTION syntax_schema.trigger_function() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RETURN NEW; END $$;
CREATE TRIGGER valid_trigger BEFORE INSERT ON syntax_schema.trigger_table FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
DROP TRIGGER valid_trigger ON syntax_schema.trigger_table;
SELECT count(*) FROM pg_trigger WHERE tgrelid = 'syntax_schema.trigger_table'::regclass AND NOT tgisinternal;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42704 案例 JSON作者证据。运行器清单为 verify/cases/42704/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

  • src.errcodes.18.6 — fixed errcodes.txt definition at commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.missing-trigger.18.6src/backend/commands/trigger.c at REL_18_6 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7; fixed blob SHA-256 0a539af85b0de1a04779f92202e7bfc77d85ae6da1747ea32527c67f39084fbd (source).
  • src.missing-trigger.10.23src/backend/commands/trigger.c at REL_10_23 commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; fixed blob SHA-256 dac7cdcbe2df1a1bbc77daa23e808b0c81ba8891c9895f10e8b270a15316e225 (source).
  • src.undefined-type.18.6 / src.undefined-type.10.23 — fixed type-name lookup branches; blob SHA-256 fe4670d2401141761096077c6495dd1b7d6a0baf33c9b903f25baee2f88ffd1e / 729d30e50cea059ccfe13491fdc5f997ff98c227795693bf166a163925beb663 (18.6 source, 10.23 source).
  • src.undefined-role.18.6 / src.undefined-role.10.23 — fixed DROP ROLE lookup branches; blob SHA-256 aa8769a2577fff287301d6c82169262cca328515ae940d5a2be4b3e8c21617ed / 9fc68a5a18c4bb5388cc817d2f3f2fcdc64f2752eaa429f78f54b0b443fb59ec (18.6 source, 10.23 source).
  • src.undefined-constraint.18.6 / src.undefined-constraint.10.23 — fixed relation-constraint lookup branches; blob SHA-256 0aa324acd355da955f8eb6cec17f1a0138277a8bebd2c6e999cd2a603d3bfa01 / c90dff2d1d863e6b43102d762cec6e08b6c4ba40458045b525a14b49865d8a65 (18.6 source, 10.23 source).
  • src.undefined-opclass.18.6 / src.undefined-opclass.10.23 — fixed access-method/opclass lookup branches; blob SHA-256 f28ac0580c805553724dc623dd4e20f32de1a84db637e6ac3c6e3d296bd2fae5 / 85c646706908d13dc449bcffa6690d6ead8d326498051fef6b08f817347fa947 (18.6 source, 10.23 source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.

173 - 42710 — 重复对象(duplicate_object)

PostgreSQL SQLSTATE 42710(重复对象,duplicate_object)的源码证据、诊断与处理参考。

42710 — 重复对象(duplicate_object)

速览

42710 is duplicate_object(重复对象):定义与已占用的对象名冲突。本页选择第二次 CREATE TYPE ... AS ENUM;同一 SQLSTATE 也会用于其他对象定义,因此必须先确认对象种类和模式。

字段
SQLSTATE 42710
条件名 duplicate_object
状态 有效
已知存在于 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_DUPLICATE_OBJECT
别名

含义

DefineEnum 路径报告 type "%s" already exists,这是目录定义冲突,不是行级唯一性错误。CREATE OR REPLACE 不是通用修复。检查 pg_typepg_namespace、owner 和迁移顺序。选定自动提交错误后为 IDLE;显式事务必须先回滚。

诊断

先确认对象种类和模式。类型查询 pg_type 与 pg_namespace,关系使用 to_regclass,例程检查 pg_proc 和 pg_get_function_identity_arguments;同时核对 owner 与迁移顺序。

处理

使用确认空闲的名称,或仅在已有对象属于自己且该对象支持时执行特定 ALTER/REPLACE。案例以新 ENUM 名称修复。预检查不能消除并发创建竞争,删除未知对象不安全。显式事务中的定义失败会进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径保持 IDLE

实测诊断

该 ENUM 分支的固定 ERROR 主报文没有提示;其他 42710 分支可能有不同模板,heap.c 的关系/类型提示不适用于本分支。

代表案例

一次性案例创建 ENUM、重复定义并检查代码与状态,再创建不同名类型并核对两个目录项。

CREATE TYPE syntax_schema.duplicate_object_type AS ENUM ('first');
CREATE TYPE syntax_schema.duplicate_object_type AS ENUM ('first');
CREATE TYPE syntax_schema.duplicate_object_type_repaired AS ENUM ('first');
SELECT count(*) FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'syntax_schema_name' AND t.typname IN ('duplicate_object_type', 'duplicate_object_type_repaired');

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.duplicate-enum.18.6src/backend/commands/typecmds.c lines 1219–1221 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 60d1e9754646e100f6b74aa367ad8c2c52386c400df721707423d329209c47eb (source).
  • src.duplicate-enum.10.23src/backend/commands/typecmds.c lines 1139–1141 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 fa1dfb766f7a3117eb677461ede774d5ba7c25324cbbd2a200435fa9c9c8e863 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42710 / snippet-registry.42710 — hashes are recorded in evidence/42710.json and each runtime record.

174 - 42712 — 重复别名(duplicate_alias)

PostgreSQL SQLSTATE 42712(重复别名,duplicate_alias)的源码证据、诊断与处理参考。

42712 — 重复别名(duplicate_alias)

速览

42712duplicate_alias(重复别名):同一查询命名空间重复使用表别名。解析器拒绝两个都叫 duplicate_aliasVALUES 表项。

字段
SQLSTATE 42712
条件名 duplicate_alias
状态 有效
已知存在于 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_DUPLICATE_ALIAS
别名

含义

别名属于查询命名空间,第二个同名范围表在执行前就有歧义。它不同于重复物理对象 42710 和重复输出列名。检查 FROM/JOIN/CTE/子查询别名;自动提交错误后为 IDLE

诊断

检查 FROM、JOIN、CTE 和子查询的每个别名,也检查生成 SQL 引入的别名。冲突发生在当前查询命名空间,search_path 或修改基础表名不是诊断方向。

处理

给范围表使用不同别名并限定列。改基础表名或 search_path 不能修复当前查询。显式事务中的解析失败会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

实测诊断

固定解析器组是 ERROR,主模板为 table name "%s" specified more than once,没有 DETAIL/HINT。

代表案例

案例让两个单行 VALUES 表项先同名,再改成 left_alias/right_alias 并断言两个值。

SELECT * FROM (VALUES (1)) AS duplicate_alias(value), (VALUES (2)) AS duplicate_alias(value);
SELECT left_alias.value, right_alias.value FROM (VALUES (1)) AS left_alias(value), (VALUES (2)) AS right_alias(value);

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.duplicate-alias.18.6src/backend/parser/parse_relation.c lines 471–474 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a (source).
  • src.duplicate-alias.10.23src/backend/parser/parse_relation.c lines 417–420 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 a34f40fc93fa5df0015fe5af5ee7761ccba2d16a791cda69ae07848ed27616b5 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42712 / snippet-registry.42712 — hashes are recorded in evidence/42712.json and each runtime record.

175 - 42723 — 重复函数(duplicate_function)

PostgreSQL SQLSTATE 42723(重复函数,duplicate_function)的源码证据、诊断与处理参考。

42723 — 重复函数(duplicate_function)

速览

42723duplicate_function(重复函数):函数定义重复了同一模式、名称和输入参数类型,返回类型不会形成新重载。

字段
SQLSTATE 42723
条件名 duplicate_function
状态 有效
已知存在于 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_DUPLICATE_FUNCTION
别名

含义

固定目录路径报告 function "%s" already exists with same argument types。检查 pg_procpg_get_function_identity_arguments 和返回契约。它是定义冲突,不同于调用阶段候选歧义 42725;自动提交错误后为 IDLE

诊断

在 pg_proc 中用 pg_get_function_identity_arguments 检查,并明确模式。先判断迁移是要新增输入签名,还是替换自己拥有的函数;返回类型不能改变函数身份。

处理

真正不同的 API 使用新的输入签名。只有在有意替换自己拥有的函数且返回契约兼容时才用 CREATE OR REPLACE FUNCTION;显式事务中的重复定义会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

实测诊断

pg_proc.c 报文组明确是 ERROR,使用固定主模板,没有 DETAIL/HINT。

代表案例

运行器创建 duplicate_function(integer),重复签名,再有意 CREATE OR REPLACE 并验证返回 2

CREATE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1';
CREATE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1';
CREATE OR REPLACE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1 + 1';
SELECT syntax_schema.duplicate_function(1);

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.duplicate-function.18.6src/backend/catalog/pg_proc.c lines 400–403 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 77a883995e5fadf17fae68722043beb43115e685e8082b2b7256d92312528a5a (source).
  • src.duplicate-function.10.23src/backend/catalog/pg_proc.c lines 398–401 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 96ddd186536c24018d3e29fd7e8f7384543c89ede83c81f673dc013fdd23b0fe (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42723 / snippet-registry.42723 — hashes are recorded in evidence/42723.json and each runtime record.

176 - 42725 — 函数调用歧义(ambiguous_function)

PostgreSQL SQLSTATE 42725(函数调用歧义,ambiguous_function)的源码证据、诊断与处理参考。

42725 — 函数调用歧义(ambiguous_function)

速览

42725ambiguous_function(函数调用歧义):有多个可行候选却无法选出最佳候选。案例定义 uuid/jsonb 重载并传入未知类型字符串。

字段
SQLSTATE 42725
条件名 ambiguous_function
状态 有效
已知存在于 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_AMBIGUOUS_FUNCTION
别名

含义

重载解析考虑字面量类型、cast、模式可见性和签名。unknown 让两个候选都可行,报告 function %s is not unique;它不同于定义冲突 42723 和无候选的 42883。检查可见 pg_proc 与参数类型。

诊断

在 pg_proc 中列出可见候选、identity arguments 和输入类型,并检查字面量推断类型。限定模式只能缩小可见范围,不能在重载之间自动选择。

处理

转换为符合业务含义的类型,或删除非预期重载。这里用 ::uuid 选择 UUID。不要只为消除报错而加 cast,因为它可能改变校验与重载行为。显式事务中的歧义会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交会话保持 IDLE

实测诊断

固定组是 ERRORfunction %s is not unique,提示为 Could not choose a best candidate function. You might need to add explicit type casts.

代表案例

注册表创建两个重载,用未知字符串触发,再显式 UUID cast 并断言返回值。

CREATE FUNCTION syntax_schema.ambiguous_function(uuid) RETURNS text LANGUAGE SQL AS 'SELECT ''uuid''';
CREATE FUNCTION syntax_schema.ambiguous_function(jsonb) RETURNS text LANGUAGE SQL AS 'SELECT ''jsonb''';
SELECT syntax_schema.ambiguous_function('123e4567-e89b-12d3-a456-426614174000');
SELECT syntax_schema.ambiguous_function('123e4567-e89b-12d3-a456-426614174000'::uuid);

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.ambiguous-function.18.6src/backend/parser/parse_func.c lines 570–577 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 48314eab022297478ac4e49786afaff2621ab7b1d7b50e156668cf477961384f (source).
  • src.ambiguous-function.10.23src/backend/parser/parse_func.c lines 499–506 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 f1b4af88565ca01dbad2b244cd26b42f34764b3f1343b22a9231e271fb0742f2 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42725 / snippet-registry.42725 — hashes are recorded in evidence/42725.json and each runtime record.

177 - 42803 — 分组错误(grouping_error)

PostgreSQL SQLSTATE 42803(分组错误,grouping_error)的源码证据、诊断与处理参考。

42803 — 分组错误(grouping_error)

速览

42803grouping_error(分组错误):分组查询输出了既未分组也未聚合的值。本案例只按 category 分组,却选择 label

字段
SQLSTATE 42803
条件名 grouping_error
状态 有效
已知存在于 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_GROUPING_ERROR
别名

含义

分析器必须为每个分组的每个选择表达式确定一个值。固定报文为 column "%s.%s" must appear in the GROUP BY clause or be used in an aggregate function。已检查的 check_functional_grouping 路径要求 GROUP BY 列包含该表主键的全部列,才会认可函数依赖;不能把任意看似唯一的表达式都当作例外。本案例的 VALUES 关系没有这种表约束,因此加入 label 会把结果粒度从每个 category 一行明确改成每个 (category,label) 一行,而不是语义中性的修复;自动提交错误后为 IDLE

诊断

检查 SELECT、HAVING 及相关排序表达式中的非聚合项。依赖函数依赖前先核对关系约束,修改 GROUP BY 前先决定期望每个 category 一行,还是每个 category/label 一行。ordered-set 聚合的 direct argument 还有单独的分组列规则;下方记录其源码 DETAIL,但它不是本案例的普通分组查询。

处理

把需要保持的表达式加入 GROUP BY,或用明确规则聚合,再核对行数。案例按 category,label 修复并返回两行,因为两个 label 形成两个组;如果业务结果应每个 category 一行,就要选择聚合或明确保留哪个 label。显式事务中失败语句会使事务进入 INERROR,应先回滚或回到合适的 savepoint;本案例的自动提交路径才会回到 IDLE

实测诊断

固定 parse_agg.c 组是 ERROR。本案例主报文为 column "%s.%s" must appear in the GROUP BY clause or be used in an aggregate function。当未分组变量是 ordered-set 聚合的 direct argument 时,同一源码分支在 context->in_agg_direct_args 守卫下追加仅源码确认的 DETAIL:Direct arguments of an ordered-set aggregate must use only grouped columns.;本案例普通分组查询没有产生该 DETAIL。

代表案例

注册表用两个 (category,label) 值,只按 category 触发,再按 category,label 排序修复并断言 (1,a,1)(1,b,1)

SELECT category, label, count(*) FROM (VALUES (1, 'a'), (1, 'b')) AS grouping_rows(category, label) GROUP BY category;
SELECT category, label, count(*) FROM (VALUES (1, 'a'), (1, 'b')) AS grouping_rows(category, label) GROUP BY category, label ORDER BY category, label;

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.grouping-error.18.6src/backend/parser/parse_agg.c lines 1552–1558 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6e80a805fddbfc9c7e0f3047b348bf992a20c99f16ce7fee89c7067753027f72 (source).
  • src.grouping-error.10.23src/backend/parser/parse_agg.c lines 1356–1362 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 4c7e12bba2ffd465eb55d22c2adc593afa97e5a5f9a93045a882afab1401cb28 (source).
  • src.grouping-functional-dependency.18.6src/backend/catalog/pg_constraint.c lines 1728–1778 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 0aa324acd355da955f8eb6cec17f1a0138277a8bebd2c6e999cd2a603d3bfa01 (source).
  • src.grouping-functional-dependency.10.23src/backend/catalog/pg_constraint.c lines 1057–1107 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 c90dff2d1d863e6b43102d762cec6e08b6c4ba40458045b525a14b49865d8a65 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42803 / snippet-registry.42803 — hashes are recorded in evidence/42803.json and each runtime record.

178 - 42804 — 数据类型不匹配(datatype_mismatch)

PostgreSQL SQLSTATE 42804(数据类型不匹配,datatype_mismatch)的源码证据、诊断与处理参考。

42804 — 数据类型不匹配(datatype_mismatch)

速览

42804datatype_mismatch(数据类型不匹配):表达式或定义类型不同于目标上下文。本页选择整数列使用文本默认值。

字段
SQLSTATE 42804
条件名 datatype_mismatch
状态 有效
已知存在于 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_DATATYPE_MISMATCH
别名

含义

cookDefault 路径报告 column "%s" is of type %s but default expression is of type %s 并提示重写或 cast。同一 SQLSTATE 还覆盖 INSERT/UPDATE 目标赋值的 column "%s" is of type %s but expression is of type %s,以及 CASE/UNION 公共类型选择的 %s types %s and %s cannot be matched。它不同于 22P02(已选类型的输入解析器拒绝值)和 42846(选定公共目标没有转换路径)。检查 pg_attribute.atttypidpg_typepg_get_expr 以及实际表达式上下文;自动提交 CREATE 失败后为 IDLE

诊断

确认目标列或结果类型,再检查 pg_attribute.atttypidpg_type,以及默认值或生成表达式的 pg_get_expr。INSERT/UPDATE 要对照赋值表达式与目标列类型;CASE/UNION 要检查参与公共类型选择的每个分支或输入。先依据诊断中展开的源/目标类型和位置,再决定 cast。

处理

让表达式直接产生目标类型,或添加已理解语义的有效 cast。赋值场景应修正产生方或转成目标列类型;CASE/UNION 应让分支具有预期的公共类型。22P02 的输入错误不能靠改字符串后就当成类型匹配;如果没有转换路径,也应按源码区分 42846,不能误写成 42804。案例用 DEFAULT 1,插入默认行并读回 1。显式事务中定义或赋值失败会进入 INERROR,应先回滚或回到合适的 savepoint;本案例的自动提交失败才会回到 IDLE

实测诊断

固定源码组都是 ERROR 变体。本案例 heap.c 主模板为 column "%s" is of type %s but default expression is of type %s,提示为 You will need to rewrite or cast the expression.;赋值路径使用 column "%s" is of type %s but expression is of type %s 和同一提示;CASE/UNION 等公共类型路径使用 %s types %s and %s cannot be matched。值输入失败是 22P02;选定公共类型后无法转换表达式则是 42846

代表案例

注册表先定义整数列与显式文本默认值,再创建匹配定义、插入默认行并核对。

CREATE TABLE syntax_schema.mismatch_table (value integer DEFAULT 'x'::text);
CREATE TABLE syntax_schema.mismatch_table (value integer DEFAULT 1);
INSERT INTO syntax_schema.mismatch_table DEFAULT VALUES;
SELECT value FROM syntax_schema.mismatch_table;

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.datatype-default.18.6src/backend/catalog/heap.c lines 3413–3420 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 e720ee58279590793edd0985b3c910970ef56e7361b8ef92e245370587e02a0e (source).
  • src.datatype-default.10.23src/backend/catalog/heap.c lines 2679–2686 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 285e1e2f8024acb58497735bcbd8e605e7cfdd224e442becdee6a5b0e7ac7cf6 (source).
  • src.assignment-target.18.6src/backend/parser/parse_target.c lines 575–596 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 4f0cda351acc3e2854bf55514e69cf8b7de6ad82e1535045e4523581ca0d943c (source).
  • src.assignment-target.10.23src/backend/parser/parse_target.c lines 570–596 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 808bfadd7717d711bc71eb85b7ecd343c742ccc8f6f3087164ed20da098b6d7d (source).
  • src.common-type.18.6src/backend/parser/parse_coerce.c lines 1327–1425 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6ac3ddab06edff28e9a694c64fb7f559315cf488bfa4392bc14c24e559f6bd2e (source).
  • src.common-type.10.23src/backend/parser/parse_coerce.c lines 1217–1311 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 ed778c872fe4f2b8742828795566c3eaa24e7af3ce747fbf844c374d673593d3 (source).
  • src.common-coerce.18.6src/backend/parser/parse_coerce.c lines 1564–1593 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6ac3ddab06edff28e9a694c64fb7f559315cf488bfa4392bc14c24e559f6bd2e (source).
  • src.common-coerce.10.23src/backend/parser/parse_coerce.c lines 1349–1378 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 ed778c872fe4f2b8742828795566c3eaa24e7af3ce747fbf844c374d673593d3 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42804 / snippet-registry.42804 — hashes are recorded in evidence/42804.json and each runtime record.

179 - 42809 — 对象类型错误(wrong_object_type)

PostgreSQL SQLSTATE 42809(对象类型错误,wrong_object_type)的源码证据、诊断与处理参考。

42809 — 对象类型错误(wrong_object_type)

速览

42809wrong_object_type(对象类型错误):命令一般有效,但不能作用于该对象种类。本案例尝试在视图上创建行级 BEFORE 触发器。

字段
SQLSTATE 42809
条件名 wrong_object_type
状态 有效
已知存在于 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_WRONG_OBJECT_TYPE
别名

含义

视图保护路径报告 "%s" is a view,DETAIL 为 Views cannot have row-level BEFORE or AFTER triggers. 检查 pg_class.relkind、事件、级别和时机;它不同于关系不存在或触发器函数体错误。自动提交定义失败后为 IDLE

诊断

检查 pg_class.relkind、触发事件、级别和时机,确认目标是视图还是表;触发器函数体错误发生在后续阶段,诊断不同。

处理

使用对象支持的触发器形式:视图上的行级 INSTEAD OF。如果业务需要 BEFORE/AFTER 行时机,应放在基础表上并明确视图写入语义。本次只验证定义成功,没有验证实际视图 DML。显式事务中被拒绝的触发器定义会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

实测诊断

固定组是 ERROR,主报文 "%s" is a view,DETAIL 为 Views cannot have row-level BEFORE or AFTER triggers.

代表案例

运行器创建视图和函数,先尝试被禁止触发器,再创建 INSTEAD OF 触发器并核对目录行。

CREATE VIEW syntax_schema.trigger_view AS SELECT 1 AS value;
CREATE FUNCTION syntax_schema.trigger_function() RETURNS trigger LANGUAGE plpgsql AS 'BEGIN RETURN NEW; END';
CREATE TRIGGER row_trigger BEFORE INSERT ON syntax_schema.trigger_view FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
CREATE TRIGGER instead_trigger INSTEAD OF INSERT ON syntax_schema.trigger_view FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
SELECT count(*) FROM pg_trigger t JOIN pg_class c ON c.oid = t.tgrelid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = 'syntax_schema_name' AND c.relname = 'trigger_view' AND t.tgname = 'instead_trigger' AND NOT t.tgisinternal;

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.view-row-trigger.18.6src/backend/commands/trigger.c lines 274–278 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 0a539af85b0de1a04779f92202e7bfc77d85ae6da1747ea32527c67f39084fbd (source).
  • src.view-row-trigger.10.23src/backend/commands/trigger.c lines 208–212 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 dac7cdcbe2df1a1bbc77daa23e808b0c81ba8891c9895f10e8b270a15316e225 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42809 / snippet-registry.42809 — hashes are recorded in evidence/42809.json and each runtime record.

180 - 42830 — 无效外键(invalid_foreign_key)

PostgreSQL SQLSTATE 42830(无效外键,invalid_foreign_key)的源码证据、诊断与处理参考。

42830 — 无效外键(invalid_foreign_key)

速览

42830invalid_foreign_key(无效外键):外键定义在被引用列上找不到合格唯一键。本案例的父表整数列没有唯一约束。

字段
SQLSTATE 42830
条件名 invalid_foreign_key
状态 有效
已知存在于 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_INVALID_FOREIGN_KEY
别名

含义

创建时先检查父键,尚未插入子行。固定主报文为 there is no unique constraint matching given keys for referenced table "%s"。普通 FK 的被引用列集合可以匹配物理顺序不同但合格的唯一索引;源码匹配器会拒绝被引用列重复,并要求列数正确、唯一、有效且没有部分谓词或索引表达式。若匹配到可延迟的唯一/主键索引,则进入仅源码确认的 55000 分支。这是定义时错误,不同于 23503;自动提交 ALTER 失败后为 IDLE

诊断

将被引用列集合与 pg_constraintpg_index 对照。检查重复引用、列数、唯一/主键属性、有效性、部分谓词和表达式;普通路径不要求物理索引顺序与 FK 列表相同。还要检查 indimmediate:匹配但可延迟的键会报 55000,不是本案例的 42830。类型相同本身不能使键符合要求。

处理

在被引用列集合上添加或使用有意且不可延迟的唯一键,再创建 FK。核对父表键的业务含义及 NULL/MATCH 语义;过宽唯一约束可能改变可接受数据。不要为了匹配 FK 书写顺序而重排本来合格的索引,也不要把部分或表达式索引当作合格键。案例添加 UNIQUE (id) 后创建 FK。显式事务中被拒绝的 ALTER TABLE 会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

实测诊断

选定 tablecmds.c 组是 ERROR,主报文为 there is no unique constraint matching given keys for referenced table "%s",没有 DETAIL/HINT。同一匹配器还有仅源码确认的 55000object_not_in_prerequisite_state)变体:当唯一键本来匹配但可延迟时为 cannot use a deferrable unique constraint for referenced table "%s"

代表案例

注册表创建父子表,先尝试 FK,再添加父唯一键、创建有效 FK 并统计。

CREATE TABLE syntax_schema.fk_parent (id integer);
CREATE TABLE syntax_schema.fk_child (parent_id integer);
ALTER TABLE syntax_schema.fk_child ADD CONSTRAINT fk_bad FOREIGN KEY (parent_id) REFERENCES syntax_schema.fk_parent (id);
ALTER TABLE syntax_schema.fk_parent ADD CONSTRAINT fk_parent_id_key UNIQUE (id);
ALTER TABLE syntax_schema.fk_child ADD CONSTRAINT fk_good FOREIGN KEY (parent_id) REFERENCES syntax_schema.fk_parent (id);
SELECT count(*) FROM pg_constraint c JOIN pg_namespace n ON n.oid = c.connamespace WHERE n.nspname = 'syntax_schema_name' AND c.conname = 'fk_good' AND c.contype = 'f';

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.invalid-fk.18.6src/backend/commands/tablecmds.c lines 13639–13642 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9 (source).
  • src.invalid-fk.10.23src/backend/commands/tablecmds.c lines 8133–8136 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c (source).
  • src.invalid-fk-guards.18.6transformFkeyCheckAttrs 完整源码为 src/backend/commands/tablecmds.c lines 13505–13642,commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;blob SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9 (source).
  • src.invalid-fk-guards.10.23transformFkeyCheckAttrs 完整源码为 src/backend/commands/tablecmds.c lines 8002–8136,commit 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4;blob SHA-256 6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42830 / snippet-registry.42830 — hashes are recorded in evidence/42830.json and each runtime record.

181 - 42846 — 无法强制转换(cannot_coerce)

PostgreSQL SQLSTATE 42846(无法强制转换,cannot_coerce)的源码证据、诊断与处理参考。

42846 — 无法强制转换(cannot_coerce)

速览

42846cannot_coerce(无法强制转换):源类型与目标类型之间没有适用 cast。本案例要求把 integer 转成 date。

字段
SQLSTATE 42846
条件名 cannot_coerce
状态 有效
已知存在于 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_CANNOT_COERCE
别名

含义

固定主报文为 cannot cast type %s to %s。它不同于合法 cast 的值解析失败 22P02 和目标上下文表达式类型不匹配 42804。检查 pg_cast 与表达式上下文;自动提交模式下本例转换失败后连接回到 IDLE

诊断

读取诊断中的源类型和目标类型,并检查 pg_cast 与表达式上下文;确认应用真正需要类型字面量还是有文档支持的转换函数。

处理

按目标类型构造值,或使用文档支持的转换函数。案例用 DATE '2026-01-01',没有猜测 integer 到 date 的业务映射,也没有用 NULLIF 掩盖错误。显式事务中失败的 cast 会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

实测诊断

固定 parse_expr.c 组是 ERROR,主模板为 cannot cast type %s to %s,没有 DETAIL/HINT。

代表案例

注册表执行 SELECT 1::integer::date,再执行日期字面量并断言确切日期。

SELECT 1::integer::date;
SELECT DATE '2026-01-01';

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.cannot-coerce.18.6src/backend/parser/parse_expr.c lines 2782–2787 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 63c37770872a08978f931c31f801666a08e3bc8e51c2c65ff60151a1d139d55b (source).
  • src.cannot-coerce.10.23src/backend/parser/parse_expr.c lines 2739–2744 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 2700ba4a37d0715b66be76c900c7da7cf6a4d818eb71178e7b9a51e48e59e136 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42846 / snippet-registry.42846 — hashes are recorded in evidence/42846.json and each runtime record.

182 - 42883 — 未定义函数(undefined_function)

PostgreSQL SQLSTATE 42883(未定义函数,undefined_function)的源码证据、诊断与处理参考。

42883 — 未定义函数(undefined_function)

速览

42883undefined_function(未定义函数):按名称和输入类型没有兼容函数。解析器的未定义操作符分支也会使用该条件。本案例在函数不存在时调用模式限定的整数签名。

字段
SQLSTATE 42883
条件名 undefined_function
状态 有效
已知存在于 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_UNDEFINED_FUNCTION
别名

含义

解析器同时解析名称、模式可见性、输入类型和重载。选定函数组报告 function %s does not exist,提示没有匹配函数;同一 SQLSTATE 的 parse_oper.c 分支会报告 operator does not exist: %s 及对应操作符提示。区分 42725 的候选歧义和 42846 的表达式转换失败。函数要检查 pg_proc/identity arguments,操作符要检查 pg_operator 和两个操作数类型。扩展提供的例程或操作符也可能在当前服务器或版本不可用,因此可用性本身属于诊断范围。

诊断

记录完整名称和签名。函数用 pg_procpg_get_function_identity_arguments 查询,操作符检查 pg_operator 及两个操作数类型。核对 current_schemasearch_path,但不要预设换路径就是正确答案;确认对象是函数、过程、操作符还是扩展提供的特性。若怀疑扩展或版本差异,先检查已安装扩展元数据和 server_version_num

处理

显式调用预期签名;拥有 API 时在目标模式创建精确函数。若缺失对象由扩展或较新服务器特性提供,只有部署契约要求时才安装或启用该依赖,不要因为查找失败就创建替代品。不要盲目改 search_path 或加 cast,它们可能选中另一例程或操作符。案例创建 missing_function(integer) 并返回 42。显式事务中错误会使事务保持 INERROR,应先回滚或回到合适的 savepoint;自动提交错误后为 IDLE

实测诊断

选定解析器函数组是 ERROR:主报文 function %s does not exist,提示为 No function matches the given name and argument types. You might need to add explicit type casts. 仅源码确认的操作符组同样是 ERROR:主报文 operator does not exist: %s;两个操作数类型已知时提示为 No operator matches the given name and argument types. You might need to add explicit type casts.,缺少一个操作数类型时使用单数 type 版本。这些是共享 42883 的不同产生路径。

代表案例

运行器调用缺失模式限定函数,检查展开签名与状态,创建精确整数签名后再次调用。

SELECT syntax_schema.missing_function(41);
CREATE FUNCTION syntax_schema.missing_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1 + 1';
SELECT syntax_schema.missing_function(41);

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

  • src.errcodes.REL_18_6 — fixed definition at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.undefined-function.18.6src/backend/parser/parse_func.c lines 629–636 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 48314eab022297478ac4e49786afaff2621ab7b1d7b50e156668cf477961384f (source).
  • src.undefined-function.10.23src/backend/parser/parse_func.c lines 521–528 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 f1b4af88565ca01dbad2b244cd26b42f34764b3f1343b22a9231e271fb0742f2 (source).
  • src.undefined-operator.18.6src/backend/parser/parse_oper.c lines 619–644 at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 3866ce3302c2a4bd22d0f1d113a4bbc627278a618d5e7b83660e36240cbdd0a8 (source).
  • src.undefined-operator.10.23src/backend/parser/parse_oper.c lines 706–728 at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 5802db6d55bdb41f9cad4957384fa2c2ddbb4dc902c33f5f57e8a07760761d10 (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.42883 / snippet-registry.42883 — hashes are recorded in evidence/42883.json and each runtime record.

183 - 428C9 — GENERATED ALWAYS 列赋值

PostgreSQL SQLSTATE 428C9(generated_always)的来源与诊断参考。

428C9 — GENERATED ALWAYS 列赋值

速览

428C9generated_always)是重写阶段的 ERROR:INSERT 或 UPDATE 向必须由服务器生成或只接受 DEFAULT 的列提供了值。身份列和生成列的赋值规则不同,必须结合操作类型和列元数据判断。

字段
SQLSTATE 428C9
条件名 generated_always
状态 有效
已知存在于 10.0
锁定快照 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_GENERATED_ALWAYS
别名

含义

重写器会把 INSERT 中省略的目标列或显式 DEFAULT 标为 apply_defaultGENERATED ALWAYS 身份列收到非默认值时,除非使用 OVERRIDING SYSTEM VALUE,否则报错;OVERRIDING USER VALUE 会强制使用默认生成。BY DEFAULT 身份列通常允许显式值,但 OVERRIDING USER VALUE 仍会强制生成。生成列无论是否有 OVERRIDING 都只接受 DEFAULT,INSERT 的 DETAIL 会指出列名,身份列分支还带 HINT Use OVERRIDING SYSTEM VALUE to override.

UPDATE 的检查覆盖 GENERATED ALWAYS 身份列和所有生成列,只要目标项是非默认值就报错;UPDATE 没有 OVERRIDING 例外。检查之后,虚拟生成列在重写目标中放入 NULL,存储生成列由执行器填充。这是 18.6 固定源码的存储路径;目录中“10.0 已知存在”只是 SQLSTATE 定义下界,不能据此声称 10.0 已具备所有生成列特性。

诊断

检查 pg_attribute.attidentitya 表示 ALWAYSd 表示 BY DEFAULT)和 attgenerateds 表示存储、v 表示虚拟),确认是 INSERT 还是 UPDATE,以及目标项是省略、DEFAULT 还是实际值。VALUES 来源还要确认对应行项是否确实为 DEFAULT;重写器有单独的全默认判断。身份列与生成列的 INSERT 可能共用主消息,需同时读取 DETAIL/HINT。

处理

GENERATED ALWAYS 身份列省略赋值、使用 DEFAULT,或仅在业务明确拥有身份值时使用 OVERRIDING SYSTEM VALUEBY DEFAULT 身份列可按业务保留显式值;需要服务器生成时用 OVERRIDING USER VALUE。生成列移除赋值,不要用类型转换绕过检查。若 ERROR 发生在显式事务中,应回滚到合适保存点或回滚事务后再发修正语句;本页没有运行时恢复观察。

消息变体

选定的 18.6 分支均为 ERROR

操作 主消息 DETAIL HINT
GENERATED ALWAYS 身份列 INSERT cannot insert a non-DEFAULT value into column "%s" Column "%s" is an identity column defined as GENERATED ALWAYS. Use OVERRIDING SYSTEM VALUE to override.
生成列 INSERT cannot insert a non-DEFAULT value into column "%s" Column "%s" is a generated column.
GENERATED ALWAYS 身份列 UPDATE column "%s" can only be updated to DEFAULT Column "%s" is an identity column defined as GENERATED ALWAYS.
生成列 UPDATE column "%s" can only be updated to DEFAULT Column "%s" is a generated column.

固定源码还区分虚拟生成列的 NULL 目标项与存储生成列的执行器填充。每个 %s 都是动态字段,本页不声称具体占位符值或运行时结果。

版本

目录记录该条件自 10.0 起存在,并锁定到 18.6、19beta3;这是定义下界,不是身份列、存储生成列和虚拟生成列共同的功能引入版本。本页机制依据 18.6 固定源码,未运行数据库。

来源

  • src.errcodes.428C9.18.6src/backend/utils/errcodes.txt line 355,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.428C9.353c4cc772b5ae9adad09c67src/backend/rewrite/rewriteHandler.c lines 942-948,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5a34bf31f424abbf46cd926da1fefcd9360c4d527a87d8a0ac9f653d67c2206a源码)。

  • src.call.428C9.47aaa60ecb1566d462ffaa86src/backend/rewrite/rewriteHandler.c lines 981-986,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5a34bf31f424abbf46cd926da1fefcd9360c4d527a87d8a0ac9f653d67c2206a源码)。

  • src.call.428C9.8585d423db2446a6222cbf57src/backend/rewrite/rewriteHandler.c lines 1008-1013,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5a34bf31f424abbf46cd926da1fefcd9360c4d527a87d8a0ac9f653d67c2206a源码)。

  • src.call.428C9.generated-updatesrc/backend/rewrite/rewriteHandler.c lines 1015-1030,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5a34bf31f424abbf46cd926da1fefcd9360c4d527a87d8a0ac9f653d67c2206a源码)。

  • src.calls.REL_18_6.428C9 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

184 - 42939 — 保留名称

PostgreSQL SQLSTATE 42939(reserved_name)的来源与诊断参考。

42939 — 保留名称

速览

42939reserved_name)按对象类型拒绝保留名称。选定的 18.6 路径覆盖模式、表空间、创建角色和角色说明语法;必须根据报文中的对象类型判断具体规则。

字段
SQLSTATE 42939
条件名 reserved_name
状态 有效
已知存在于 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_RESERVED_NAME
别名

含义

创建模式时,保留的 pg_ 前缀会触发 unacceptable schema name "%s" 及系统模式 DETAIL;创建表空间有对应的系统表空间报文。CREATE ROLEpg_ 前缀报告 role name "%s" is reserved。此外,语法中的 RoleId 在角色名位置拒绝 publicnoneSESSION_USERCURRENT_USERCURRENT_ROLEpublicnone 使用保留角色名主消息,后三个当前/会话标记使用 %s cannot be used as a role name here。这些规则不表示这些单词在所有标识符位置都保留。

诊断

先读取主消息和 DETAIL。unacceptable schema name 指向模式前缀检查,unacceptable tablespace name 指向表空间检查,role name ... is reserved 可能是 pg_ 角色或语法中的 public/none%s cannot be used as a role name here 则明确是角色说明标记。语法错误应检查角色名所在的命令位置,而不是先查 pg_namespacepg_authid;不能只凭 SQLSTATE 判断。

处理

选择允许的对象名称并检查迁移与所有权。若是角色说明语法错误,应在该位置改用允许的实际角色标识符;改 search_path 不能替代修正命令。不要删除系统对象或重复同名重试。对象级 ERROR 若发生在显式事务中,应先回滚到保存点或回滚事务再重试。

消息变体

选定路径均为 ERROR,具体主消息/DETAIL 如下:

  • 模式:unacceptable schema name "%s",DETAIL 为 The prefix "pg_" is reserved for system schemas.
  • 表空间:unacceptable tablespace name "%s",DETAIL 为 The prefix "pg_" is reserved for system tablespaces.
  • pg_ 角色:role name "%s" is reserved,DETAIL 为 Role names starting with "pg_" are reserved.
  • 角色语法:public/none 使用 role name "%s" is reservedSESSION_USERCURRENT_USERCURRENT_ROLE 使用 %s cannot be used as a role name here

版本

目录锁定范围从 7.4 下界到 18.6、19beta3;这是条件目录下界,不是每个对象规则的共同引入版本。本页机制只做源码确认,未运行数据库。

来源

  • src.errcodes.42939.18.6src/backend/utils/errcodes.txt line 349,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42939.baa3c4599e167695f281cfe8src/backend/commands/schemacmds.c lines 107-110,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5fd5f43dce5f36f06ed390014c06f244564072227d25a22735f594d2170626b1源码)。

  • src.call.42939.aed179efd45a7ca409d59fd6src/backend/commands/tablespace.c lines 281-285,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 f0369bece6339d18cd7d4a29b5fa3010447c3b8ece235c64b0d4fbf5f96a5317源码)。

  • src.call.42939.419595a34cae2a69b2e21624src/backend/commands/user.c lines 352-356,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 aa8769a2577fff287301d6c82169262cca328515ae940d5a2be4b3e8c21617ed源码)。

  • src.call.42939.role-grammarsrc/backend/parser/gram.y lines 17460-17542,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 7e548b673a1e03eb3a56c5eb9ad92d8e11095fac76e14cb258ca851f58274724源码)。

  • src.calls.REL_18_6.42939 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

185 - 42P01 — undefined_table:未定义的表或关系

当引用的关系无法解析时,PostgreSQL 会报告 SQLSTATE 42P01。应检查模式限定、search_path、标识符引用和迁移,再决定是否创建或重命名对象。

速览

42P01 是 PostgreSQL 类别 42 syntax_error_or_access_rule_violation 中的 undefined_table 条件。这个名称沿袭已久;无法解析的引用可以是表、视图、物化视图、外部表或其他关系名称。

普通诊断是未限定引用的 relation "%s" does not exist,或限定引用的 relation "%s.%s" does not exist。解析器在查询执行前报告 SQLSTATE;自动提交连接不会因为这个查询错误留下失败事务。

代表性案例查询不存在的模式限定关系,再创建有效关系并读取它。PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 目标均返回 42P01,连接保持 IDLE,修正后的查询成功。run ID 和断言见公开证据 JSON

字段
SQLSTATE 42P01
条件名 undefined_table
状态 有效
已知存在于 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_UNDEFINED_TABLE
别名

含义与触发路径

解析阶段会根据当前命名空间和 search_path 解析每个关系。如果限定名称不存在,parse_relation.c 产生两部分名称报文;如果未限定名称不存在,则产生一部分名称报文。拼写错误、迁移尚未执行、连接了错误数据库、search_path 不同,或者带引号标识符大小写不一致,都可能产生这个 SQLSTATE。

这是名称解析错误,不等于物理表一定被删除。关系可能存在于另一个模式或数据库中,角色也可能缺少查看或使用它所需的权限。反过来,按猜测的名称创建表会掩盖部署或引用错误。

解析器还会在某些无效 FROM 项引用和 CTE 前向引用中使用 42P01,但 detail 或 hint 可能不同。应结合完整报文和上下文,将这些形式与缺少关系区分开。

报文与诊断

runner 的操作先限定模式查询,再查询修正后的关系。隔离 harness 提供临时模式;查询形状如下:

SELECT * FROM does_not_exist;
CREATE TABLE exists(id integer PRIMARY KEY);
SELECT count(*) FROM exists;

PostgreSQL 18.6 返回:

SQLSTATE: 42P01
severity: ERROR
message_primary: relation "c42p01_missing_relation.does_not_exist" does not exist
source: parse_relation.c / parserOpenTable / line 1480

PG10 目标返回相同的主报文,对应源码行号为 1159。限定形式会在报文中保留模式和关系名称。未限定引用使用固定源码模板 relation "%s" does not exist;CTE 前向引用或无效 FROM 引用可能附带 detail 或 hint。

诊断

记录 SQLSTATE、主报文、detail、hint、语句位置、当前数据库、角色和 search_path。检查应用使用的准确拼写与引用方式。通过有权限的管理连接查询 pg_class/pg_namespace 或使用 to_regclass(),确认关系实际存在的位置。

对照已部署迁移版本、连接数据库和模式。连接池中的 session 可能带有不同于建表连接的 search_path。如果对象预期是临时对象,应确认查询仍在创建它的同一个 session 中执行。

代表性错误发生在自动提交下,连接保持 IDLE;修正后的查询返回 count 0 并仍为 IDLE。如果缺少关系的引用发生在显式事务中,事务仍可能进入 INERROR,因此应记录实际状态,不要假定所有 42P01 都不会影响周围工作。

处理与修复

按部署和应用配置修复名称解析原因:

  • 明确选择目标模式,或为 session 设置并验证 search_path
  • 在提供查询前于正确数据库执行缺少的迁移。
  • 对大小写敏感的标识符保留准确的双引号;检查依赖后再按统一约定重命名。
  • 只有在缺少对象是预期分支时才使用 to_regclass() 等预检;意外部署失败不应静默创建替代关系。

修正关系后重新执行原查询,并验证返回值和事务状态。成功执行 CREATE TABLE 或打开新连接,都不能证明所有应用 session 解析到同一个对象。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 42P01,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。

缺少关系案例在 PostgreSQL 18.6 和 10.21 上均通过。源码行号和解析器 hint 会因版本及引用形式变化。本页覆盖模式限定的缺少关系和有效后续查询,不覆盖所有使用 42P01 的命名空间或访问规则路径。

42P02undefined_parameter 处理缺少查询参数。3F000invalid_schema_name 处理无效模式名称。42501insufficient_privilege 是名称解析之后的访问失败。57014query_canceled 可能中断修复查询,但原因不同。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留两个目标 ID 和结构化观察。

186 - 42P02 — 未定义参数

PostgreSQL SQLSTATE 42P02(undefined_parameter)的来源与诊断参考。

42P02 — 未定义参数

速览

42P02undefined_parameter)是解析阶段的 ERROR$1 等位置参数超出了解析器已知的参数集合。它不同于 Bind 报文参数数量违反协议时的 08P01,也不同于参数存在但类型推导不一致的 42P08

字段
SQLSTATE 42P02
条件名 undefined_parameter
状态 有效
已知存在于 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_UNDEFINED_PARAMETER
别名

含义

固定参数钩子会拒绝超出声明数组或类型无效的参数编号;可变参数钩子虽然会在解析时扩展数组,解析结束时仍会拒绝超出范围的参数。没有钩子解析该标记时也使用相同主消息。选定路径都带解析位置,there is no parameter $%d 中的编号是动态值;这针对 SQL 参数标记,不是表列或 PL/pgSQL 变量缺失。

扩展查询的边界不同:exec_bind_message 会检查参数格式码数量、参数值数量和预备语句的要求,数量不符时报告 08P01,例如 bind message supplies %d parameters, but prepared statement "%s" requires %d。因此 Bind 阶段的数量/格式错误不能改标成 42P02

诊断

记录 SQL 文本、解析位置、参数编号和协议阶段。Parse/解析阶段对照固定或可变参数声明与每个 $n;扩展查询 Bind 阶段另查格式码和参数值数量,数量不符走 08P01。参数存在但类型推导冲突时才看 42P08

处理

修正 SQL 占位符编号或 Parse 参数声明;Bind 阶段发送预备语句要求的准确参数数量和兼容的格式码,不要用类型转换掩盖数量错误。真正缺少参数时补上预期参数,或明确改用字面量/默认值。若 ERROR 发生在显式事务中,应回滚到合适保存点或回滚事务后重试;本页没有运行时恢复观察。

消息变体

选定解析路径均为 ERROR there is no parameter $%d%d 是动态参数编号。固定的 18.6 Bind 检查属于 08P01,主消息是 bind message has %d parameter formats but %d parametersbind message supplies %d parameters, but prepared statement "%s" requires %d

版本

目录锁定范围从 7.4 下界到 18.6、19beta3;这是目录范围,不是运行时比较。选定的是 18.6 固定解析器和 Bind 源码路径,未运行客户端 Bind 案例。

来源

  • src.errcodes.42P02.18.6src/backend/utils/errcodes.txt line 375,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P02.81f0048a16f439569ce3a4basrc/backend/parser/parse_expr.c lines 899-902,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 63c37770872a08978f931c31f801666a08e3bc8e51c2c65ff60151a1d139d55b源码)。

  • src.call.42P02.73515542f469d69893fd5fb8src/backend/parser/parse_param.c lines 109-112,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28源码)。

  • src.call.42P02.671f865f9d428e0ab2a78347src/backend/parser/parse_param.c lines 203-206,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28源码)。

  • src.call.42P02.bind-contractsrc/backend/tcop/postgres.c lines 1718-1731,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061源码)。

  • src.calls.REL_18_6.42P02 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

187 - 42P03 — 重复游标

PostgreSQL SQLSTATE 42P03(duplicate_cursor)的来源与诊断参考。

42P03 — 重复游标

速览

42P03duplicate_cursor)报告游标或 portal 名称冲突,但同一 SQLSTATE 覆盖 ERROR、替换时的 WARNING,以及 PL/pgSQL 活动游标的 ERROR。调用方和 CreatePortal 选项决定具体行为。

字段
SQLSTATE 42P03
条件名 duplicate_cursor
状态 有效
已知存在于 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_DUPLICATE_CURSOR
别名

含义

CreatePortal(name, allowDup, dupSilent)allowDup 为 false 时报告 ERROR cursor "%s" already existsallowDup 为 true 时,若 dupSilent 未设置,会先发 WARNING closing existing cursor "%s",随后删除旧 portal 并创建新 portal。PL/pgSQL 是另一条路径:SPI_cursor_find 发现同名活动游标时报告 ERROR cursor "%s" already in use

诊断

记录准确名称、来源(SQL portal 创建还是 PL/pgSQL OPEN)、严重性和事务状态。SQL 路径检查 portal 创建/复用及适用时的 pg_cursors;PL/pgSQL 路径检查游标变量和 OPEN/CLOSE 流程。allowDup 的替换分支不能推出所有重复声明都会 WARNING,PL/pgSQL 分支也不是 portal 管理器的替换路径。

处理

非替换 portal 路径报 ERROR 时,关闭旧 portal 或使用符合事务生命周期的新名称。WARNING 替换路径已经关闭旧 portal,应用仍应确认替换是预期行为。PL/pgSQL 应在重新打开前关闭命名游标,或使用不同变量/名称。只有 ERROR 路径需要通过回滚保存点或回滚事务恢复显式事务;重连不能替代查清连接池所有权。

消息变体

18.6 代表报文如下:

路径 严重性 主消息
CreatePortal(..., allowDup=false, ...) ERROR cursor "%s" already exists
CreatePortal(..., allowDup=true, dupSilent=false) WARNING closing existing cursor "%s"
已找到 PL/pgSQL 命名游标 ERROR cursor "%s" already in use

%s 为动态游标名称,本页不声称具体名称。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的是 18.6 固定 portal 管理器和 PL/pgSQL 源码路径,未运行数据库。

来源

  • src.errcodes.42P03.18.6src/backend/utils/errcodes.txt line 378,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P03.800a8278cf453417f5af6d6esrc/backend/utils/mmgr/portalmem.c lines 185-187,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 8e29a302a7837316765acc798f9ff6eb22a330e8098a02794cd4d683601d3b04源码)。

  • src.call.42P03.208bdd3b576b5021fb35916dsrc/backend/utils/mmgr/portalmem.c lines 189-192,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 8e29a302a7837316765acc798f9ff6eb22a330e8098a02794cd4d683601d3b04源码)。

  • src.call.42P03.06c0580b43488eece2de1973src/pl/plpgsql/src/pl_exec.c lines 2895-2897,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 0df3c70a6bccf6dddf443fb99e152a16a67009827c44a820597e98e585cb8b20源码)。

  • src.calls.REL_18_6.42P03 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

188 - 42P04 — 重复数据库

PostgreSQL SQLSTATE 42P04(duplicate_database)的来源与诊断参考。

42P04 — 重复数据库

速览

42P04duplicate_database)表示数据库管理路径发现集群中已有同名数据库。这是集群级名称检查,不是当前库内的关系冲突;CREATE 和 RENAME 的外围检查也不同。

字段
SQLSTATE 42P04
条件名 duplicate_database
状态 有效
已知存在于 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_DUPLICATE_DATABASE
别名

含义

createdb 会用 get_database_oid(dbname, true) 检查目标名称,冲突时报告 ERROR database "%s" already existsRenameDatabase 在查找旧数据库、检查所有权和 CREATEDB 权限之后,对 newname 做同样检查。因此 %s 在 CREATE 中是请求的数据库名,在 RENAME 中是新名称。

utility 分发器在进入 createdb 前调用 PreventInTransactionBlock(isTopLevel, "CREATE DATABASE")。所以在显式事务中执行 CREATE DATABASE 是另一种事务块错误,不能据此声称发出了 42P04;RENAME 则有独立的旧名、所有权、权限和新名检查。

诊断

确认目标集群和准确名称,检查 pg_database、标识符折叠和迁移竞争。CREATE 另查目标名称、模板和所有者前提;RENAME 同时查旧名、新名、所有权和 CREATEDB。旧数据库不存在或权限不足不应误判为 42P04

处理

已有库就是目标时让编排幂等并检查它;否则选择未占用名称。CREATE DATABASE 要在顶层、显式事务块之外执行。RENAME 只有在确认旧库、所有权、CREATEDB、活动会话、依赖和集群身份后才选择可用新名。如果 RENAME 在显式事务中报错,下一条命令前应执行 ROLLBACK;若必须保留外层事务,则回滚到改名前建立的保存点。删除或改名不是所有 42P04 的通用修复。

消息变体

选定路径均为 ERROR database "%s" already existscreatedb 使用请求名称,RenameDatabase 使用新名称。utility 中的 PreventInTransactionBlock 证明 CREATE DATABASE 有独立事务限制,不是另一条 42P04 报文。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的是 18.6 固定 CREATE、RENAME 和分发器事务检查路径,未运行数据库。

来源

  • src.errcodes.42P04.18.6src/backend/utils/errcodes.txt line 379,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P04.465a77b5605c341bc91f6990src/backend/commands/dbcommands.c lines 1393-1395,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 64b77d2197dce16eb1ad19d8168382459d621a03df0b00be157f7db39ca22acf源码)。

  • src.call.42P04.b0d1644def83c14a7504fec4src/backend/commands/dbcommands.c lines 1949-1951,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 64b77d2197dce16eb1ad19d8168382459d621a03df0b00be157f7db39ca22acf源码)。

  • src.call.42P04.create-tx-guardsrc/backend/tcop/utility.c lines 769-773,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 7aae5d07628b6debf8456d1d4ea96f28912232192e56ea25773b4c4b61235a00源码)。

  • src.calls.REL_18_6.42P04 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

189 - 42P05 — 重复预备语句

PostgreSQL SQLSTATE 42P05(duplicate_prepared_statement)的来源与诊断参考。

42P05 — 重复预备语句

速览

42P05duplicate_prepared_statement)表示当前后端/会话已有同名服务器端预备语句。连接池可能让后续请求复用这段状态,而另一条连接可以拥有同名的独立语句。

字段
SQLSTATE 42P05
条件名 duplicate_prepared_statement
状态 有效
已知存在于 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_DUPLICATE_PSTATEMENT
别名

含义

StorePreparedStatement 把命名语句放在当前后端的 prepared_queries 哈希表中;HASH_ENTER 发现名称已存在时,在保存新计划前报告 ERROR prepared statement "%s" already existsDEALLOCATE name 删除当前后端的一项,DEALLOCATE ALL 删除当前后端的全部项;它们不会删除另一条连接拥有的语句。

诊断

检查物理连接/后端身份、pg_prepared_statements、连接池签出历史和 PREPARE 路径,区分命名服务器语句、未命名协议语句和驱动本地缓存键。若多个请求复用了同一连接,先核对准确名称和参数类型再修改 SQL。

处理

只有 SQL 与参数类型匹配时才复用现有语句;否则由该连接的所有者协调 DEALLOCATE name、使用确定性的唯一名称,或按连接池生命周期策略重置会话。不要在另一条连接执行 DEALLOCATE 后假定冲突已清除。此 ERROR 若发生在显式事务中,应回滚保存点或回滚事务;重连只是受控重置,不是通用修复。

消息变体

确认的 18.6 变体是 ERRORprepared statement "%s" already exists%s 是动态的服务器端名称。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的 18.6 源码覆盖当前后端的插入与释放路径,未运行数据库。

来源

  • src.errcodes.42P05.18.6src/backend/utils/errcodes.txt line 381,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P05.b490336894ec11628c1766f2src/backend/commands/prepare.c lines 412-415,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 e37fbd5f7618e5554561d9293d8c3af7cf3190c62c5c6bbceb3fe8b97be17956源码)。

  • src.call.42P05.lifecyclesrc/backend/commands/prepare.c lines 401-423、504-511,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 e37fbd5f7618e5554561d9293d8c3af7cf3190c62c5c6bbceb3fe8b97be17956源码)。

  • src.calls.REL_18_6.42P05 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

190 - 42P06 — 重复模式

PostgreSQL SQLSTATE 42P06(duplicate_schema)的来源与诊断参考。

42P06 — 重复模式

速览

42P06duplicate_schema)是模式定义冲突。普通 CREATE 报 ERROR;IF NOT EXISTS 可发 NOTICE 并继续,但条件路径只是跳过创建,不会协调已有模式。

字段
SQLSTATE 42P06
条件名 duplicate_schema
状态 有效
已知存在于 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_DUPLICATE_SCHEMA
别名

含义

NamespaceCreate 发现 pg_namespace 中已有同名行时报告 ERROR schema "%s" already existsCREATE SCHEMA IF NOT EXISTS 检查同一命名空间后,在创建前报告 NOTICE schema "%s" already exists, skipping。两条报文都指向模式本身,不是其中的关系;固定命令路径先做创建权限检查,NOTICE 不表示已经比较了所有者或定义。

诊断

确认目标数据库和模式,检查 pg_namespace.nspname、所有者/ACL、内容和准确迁移语句。保留严重性:NOTICE 是条件行为并让命令继续,普通 CREATE 的 ERROR 会使显式事务失败。不能从 NOTICE 推出已有模式的所有者、授权、扩展、表或迁移版本符合要求。

处理

仅在所有权、权限和内容符合业务契约时复用。IF NOT EXISTS 不验证也不协调这些属性,需要时应追加明确的所有权、授权和迁移检查。不要删除模式来通过迁移。普通 CREATE 在显式事务中报 ERROR 后,应回滚到合适保存点或回滚事务再继续。

消息变体

选定变体是 schema "%s" already exists(明确 ERROR)和 schema "%s" already exists, skipping(明确 NOTICE)。%s 是动态模式名;两条报文都不保证已有模式的所有者或定义。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的是 18.6 固定 ERROR 和 NOTICE 源码路径,未运行数据库。

来源

  • src.errcodes.42P06.18.6src/backend/utils/errcodes.txt line 382,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P06.4d5505b63e38ef1b25836623src/backend/catalog/pg_namespace.c lines 62-64,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 89675ba1bb9c531ab4f43db8a6f7cac00956561b342e42ea6eaae6b8d0b50d78源码)。

  • src.call.42P06.373538bec86ad8eedfce8d7asrc/backend/commands/schemacmds.c lines 132-135,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5fd5f43dce5f36f06ed390014c06f244564072227d25a22735f594d2170626b1源码)。

  • src.calls.REL_18_6.42P06 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

191 - 42P07 — 重复表或关系定义

PostgreSQL SQLSTATE 42P07(duplicate_table)的来源与诊断参考。

42P07 — 重复表或关系定义

速览

42P07duplicate_table)覆盖关系名称冲突、条件 DDL 的 NOTICE,以及继承父项重复或继承环,应先识别操作。

字段
SQLSTATE 42P07
条件名 duplicate_table
状态 有效
已知存在于 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_DUPLICATE_TABLE
别名

含义

18.6 核心路径中,表、序列、索引和 CREATE TABLE AS 冲突均报告 relation "%s" already exists。这些对象共享 pg_class 关系命名空间,因此另一种关系类型的同名对象也会造成冲突。索引的 IF NOT EXISTS 路径报告 NOTICE relation "%s" already exists, skipping 并直接返回,不检查已有索引定义是否符合请求。继承路径还对重复父项和 circular inheritance not allowed 使用此 SQLSTATE,后者 DETAIL 为 "%s" is already a child of "%s".

诊断

名称冲突查 pg_class/pg_namespace,并把序列、索引、表、视图和物化视图纳入检查。IF NOT EXISTS 的 NOTICE 还要核对已有对象的所有者、持久性、列、索引和选项,不能把源码中的名称检查当成定义比较。继承报文查 pg_inherits 和完整父列表,区分父项重复与继承环。

处理

只有确认已有定义可接受时才使用幂等 DDL;关系名称冲突可选择采用已有对象或制定对象级迁移。重复父项应从父列表移除重复项,继承环则要打破父图并复核 pg_inherits;单纯改名不能修复父图。显式事务中的 ERROR 应先回滚保存点或回滚事务再查目录;NOTICE 路径无需该恢复。

消息变体

代表变体如下:

路径 严重性 主消息 DETAIL
关系名称冲突 ERROR relation "%s" already exists
索引 IF NOT EXISTS 冲突 NOTICE relation "%s" already exists, skipping
继承父项重复 ERROR relation "%s" would be inherited from more than once
继承成环 ERROR circular inheritance not allowed "%s" is already a child of "%s".

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的 18.6 路径覆盖关系名称查找、索引 IF NOT EXISTS、继承父项重复和继承环;未运行数据库。

来源

  • src.errcodes.42P07.18.6src/backend/utils/errcodes.txt line 383,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P07.694fcfd426e95ce13263fb9asrc/backend/catalog/heap.c lines 1194-1196,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 e720ee58279590793edd0985b3c910970ef56e7361b8ef92e245370587e02a0e源码)。

  • src.call.42P07.38d8697cf62c00c05657a6d4src/backend/catalog/index.c lines 898-901,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 98a4156a5c21ae856a3b583b633cdeb578a5b69910386c9f166d69fcb04ba2d0源码)。

  • src.call.42P07.30cb2a5359e1ec4bea60a466src/backend/commands/tablecmds.c lines 875-878,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9源码)。

  • src.call.42P07.19ee2522385544dc7ceb62bbsrc/backend/commands/tablecmds.c lines 17376-17381,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9源码)。

  • src.calls.REL_18_6.42P07 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

192 - 42P08 — 参数类型不明确

PostgreSQL SQLSTATE 42P08(ambiguous_parameter)的来源与诊断参考。

42P08 — 参数类型不明确

速览

42P08ambiguous_parameter)表示参数标记存在,但解析阶段无法把它解析为一致或足够具体的类型。由于相似主消息也可能来自其他条件,必须结合 SQLSTATE 和源码分支判断。

字段
SQLSTATE 42P08
条件名 ambiguous_parameter
状态 有效
已知存在于 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_AMBIGUOUS_PARAMETER
别名

含义

可变参数强制转换钩子会先为未知参数记录目标类型;后续上下文要求另一类型时,报告 ERROR inconsistent types deduced for parameter $%d,DETAIL 为 %s versus %s。随后参数解析检查发现解析出的类型与外部类型数组不一致时,报告 ERROR could not determine data type of parameter $%d。这是两条选定的 42P08 检查,不是笼统的“绑定失败”。

相同的 could not determine data type of parameter $%d 主消息也会在 postgres.c 的可变参数完成检查中配合 ERRCODE_INDETERMINATE_DATATYPE42P18)发出。应同时读取 SQLSTATE 和源码路径:本页 42P08 是参数解析阶段的类型不匹配,42P18 是解析完成后仍未确定类型,超出范围的标记则是 42P02

诊断

记录参数编号、所有表达式上下文和 DETAIL。对于类型不一致分支,对照 DETAIL 中的两种类型,找到分别施加约束的上下文;对于未确定分支,检查 PREPARE/扩展查询的参数类型数组和最终推导类型。缺少标记(42P02)、Bind 数量违反协议(08P01)以及别名/列歧义不应混入此类型解析问题。

处理

在明确的表达式边界声明参数类型或转换类型。两个上下文确实需要不同类型时拆分参数,否则统一上下文类型。不要随意转换成宽泛类型,随后核对运算符、索引、NULL 语义和序列化。若 ERROR 发生在显式事务中,应回滚到合适保存点或回滚事务再重试。

消息变体

选定的 42P08 变体均为 ERROR

检查 主消息 DETAIL
推导目标类型冲突 inconsistent types deduced for parameter $%d %s versus %s
最终参数类型不匹配 could not determine data type of parameter $%d

第二条主消息也可能来自独立的 42P18 未确定类型检查;SQLSTATE 是报文身份的一部分。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的是两条 42P08 检查和相邻的 42P18 边界源码,未运行参数案例。

来源

  • src.errcodes.42P08.18.6src/backend/utils/errcodes.txt line 388,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P08.c2cfa81ed9389a1bddf8ec41src/backend/parser/parse_param.c lines 220-227,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28源码)。

  • src.call.42P08.18ba6576d169dfdf614df72dsrc/backend/parser/parse_param.c lines 308-312,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28源码)。

  • src.call.42P08.unresolved-boundarysrc/backend/tcop/postgres.c lines 725-736,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061源码)。

  • src.calls.REL_18_6.42P08 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

193 - 42P09 — 表别名不明确

PostgreSQL SQLSTATE 42P09(ambiguous_alias)的来源与诊断参考。

42P09 — 表别名不明确

速览

42P09ambiguous_alias)是解析阶段的 ERROR:一个可见表引用对应多个关系命名空间项。它发生在执行前,并有文本别名和关系 OID 两条路径。

字段
SQLSTATE 42P09
条件名 ambiguous_alias
状态 有效
已知存在于 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_AMBIGUOUS_ALIAS
别名

含义

文本引用由 scanNameSpaceForRefname 比较可见命名空间别名,发现第二个可见匹配时报告 table reference "%s" is ambiguous。仅列项和非活动 LATERAL 作用域中的 lateral-only 项会被排除。scanNameSpaceForRelid 另一条路径按 OID 匹配无别名关系 RTE,同一关系出现多次时报告 table reference %u is ambiguous。两条路径都带解析位置,且不同于列歧义。

诊断

检查 FROM/JOIN 树、别名、子查询/CTE 可见性和 LATERAL 作用域。若主消息带引号名称,查找重复的可见别名;若带 OID,查找重复的无别名同一关系 RTE。还要检查连接别名是否隐藏内部命名空间,或 LATERAL 子查询是否同时暴露两个别名。search_path 可能影响前面的关系查找,但不能作为已存在重复解析项的通用修复。

处理

给可见关系设置有意义且不同的别名,并通过别名限定引用,或从查询构造器删除多余关系。保留有意的 LATERAL 作用域,修改后核对连接基数。不要把 42P09 当作 42P01(关系不存在)或 42702(列歧义),也不要反复提交相同文本。解析 ERROR 若发生在显式事务中,应回滚到保存点或回滚事务再继续。

消息变体

选定变体均为 ERROR

解析路径 主消息
重复的可见别名/名称 table reference "%s" is ambiguous
重复的无别名关系 OID table reference %u is ambiguous

两者都附带解析位置;%s%u 是源码中的动态字段。

版本

目录范围从 7.4 到 18.6、19beta3,不是精确的功能引入判断。选定的是 18.6 固定文本别名和内部 OID 源码路径,未运行数据库。

来源

  • src.errcodes.42P09.18.6src/backend/utils/errcodes.txt line 389,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P09.ed0c1b7f7e4bd90cb2068e17src/backend/parser/parse_relation.c lines 224-228,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a源码)。

  • src.call.42P09.171afa1503a4e198e620e1b5src/backend/parser/parse_relation.c lines 271-275,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a源码)。

  • src.calls.REL_18_6.42P09 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。

194 - 42P10 — 无效列引用

PostgreSQL SQLSTATE 42P10:来源与诊断参考。

42P10 — 无效列引用

速览

42P10invalid_column_reference)使用列引用的具体操作可能拒绝该引用。

字段
SQLSTATE 42P10
条件名 invalid_column_reference
状态 有效
已知存在于 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_INVALID_COLUMN_REFERENCE
别名

含义

多个消费者会因不同的列引用契约报告 42P10。18.6 选定路径中,cookConstraint 只允许引用拥有 CHECK 约束的表,CopyGetAttnums 拒绝在显式 COPY 列表中指定生成列(默认列表会跳过生成列),ON CONFLICT 仲裁器推断找不到合适索引时也会报告此码。后一种情况是推断失败,不是笼统的缺列错误。

诊断

先结合完整主消息和 DETAIL 判断阶段:CHECK 约束归属、显式 COPY 列表,还是 ON CONFLICT 仲裁器推断。COPY 要区分用户列列表和默认列表;ON CONFLICT 要按 action 检查候选索引的列或表达式、谓词、排序规则和操作符类;DO UPDATE 需要匹配的唯一仲裁器,排除约束不是该 action 的通用替代。没有阶段特定的报文时,不要先判定为缺列。

处理

修复具体契约:把 CHECK 放在所属表上,显式 COPY 列表排除生成列,或让 ON CONFLICT 与现有合适的唯一索引/约束及其推断细节一致。DO NOTHING 也要先核对该 action 的仲裁规则,再考虑排除约束。不要把创建任意约束当成通用修复。如果该 ERROR 发生在显式事务中,下一条命令前执行 ROLLBACK,或回滚到语句前建立的保存点,检查目录后再重试。

消息

固定源码中的代表性消息包括:message: only table "%s" can be referenced in check constraint;message: column "%s" is a generated column; DETAIL: Generated columns cannot be used in COPY.;message: there is no unique or exclusion constraint matching the ON CONFLICT specification。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

195 - 42P11 — 无效游标定义

PostgreSQL SQLSTATE 42P11:来源与诊断参考。

42P11 — 无效游标定义

速览

42P11invalid_cursor_definition)游标选项和游标计划在定义阶段有明确约束。

字段
SQLSTATE 42P11
条件名 invalid_cursor_definition
状态 有效
已知存在于 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_INVALID_CURSOR_DEFINITION
别名

含义

游标声明或 SPI 游标请求违反了定义阶段的规则。18.6 核心分别处理包含多个查询的 SPI 计划、互相冲突的 SCROLL/NO SCROLLASENSITIVE/INSENSITIVE 选项,以及 INSENSITIVE 游标与行锁子句同时出现的情况;后一种路径还会说明 INSENSITIVE 游标必须是 READ ONLY。

诊断

保留错误中点名的选项。确认来源是 DECLARE 还是 SPI 调用者,SPI 计划是否含多个语句,以及冲突的是 SCROLL/NO SCROLL 还是 ASENSITIVE/INSENSITIVE。对于 INSENSITIVE,还要检查行锁子句和 READ ONLY 契约;不要把它误诊为游标不存在。

处理

打开游标前拆分多查询 SPI 计划,只删除冲突选项;INSENSITIVE 需要只读时加上 READ ONLY 或移除行锁。若调用者使用 SPI,应修复计划构造,而不是改动游标提取逻辑。显式事务中的 ERROR 之后,下一条命令前要 ROLLBACK 或回滚到错误前的保存点;自动提交模式下连接可在返回空闲后重发修正请求。

消息

固定源码中的代表性消息包括:message: cannot open multi-query plan as cursor;message: DECLARE INSENSITIVE CURSOR ... %s is not valid; DETAIL: Insensitive cursors must be READ ONLY.;message: cannot specify both %s and %s。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

196 - 42P12 — 无效数据库定义

PostgreSQL SQLSTATE 42P12:来源与诊断参考。

42P12 — 无效数据库定义

速览

42P12invalid_database_definition)该条件表示数据库定义无效,但本次扫描没有解析出核心发出路径。

字段
SQLSTATE 42P12
条件名 invalid_database_definition
状态 有效
已知存在于 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_INVALID_DATABASE_DEFINITION
别名

含义

目录将该条件定义为 invalid_database_definition。对 18.6 的有界调用扫描没有解析出该码的核心发出路径,因此本页说明条件边界,不臆造数据库操作触发场景。

诊断

出现该码时保留服务器消息、数据库名、语句和服务器日志上下文。先确认响应来自 PostgreSQL 核心、扩展、客户端映射还是包装器;仅凭条件名不能确定失败的目录对象。

处理

根据解析出的消息和固定版本源码路径选择修复。确认实际发出者后再检查受影响的数据库定义和依赖;本次有界扫描不足以支持更具体的 SQL 配方,也不能固定严重级别。如果实际响应是显式事务中的 ERROR,应遵循通常的 ROLLBACK 或错误前保存点恢复规则,但不要把这种通用协议恢复写成已确认的 42P12 发出路径。

消息

由于本次有界源码扫描没有解析出核心发出路径,这里不列出消息变体。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

197 - 42P13 — 无效函数定义

PostgreSQL SQLSTATE 42P13:来源与诊断参考。

42P13 — 无效函数定义

速览

42P13invalid_function_definition)函数、聚合和触发器声明可能在执行前校验失败。

字段
SQLSTATE 42P13
条件名 invalid_function_definition
状态 有效
已知存在于 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_INVALID_FUNCTION_DEFINITION
别名

含义

函数定义校验在声明不兼容时使用此条件。选定的核心路径包括无法确定多态聚合转换类型(DETAIL 由调用方动态生成)、最终语句不是兼容的 SELECT 或 DML RETURNING 而导致返回类型不匹配,以及触发器函数声明参数。

诊断

修改函数前先按消息分类:聚合转换类型推断及其动态 DETAIL、最终语句/RETURNING 结果与声明返回类型不一致,或触发器函数声明参数。把已存签名、返回类型与函数体和触发器约定逐项比较;不返回行的 DML 或 utility 命令与标量强制转换失败属于不同的最终语句路径。

处理

修正消息指出的声明或函数体:为聚合提供可确定的转换类型,让函数最后语句返回声明类型;触发器参数应通过 TG_NARGS/TG_ARGV 读取,不能在声明中列出。检查依赖调用者后再重建或替换。如果 ERROR 发生在显式事务中,执行下一条 DDL 前先 ROLLBACK,或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: cannot determine transition data type; errdetail_internal: %s;message: return type mismatch in function declared to return %s; DETAIL: Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.;message: trigger functions cannot have declared arguments; HINT: The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead.。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

198 - 42P14 — 无效预备语句定义

PostgreSQL SQLSTATE 42P14:来源与诊断参考。

42P14 — 无效预备语句定义

速览

42P14invalid_prepared_statement_definition)PREPARE 命令可能在定义预备语句时失败。

字段
SQLSTATE 42P14
条件名 invalid_prepared_statement_definition
状态 有效
已知存在于 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_INVALID_PSTATEMENT_DEFINITION
别名

含义

固定的 18.6 PrepareQuery 路径在注册命名预备语句前,拒绝 SQL PREPARE 的空名称或空指针;这是因为扩展协议有独立的 unnamed 语句槽。因此,协议 Parse 消息中的空名称不自动等于 42P14,空的 SQL 引用标识符也可能先在词法或解析阶段失败。

诊断

准确记录客户端发送的是 SQL PREPARE 还是扩展协议 Parse,并保留语句名。区分 SQL PREPARE 的空名称检查、合法的协议 unnamed 语句、26000(预备语句不存在)以及后续参数/类型错误;空的引用标识符可能在到达此 guard 前就失败。

处理

SQL PREPARE 应使用非空且引用方式一致的语句名。扩展协议若本来要使用 unnamed 语句槽,就保留该协议语义,不要改写成 SQL PREPARE。若名称由框架生成,检查命名层,并确认后续 EXECUTE 与 DEALLOCATE 使用同一会话。显式事务中的 ERROR 之后,下一条命令前仍需 ROLLBACK 或回滚到错误前的保存点。

消息

固定源码中的代表性消息为:invalid statement name: must not be empty(ERROR;没有占位符)。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

199 - 42P15 — 无效模式定义

PostgreSQL SQLSTATE 42P15:来源与诊断参考。

42P15 — 无效模式定义

速览

42P15invalid_schema_definition)CREATE SCHEMA 的模式声明不一致时会被拒绝。

字段
SQLSTATE 42P15
条件名 invalid_schema_definition
状态 有效
已知存在于 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_INVALID_SCHEMA_DEFINITION
别名

含义

模式定义校验发生在转换 CREATE SCHEMA 所包含的对象时。setSchemaName helper 会拒绝某个所含对象显式指定的模式名,只要它不同于当前 CREATE SCHEMA 正在创建的模式。这是所含对象的声明不一致,不是两个顶层模式,也不是找不到模式。

诊断

从消息和完整 CREATE SCHEMA 语句中读取两个模式标识符,找出哪个所含的 CREATE TABLE、序列、视图或其他对象提供了冲突的限定名。分别检查生成的 DDL 与 search_path;改变 search_path 不能让语句中明确给出的两个名称一致。

处理

CREATE SCHEMA 只使用一个预期名称,让其中对象的显式限定名也使用该名称,或省略由该命令提供上下文的限定名。修正迁移生成器或引用方式。CREATE SCHEMA 失败本身不能证明已经提交了部分模式;只有需要清理或外层事务已有状态时才检查目录。如果 ERROR 发生在显式事务中,重试前先 ROLLBACK 或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: CREATE specifies a schema (%s) different from the one being created (%s)。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

  • src/backend/parser/parse_utilcmd.c:4229-4233 (fixed source)

200 - 42P16 — 无效表定义

PostgreSQL SQLSTATE 42P16:来源与诊断参考。

42P16 — 无效表定义

速览

42P16invalid_table_definition)表定义可能违反分区键、排序规则或主键规则。

字段
SQLSTATE 42P16
条件名 invalid_table_definition
状态 有效
已知存在于 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_INVALID_TABLE_DEFINITION
别名

含义

表定义检查在多种关系形状违规时使用此条件。18.6 核心示例拒绝分区键中的伪类型、支持排序规则的分区键缺少派生排序规则,以及同一表存在多个主键。

诊断

根据完整消息确定表和列。检查分区键的 pg_attribute/pg_type,确认支持排序规则的类型是否有正确排序规则,并在修改 DDL 前列出现有主键约束。

处理

只修改冲突的表定义:使用受支持的具体分区键类型,在源码要求时显式添加 COLLATE,或保留一个预期主键并从迁移中删除重复声明。如果 ERROR 发生在显式事务中,修正 DDL 前先 ROLLBACK 或回滚到错误前的保存点;不要继续向已中止的事务发送表变更。

消息

固定源码中的代表性消息包括:message: partition key column %s has pseudo-type %s;message: no collation was derived for partition key column %s with collatable type %s; HINT: Use the COLLATE clause to set the collation explicitly.;message: multiple primary keys for table "%s" are not allowed。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

201 - 42P17 — 无效对象定义

PostgreSQL SQLSTATE 42P17:来源与诊断参考。

42P17 — 无效对象定义

速览

42P17invalid_object_definition)对象定义可能在继承、生成列或重写规则上冲突。

字段
SQLSTATE 42P17
条件名 invalid_object_definition
状态 有效
已知存在于 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_INVALID_OBJECT_DEFINITION
别名

含义

对象定义校验覆盖对象关系以及生成列/规则定义。选定路径拒绝继承约束冲突、生成列引用另一个生成列,以及规则递归。

诊断

按消息中点名的对象分类:关系继承、生成列表达式,还是重写规则。检查 pg_inherits 与父子约束定义/继承标志、完整生成表达式或 pg_rewrite 规则;这些路径的修复方式不同。

处理

对于继承约束冲突,比较父子定义和继承标志,并按预期继承契约对齐;不要一概删除继承约束。让生成列表达式只依赖允许的基础列,或打破重写规则环。重试 DDL 前重新检查对象图;仅重命名不能修复递归规则。如果 ERROR 发生在显式事务中,下一次 DDL 前先 ROLLBACK 或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: constraint "%s" conflicts with non-inherited constraint on relation "%s";message: cannot use generated column "%s" in column generation expression; DETAIL: A generated column cannot reference another generated column.;message: infinite recursion detected in rules for relation "%s"。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

202 - 42P18 — 无法确定数据类型

PostgreSQL SQLSTATE 42P18:来源与诊断参考。

42P18 — 无法确定数据类型

速览

42P18indeterminate_datatype)表达式或协议参数没有确定类型时,类型推断会失败。

字段
SQLSTATE 42P18
条件名 indeterminate_datatype
状态 有效
已知存在于 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_INDETERMINATE_DATATYPE
别名

含义

解析器无法为表达式或协议参数确定唯一类型。18.6 核心明确报告空 ARRAY[]pg_analyze_and_rewrite_varparams 还会在最后检查每个仍为 InvalidOidUNKNOWNOID 的参数,例如没有任何上下文约束的 $1。这不同于 42P08(输入暗示了互相不兼容的类型)和 42P02(参数引用本身不存在)。

诊断

根据响应中的位置或参数编号定位问题。对于 ARRAY[],检查周围表达式并转换到预期元素类型;对于 $n,检查 Parse/扩展查询的参数类型以及应当约束它的所有上下文,再确认最后的参数类型检查能够得到 OID。客户端不发送类型 OID 时,服务器可能无法完成推断。互相冲突的推断属于 42P08;引用未声明参数属于 42P02。

处理

添加语义正确的显式转换或参数类型信息,然后确认运算符和结果列仍是预期类型。不要把所有值都转成 text 来掩盖错误,这会改变索引使用以及函数/运算符选择;确认定义修正后再重试解析或语句。如果 ERROR 发生在显式事务中,发送修正语句前先 ROLLBACK 或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: cannot determine type of empty array; HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[].;message: could not determine data type of parameter $%d。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

203 - 42P19 — 无效递归

PostgreSQL SQLSTATE 42P19:来源与诊断参考。

42P19 — 无效递归

速览

42P19invalid_recursion)递归项运行前会先检查递归查询结构。

字段
SQLSTATE 42P19
条件名 invalid_recursion
状态 有效
已知存在于 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_RECURSION
别名

含义

递归查询校验会拒绝无法安全求值的递归项。18.6 核心检查递归项中使用聚合、非递归项 UNION [ALL] 递归项这一必要结构,以及递归引用的上下文和次数。选定的聚合 guard 针对的是聚合(p_hasAggs);不能据此说所有窗口函数都被禁止。

诊断

检查查询结构,而不只是 CTE 名称。分开锚点项与递归项,统计递归查询的引用次数,并检查引用是否出现在子查询或外连接的可空侧:LEFT JOIN 是右侧,RIGHT JOIN 是左侧,FULL JOIN 是两侧;单侧外连接的保留侧不受该 guard 限制。还要检查 INTERSECT/EXCEPT 上下文。找出递归项中的实际聚合,不要把所有窗口表达式都归入此错误。这能把结构性递归错误与 42P18 类型推断失败区分开。

处理

将 CTE 改写为一个非递归锚点项,后接一个 UNIONUNION ALL 递归项,只在允许的上下文中保留一次递归引用;需要聚合时移到递归步骤之外。重试前验证终止条件和结果基数。如果 ERROR 发生在显式事务中,发送重写后的查询前先 ROLLBACK 或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: aggregate functions are not allowed in a recursive query's recursive term;message: recursive query "%s" does not have the form non-recursive-term UNION [ALL] recursive-term;message: recursive reference to query "%s" must not appear more than once。占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 8.4.0;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

204 - 42P20 — 窗口函数错误

PostgreSQL SQLSTATE 42P20:来源与诊断参考。

42P20 — 窗口函数错误

速览

42P20windowing_error)窗口定义同时约束函数调用和框架边界。

字段
SQLSTATE 42P20
条件名 windowing_error
状态 有效
已知存在于 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_WINDOWING_ERROR
别名

含义

固定核心在窗口函数放置或嵌套错误,以及窗口定义结构无效时使用 42P20。解析器语法拒绝不可能的框架起止组合;解析分析拒绝在不能包含窗口函数的子句中使用窗口函数,或把一个窗口函数放入另一个窗口函数;命名窗口转换则拒绝冲突的继承方式。合法框架对某一行仍可能为空,所以结果为空本身不是 42P20 信号。

诊断

先按 primary 消息分类,再改 SQL。框架消息指向 UNBOUNDED 方向或起止顺序;带 offset 的 RANGE 必须有且只有一个 ORDER BY 列,GROUPS 必须有 ORDER BY。放置消息会指出 WHEREGROUP BYJOINRETURNING 或窗口定义等子句;嵌套调用消息表示一个窗口表达式出现在另一个窗口表达式内部。命名窗口消息分别表示重复定义、覆盖所复制窗口的 PARTITION BYORDER BY,以及复制已经带框架的窗口;因此 OVER fooOVER (foo) 的继承行为不同。执行器会把负的 ROWSGROUPS 框架 offset 报为 SQLSTATE 22013invalid_preceding_or_following_size),把 NULL offset 报为 22004;这些不是 42P20

处理

把嵌套计算移到外层查询,或把窗口表达式移出消息指出的命名子句。只修复对应的框架语法,为 RANGE/GROUPS 补上所需排序,并定义一个没有冲突覆盖的命名窗口。不要因为某一当前行的框架没有行就改动本来合法的框架。如果该 ERROR 发生在显式事务中,重试前先执行 ROLLBACK,或回滚到语句前建立的保存点;自动提交模式下,失败语句返回空闲后即可提交修正查询。

消息

固定源码中的代表性消息包括:

  • ERROR message: window function calls cannot be nested
  • ERROR message: frame start cannot be UNBOUNDED FOLLOWING
  • ERROR message: frame starting from following row cannot end with current row
  • ERROR message: frame end cannot be UNBOUNDED PRECEDING
  • ERROR message: frame starting from current row cannot have preceding rows
  • ERROR message: frame starting from following row cannot have preceding rows
  • ERROR message: window functions are not allowed in %s
  • ERROR message: window "%s" is already defined
  • ERROR message: cannot override PARTITION BY clause of window "%s"
  • ERROR message: cannot override ORDER BY clause of window "%s"
  • ERROR message: cannot copy window "%s" because it has a frame clause
  • ERROR message: cannot copy window "%s" because it has a frame clause; HINT: Omit the parentheses in this OVER clause.
  • ERROR message: RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column
  • ERROR message: GROUPS mode requires an ORDER BY clause

占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 8.4.0;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

205 - 42P21 — 排序规则不匹配

PostgreSQL SQLSTATE 42P21:来源与诊断参考。

42P21 — 排序规则不匹配

速览

42P21collation_mismatch)需要得到兼容结果时,不同排序规则选择可能发生冲突。

字段
SQLSTATE 42P21
条件名 collation_mismatch
状态 有效
已知存在于 9.1.0
锁定快照 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_COLLATION_MISMATCH
别名

含义

当固定源码路径需要一个兼容的排序规则,却得到不兼容的选择时,会报 42P21。隐式选择会先记录为 COLLATE_CONFLICT;调用方允许没有共同排序规则时可以返回 InvalidOid,只有确实需要排序规则的调用方才把隐式冲突变成 ERROR。显式 COLLATE 冲突则立即失败。同一条件还覆盖递归 CTE 输出、继承或子表列定义,以及外键键列兼容性。

诊断

遇到隐式排序规则消息时保留两个名称,并检查调用方是否要求共同排序规则;不同的隐式操作数不会全部立即抛出 42P21。遇到显式排序规则消息时,找出两个 COLLATE 子句并统一预期选择。递归查询要比较非递归项与整体列排序规则。继承或分区子表错误要比较父表与子表列定义。外键要比较引用表和被引用表的键列:固定源码允许两边都是确定性排序规则时使用不同排序规则;只要任一排序规则不确定,两边就必须相同。保留 DETAIL 中的名称,不要把它笼统当成转成 text 就能解决的问题。

处理

表达式冲突应在表达式边界明确指定一个有意选择的 COLLATE,或统一显式子句及递归非递归项的排序规则。重试 DDL 前先对齐继承列或子表列定义。外键应选择兼容的键列排序规则;只要一侧不确定,就满足两边相同的严格要求,然后重新核对相等比较和索引语义。如果该 ERROR 发生在显式事务中,修正语句前先 ROLLBACK,或回滚到错误前的保存点;自动提交模式下连接回到空闲后再重试。

消息

固定源码中的代表性消息包括:

  • ERROR message: collation mismatch between implicit collations "%s" and "%s"; HINT: You can choose the collation by applying the COLLATE clause to one or both expressions.
  • ERROR message: collation mismatch between explicit collations "%s" and "%s"
  • ERROR message: recursive query "%s" column %d has collation "%s" in non-recursive term but collation "%s" overall; HINT: Use the COLLATE clause to set the collation of the non-recursive term.
  • ERROR message: column "%s" has a collation conflict; DETAIL: "%s" versus "%s"
  • ERROR message: inherited column "%s" has a collation conflict; DETAIL: "%s" versus "%s"
  • ERROR message: child table "%s" has different collation for column "%s"; DETAIL: "%s" versus "%s"
  • ERROR message: foreign key constraint "%s" cannot be implemented; DETAIL: Key columns "%s" of the referencing table and "%s" of the referenced table have incompatible collations: "%s" and "%s". If either collation is nondeterministic, then both collations have to be the same.

占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 9.1.0;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

206 - 42P22 — 无法确定排序规则

PostgreSQL SQLSTATE 42P22:来源与诊断参考。

42P22 — 无法确定排序规则

速览

42P22indeterminate_collation)需要唯一排序规则的操作没有明确可用的排序规则。

字段
SQLSTATE 42P22
条件名 indeterminate_collation
状态 有效
已知存在于 9.1.0
锁定快照 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_INDETERMINATE_COLLATION
别名

含义

当选定操作需要可用的排序规则,但推导结果为空(通常表现为 InvalidOid)时,会报 42P22。这与 42P21 不同:这里的调用方消息指出无法继续的具体操作,而不是列出两个显式排序规则名称。固定核心调用方包括字符串哈希或比较、索引和分区表达式、CTAS 与视图输出列、正则表达式、LIKE/ILIKE 以及格式化函数。

诊断

先读取 primary 消息指出的操作,再追踪字符串表达式到应当选择排序规则的边界。哈希或比较消息指向运算符或值表达式;索引或分区消息指向定义表达式;CTAS 或视图列消息指向输出列;正则、LIKEILIKE 消息指向模式操作数;%s function 消息会指出格式化函数。固定调用方提供相同的 HINT:Use the COLLATE clause to set the collation explicitly.。应在表达式或声明列的语义边界做明确选择,并把这种缺少排序规则的要求与 42P21 中已知选择之间的冲突区分开。

处理

在真正拥有语义选择的表达式或输出列边界添加 COLLATE,必要时重建受影响的索引、分区、视图或 CTAS 定义。在该排序规则下核对比较、哈希、模式、正则和格式化行为;不要为了消除一个调用方错误而全局修改数据库 locale。如果该 ERROR 发生在显式事务中,重试前先 ROLLBACK,或回滚到错误前的保存点;自动提交模式下,连接返回空闲后即可提交修正语句。

消息

固定源码中的代表性消息包括:

  • ERROR message: could not determine which collation to use for string hashing; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: no collation was derived for column "%s" with collatable type %s; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for index expression; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for partition expression; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for view column "%s"; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for regular expression; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for %s function; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for LIKE; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for ILIKE; HINT: Use the COLLATE clause to set the collation explicitly.
  • ERROR message: could not determine which collation to use for string comparison; HINT: Use the COLLATE clause to set the collation explicitly.

占位符由实际对象、列或参数填充。

版本

锁定目录显示该条件最早见于 PostgreSQL 9.1.0;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据

207 - 44000 — with_check_option_violation(WITH CHECK OPTION 违规)

PostgreSQL SQLSTATE 44000:视图 WITH CHECK OPTION 的诊断与修复。

44000 — with_check_option_violation(WITH CHECK OPTION 违规)

速览

44000 表示通过视图写入的行不满足该视图的 WITH CHECK OPTION 谓词。它保护的是视图写入不变量,不是表级 CHECK 对应的 23514

字段
SQLSTATE 44000
条件名 with_check_option_violation
状态 有效
已知存在于 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_WITH_CHECK_OPTION_VIOLATION
别名

含义

可自动更新的视图声明 WITH CHECK OPTION 后,PostgreSQL 会检查插入或更新后的行是否仍能通过该视图看到。执行器把视图谓词的 FALSENULL 都视为失败,因此可空谓词列的未知结果也不能通过。ExecWithCheckOptions 报告 new row violates check option for view "%s";只有权限允许描述该行时才附带动态失败行 DETAIL。LOCAL 只检查当前视图直接定义的条件;底层视图条件不会检查,除非那些底层视图也指定了 CHECK OPTIONCASCADED 检查当前视图以及所有底层视图条件。CHECK OPTION 只支持没有 INSTEAD OF 触发器或规则的自动可更新视图;底层可由触发器更新的视图和 INSTEAD 重写都是独立边界,级联检查可能在这些边界停止或全部被忽略。选定自然案例使用的是直接可更新视图。

诊断

保存 SQLSTATE、视图名称、存在时的 DETAIL,以及通过视图发送的实际行值。用 pg_get_viewdef() 查看定义,并按 SQL 三值逻辑计算谓词:只有 TRUE 可见,FALSENULL 都会失败。确认视图是否自动可更新、使用的是 LOCAL 还是 CASCADED,以及底层视图是否有 INSTEAD OF 触发器或 INSTEAD 重写。不要只搜索表 CHECK 约束:LOCAL 不检查普通底层视图谓词,而 CASCADED 会检查这些谓词,除非遇到可由触发器更新或被重写的边界。缺少 DETAIL 可能是权限边界,不能据此判断没有进行行检查。

处理

让行的谓词结果为 TRUE;只有确认模式契约和 LOCAL/CASCADED 范围后才修改视图定义。如果视图是受保护的过滤写入接口,应保留 check option。如果涉及底层触发器可更新的视图或 INSTEAD 重写,应检查该边界及其实际生效的检查,不要假定级联检查已经到达那里。选定自动提交案例的错误后连接仍为 IDLE;若在显式事务中发生,则先回滚失败块,再用合法行重试。

报文

固定源码模板是 new row violates check option for view "%s"Failing row contains %s.。视图名称和行渲染都是动态值。DETAIL 是诊断数据,解析器必须考虑用户值和格式变化。

代表案例

共享 registry verify/cases/44000/snippets.json(SHA-256 7b227bca904c860388c6cf1f5b7f551412b4d67832fb91aaa682f4126072e41c)创建过滤视图,先尝试谓词外的行,再插入合法行。见公开案例导出结构化证据

CREATE TABLE items(id integer PRIMARY KEY, visible boolean NOT NULL, note text NOT NULL);
CREATE VIEW visible_items AS SELECT id, visible, note FROM items WHERE visible WITH CHECK OPTION;
INSERT INTO visible_items VALUES (1, false, 'hidden');
INSERT INTO visible_items VALUES (1, true, 'visible');
SELECT id, visible, note FROM visible_items ORDER BY id;

运行器会在私有 schema 中限定 registry 的表名。它断言服务器自然产生的 SQLSTATE 和视图诊断,并核对只有可见行被接受。

选定案例在 PostgreSQL 18.6 和 10.21 通过带 WITH CHECK OPTION 的视图插入 visible = false 行时观察到 44000。DETAIL 给出失败行;自动提交连接保持 IDLE,满足谓词的行随后插入成功。

版本

锁定目录从早期历史边界到正式快照都记录了该条件。固定源码在 18.6 和 10.23 都包含同一机制;选定运行只覆盖 18.6 与 10.21 的简单视图插入,不涵盖所有视图规则组合。

可对照表 CHECK 的23514 检查约束违规和触发器驱动的27000 触发的数据更改违规

来源

  • src.errcodes.18.6(SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • src.execMain.18.6(SHA-256 33b97337fa23a649c5e7a092e1bd405a54e8503529236c62c9d5bb93a1774a8d
  • CREATE VIEW 官方文档 · 本地调用扫描 src.calls.REL_18_6(SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

208 - 53000 — insufficient_resources

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

53000

速览

53000 是宽泛的资源不足条件。固定调用者包括后台 worker 启动、本地缓冲区耗尽和文件描述符限制,因此必须结合消息和启动/运行阶段确定资源。

字段
SQLSTATE 53000
条件名 insufficient_resources
状态 有效
已知存在于 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_INSUFFICIENT_RESOURCES
别名

含义

类别码本身不指向某个参数:could not register background process 指向 worker 容量,no empty local buffer available 指向本地缓冲区,文件描述符变体则分别报告启动最小值或进程分配上限。

诊断

记录 primary、detail/hint、阶段和服务器日志。启动失败时比较进程限制与 worker 配置;运行中则先判断是本地缓冲区、描述符、worker 槽位还是其他固定资源。

处理

按消息指出的资源在平台和 PostgreSQL 限制内释放或调整,清理不用的描述符/worker 后验证配置。显式事务中若发生 ERROR,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在指定资源可用后才能重试。服务器进程描述符检查等启动 FATAL 路径没有客户端事务可恢复。未定位资源前不要泛化为重启或改内存。

版本

锁定目录从 7.4 记录;引用调用者来自 PostgreSQL 18.6 源码,未在主机制造资源耗尽。

534005400153200

来源

contrib/pg_prewarm/autoprewarm.c#L943-L981

src/backend/storage/buffer/localbuf.c#L270-L272

src/backend/storage/file/fd.c#L1072-L1078

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

209 - 53100 — disk_full

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

53100

速览

53100 表示文件写入进入明确的短写分支。固定路径覆盖基础备份输出和关系文件扩展;诊断会给出文件、已写/请求字节以及 offset 或 block。

字段
SQLSTATE 53100
条件名 disk_full
状态 有效
已知存在于 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_DISK_FULL
别名

含义

短写消息给出目标文件、已写/请求字节以及 offset 或 block,并提示 Check free disk space.。同一个 md.c 函数先把负的 FileWrite 结果交给 errcode_for_file_access()%m;固定 helper 的 saved-errno 分支把 ENOSPC 映射为 53100,但没有列出 EFBIGEDQUOT,它们会走 ERRCODE_INTERNAL_ERROR 默认分支。这是存储写入边界,不是普通 SQL 数据错误,也不能据此断言宿主卷已满。

诊断

按消息定位文件系统和路径,检查空间、配额、挂载状态、写入错误及受影响的数据库或备份卷,再把 offset/block 和部分字节数与操作及服务器日志对应。若 primary 是 could not ...: %m 而不是短写模板,应检查保存的 errno:固定 helper 把 ENOSPC 映射为 53100,但未列出的 EFBIGEDQUOT 会进入其 internal-error 默认分支。不能把 errno 对应的其他 SQLSTATE 重新标成 53100。

处理

在指定文件系统释放或增加容量、修复报告的写入条件,或改用合适目标。部分基础备份或关系写入在验证前都应视为不完整;按该操作的恢复流程处理。显式事务中若发生此 ERROR,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在存储原因修复后才能重试。不要在用户实例制造磁盘压力。

版本

锁定目录从 7.4 记录;引用写入路径来自 PostgreSQL 18.6,未执行磁盘满运行。

53000

来源

src/backend/backup/basebackup_server.c#L177-L182

src/backend/storage/smgr/md.c#L521-L526

src/backend/storage/smgr/md.c#L512-L526

src/backend/utils/error/elog.c#L868-L938

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

210 - 53200 — out_of_memory

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

53200

速览

53200 是 PostgreSQL 的内存不足条件。固定调用者包括普通 memory context 分配、共享内存和锁表容量、扩展/统计文件读取以及 WAL 读取处理器;应诊断具体操作和分配上下文,不能把所有内存失败归为一个原因。

字段
SQLSTATE 53200
条件名 out_of_memory
状态 有效
已知存在于 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_OUT_OF_MEMORY
别名

含义

固定源码有几类不同边界:MemoryContextAllocationFailure 报告带请求大小和 memory context 名称的 out of memoryShmemAlloc 和锁表建立路径报告 out of shared memory,后者可能提示 max_locks_per_transaction。扩展路径把操作写入 detail:pg_stat_statementsout of memory 记录文件读取分配失败,WAL reader 也以相同 primary 搭配分配 detail。pg_stat_statements 这一分支的 severity 是 LOG,并从加载器返回,因此不等同于使客户端当前事务中止的 ERROR;核心和 WAL reader 的 ERROR 分支才需要正常事务恢复。两阶段事务源码路径实际是 WAL reader 分配路径,不能据此说达到 max_prepared_transactions 本身就发出 53200。

诊断

保留 severity、primary、detail、hint、操作、backend 和服务器日志,判断是在 backend memory context、共享内存/锁表、文件/统计结构还是 WAL reader 分配。若 primary 为 out of shared memory 且 hint 指向 max_locks_per_transaction,检查持锁事务与锁表配置;提高它会在启动时消耗共享内存。不要只凭 SQLSTATE 推断主机内存。

处理

确认平台限制和影响后,再降低或重塑操作、释放应用压力或调整消息指向的容量。先结束或回滚持有过多锁的事务,再考虑调整 max_locks_per_transaction;该 hint 不等于操作系统 OOM。文件/WAL/统计操作失败后先验证对象。核心/WAL reader 的 ERROR 会使显式事务失败,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在分配原因修复后才能重试。pg_stat_statementsLOG 分支属于后台加载器,本身不要求客户端恢复事务。本页不在真实主机制造 OOM。

版本

锁定目录从 7.4 记录;引用扩展和核心路径来自 PostgreSQL 18.6,未执行 OOM 运行。

530005340055000

来源

contrib/pg_stat_statements/pg_stat_statements.c#L2340-L2350

contrib/pg_walinspect/pg_walinspect.c#L121-L124

src/backend/access/transam/twophase.c#L1417-L1420

src/backend/utils/mmgr/aset.c#L444-L453

src/backend/utils/mmgr/mcxt.c#L1157-L1167

src/backend/storage/ipc/shmem.c#L151-L162

src/backend/storage/lmgr/lock.c#L2957-L2969

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

211 - 53300 — too_many_connections(连接数过多)

当连接容量已耗尽、无法接纳新连接时,PostgreSQL 会报告 SQLSTATE 53300。应定位角色、数据库或服务器的容量限制,并在恢复容量后验证新的连接。

速览

53300 是 PostgreSQL 类别 53 insufficient_resources 中的 too_many_connections 条件。新后端因为某个连接容量限制已经达到而无法接纳时,会产生这个代码。代表性案例把一个角色的连接数限制设为 1,再为该角色打开第二个会话。

这是连接启动阶段的失败。被拒绝的会话没有打开 SQL 事务。最终运行中,psycopg 返回了启动异常文本,但暴露的 sqlstateNone;PostgreSQL collector 记录了服务器实际发送的 FATAL SQLSTATE 53300。诊断连接池或认证网关时必须分开记录这两种观察。

案例 role_connection_limit 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 目标上均通过。run ID 和逐案例断言保存在公开证据 JSON中。

字段
SQLSTATE 53300
条件名 too_many_connections
状态 有效
已知存在于 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_TOO_MANY_CONNECTIONS
别名

含义与触发路径

后端启动时,PostgreSQL 在认证角色后检查该角色的 rolconnlimit。对于连接限制为非负数且不是超级用户的角色,如果连接数超过限制,服务器会使用 ERRCODE_TOO_MANY_CONNECTIONS 报告 FATAL,主报文为 too many connections for role "%s"。源码注释说明并发启动可能竞争,因此角色计数的限制检查是近似的。

同一个 SQLSTATE 也可能表示其他容量路径,例如服务器范围的客户端限制。本页的角色限制案例不能说明每一次 53300 的根因;应结合主报文、collector 字段,以及角色、数据库和服务器配置来分类。

失败发生在 SQL 协议进入事务之前,因此被拒绝的会话没有 INERRORIDLE 这样的事务状态。仍保持打开的管理连接或池连接可以调整限制,再用新的会话证明恢复。

报文与诊断

下面的可执行摘录与 runner 使用相同的角色限制 SQL。隔离运行中 limited_user 会替换成临时角色。第二个连接是独立的客户端启动操作,因此在 SQL 语句之间说明,而不是伪造一条 SQL 来代表它。

ALTER ROLE limited_user CONNECTION LIMIT 1;
-- 保持一个 limited_user 会话处于打开状态。
-- 再以 limited_user 打开第二个会话:启动阶段返回 FATAL 53300。
ALTER ROLE limited_user CONNECTION LIMIT -1;
SELECT 1;

最新目标的 collector 记录形状为:

SQLSTATE: 53300                 # csvlog/jsonlog sql_state_code
severity: FATAL
message_primary: too many connections for role "<generated-role>"
source: miscinit.c / InitializeSessionUserId / line 880
driver startup sqlstate: null
transaction: none opened
repair: reset CONNECTION LIMIT; fresh role connection SELECT 1 -> 1

PostgreSQL 10.21 的 collector 产生相同的报文和 SQLSTATE,源码位置为 miscinit.c:575。两个目标都在恢复限制后成功建立已知角色的新连接。上面的角色名和端口是运行时生成值;collector 的 sql_state_code 才是服务器证据。具体驱动在启动错误上可能不提供 SQLSTATE 属性。

诊断

记录不含密码的连接参数、角色和数据库、服务器版本、启动异常原文,以及按时间、用户和连接来源关联的 collector 记录。检查 pg_roles.rolconnlimit、数据库和服务器连接配置以及当前后端数量。连接池可能耗尽角色限制,而服务器仍有全局容量。

角色计数在突发并发启动下应当作为容量观察,而非精确的接纳证明;PostgreSQL 已在源码中说明这一检查是近似的。先根据主报文定位限制,再决定调整哪个配置,并保留管理通道用于恢复。

不要对被拒绝的会话执行事务清理命令,它从未进入可用的 SQL 事务。仍存活的所有者或管理连接可以恢复配置;有意义的修复断言是受影响角色建立新的连接并执行真实查询。

处理与修复

  • 限制连接池大小和并发连接创建,避免角色连接数反复耗尽。
  • 检查内存、工作负载和接纳策略后,再决定是否提高角色、数据库或服务器容量。
  • 为恢复保留管理容量和受控的管理连接;不要仅为绕过限制而授予超级用户权限。
  • 修改限制后,用新连接执行无害查询。清理池状态和陈旧会话,再重试应用工作。

代表性修复恢复了临时角色的限制,建立了新的角色连接,并观察到 SELECT 1 返回 1。这证明了角色限制路径的恢复,不能替代对其他数据库级或服务器级容量故障的验证。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 53300,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。9.0 头文件和 9.1 文本定义之间的类别标题变化已记录在目录中;它不是该条件实现发生变化的断言。

角色限制案例在 PostgreSQL 18.6 和 10.21 上通过。源码行号不同,驱动与 collector 的差异也是实测边界。数据库级、服务器级容量路径、连接池行为和操作系统资源耗尽需要独立证据。

28P01invalid_password 是另一个没有 SQL 事务的连接启动失败。57014query_canceled 是会话建立后发生的语句中断。42P01undefined_table 是连接建立后的 SQL 名称解析错误。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留 collector 输出、驱动观察、两个目标 ID 和结构化观察。

212 - 53400 — configuration_limit_exceeded

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

53400

速览

53400 表示配置或有限 process slot 已耗尽。固定路径覆盖后台 worker、逻辑复制 worker 和 replication-origin 状态槽位。

字段
SQLSTATE 53400
条件名 configuration_limit_exceeded
状态 有效
已知存在于 9.2.0
锁定快照 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_CONFIGURATION_LIMIT_EXCEEDED
别名

含义

源码区分后台 worker 过多、没有 autovacuum/background worker 槽位、逻辑复制 worker 槽位耗尽以及 replication-origin 状态限制;可确定参数时 hint 会指向它。

诊断

保留组件和参数,检查 worker 数、活动复制、origin ID、slot 及服务器日志;将 worker 槽位与通用资源不足 53000、语句复杂度限制 54001 区分。

处理

释放正常占用槽位或在确认进程与内存容量后提高指定配置,按常规 reload/restart 流程验证组件能启动。这些 worker、launcher 和 replication-origin 路径可能运行在后台 backend,而不是客户端事务中;若 ERROR 到达显式客户端事务,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT,自动提交只有在槽位原因修复后才能重试。不要为制造错误而创建 worker。

版本

锁定目录从 9.2.0 记录;引用路径来自 PostgreSQL 18.6,未执行槽位耗尽运行。

530005500054001

来源

src/backend/postmaster/bgworker.c#L1002-L1009

src/backend/replication/logical/launcher.c#L435-L438

src/backend/replication/logical/origin.c#L976-L980

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

213 - 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

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

214 - 54001 — statement_too_complex

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

54001

速览

54001 覆盖超过规划器、解析器或执行栈限制的语句。固定路径包括 4096 个 grouping set 上限和 max_stack_depth 检查。

字段
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
别名

含义

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

诊断

保留消息和阶段:grouping sets 应统计生成数量并简化查询;stack depth 应检查递归 SQL/函数展开,并在改设置前比较平台栈限制。

处理

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

版本

锁定目录从 7.4 记录;引用解析器和栈深度路径来自 PostgreSQL 18.6,未强制触发限制。

540005401142601

来源

src/backend/parser/parse_agg.c#L1166-L1172

src/backend/utils/misc/stack_depth.c#L100-L105

src/backend/utils/misc/stack_depth.c#L156-L168

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

215 - 54011 — too_many_columns

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

54011

速览

54011 表示物理 tuple descriptor 或相关对象定义超过固定列数上限。源码路径决定计数对象是表属性、索引键加 INCLUDE 列、分区键、统计维度还是产生行的定义。

字段
SQLSTATE 54011
条件名 too_many_columns
状态 有效
已知存在于 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_TOO_MANY_COLUMNS
别名

含义

固定消息包括实际/上限列数、表最多列数、索引最多列数、分区键上限和统计专用变体。表计数使用物理属性号:已删除列仍占 tuple descriptor 槽位,所以可见列数可能低于 relnatts。索引键与 INCLUDE、分区键和统计维度各有独立上限,虽然都使用此 SQLSTATE。

锁定的 18.6 构建中,相关常量分别是用户表属性 MaxHeapAttributeNumber = 1600、tuple 属性 MaxTupleAttributeNumber = 1664INDEX_MAX_KEYS = 32PARTITION_MAX_KEYS = 32 以及 STATS_MAX_DIMENSIONS = 8。这些数值属于不同 guard;服务器诊断中的实际 count 和 limit 字段仍是判断依据。

诊断

从消息和上下文读取对象类型、实际数、上限和 DDL 操作。表或继承表要检查 pg_class.relnatts 与包含 attisdroppedpg_attribute,不能只数可见列名。索引 DDL 要把 INCLUDE 列算入,分区和 extended statistics 则检查各自的键/维度数;FROM 中函数的 column definition list 也有 54011 的行形状上限。

处理

减少或拆分对象定义,改用其他索引/分区设计,或把派生数据移到关联表。若原因是 dropped 的物理槽位,再删除可见列并不会回收它们;普通物理重写(如 VACUUM FULLCLUSTER)也会在 tuple descriptor 中保留这些 dropped attribute。应新建具有目标逻辑列布局的表,在保留依赖的前提下迁移数据,再有选择地减少索引键/INCLUDE 列或统计维度并验证 DDL。显式事务中若发生 ERROR,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在 schema 变更真正消除上限后才能重试。

版本

锁定目录从 7.4 记录;引用 heap、index、table、partition、statistics 和 row-shape 路径来自 PostgreSQL 18.6,未创建超大 schema。

540005402354001

来源

src/backend/access/common/heaptuple.c#L1131-L1134

src/backend/access/common/indextuple.c#L87-L90

src/backend/catalog/heap.c#L461-L464

src/backend/commands/tablecmds.c#L2567-L2582

src/backend/commands/indexcmds.c#L640-L664

src/backend/commands/statscmds.c#L215-L224

src/backend/parser/parse_relation.c#L1935-L1946

src/include/access/htup_details.h#L34-L48

src/include/pg_config_manual.h#L63-L74

src/include/statistics/statistics.h#L19

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

216 - 54023 — too_many_arguments

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

54023

速览

54023 是函数、过程、聚合和返回集合调用的参数数量上限。固定路径保护 catalog 数组、parser 节点和 executor FunctionCallInfo 存储,并按单复数报告编译时实际限制。

字段
SQLSTATE 54023
条件名 too_many_arguments
状态 有效
已知存在于 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_TOO_MANY_ARGUMENTS
别名

含义

固定构建在 pg_config_manual.h 中把 FUNC_MAX_ARGS 定义为 100;源码说明实际可行上限约为 600,修改它需要完整重编 backend(包括 C 函数)。函数定义统计输入参数,明确不统计 output 参数。聚合定义和聚合调用使用 FUNC_MAX_ARGS - 1,为 transition/final function 保留可表示空间。函数/过程 parser 与 executor guard 还覆盖显式参数、默认参数、SRF 和保存的 window expression。调用者和对象类型决定修复。

报文

源码路径 精确 primary 模板(单数 / 复数) %d 的计数上限
pg_proc.c 函数定义 functions cannot have more than %d argument / functions cannot have more than %d arguments parameterCount(input 参数数组长度,不含 output 参数)与 FUNC_MAX_ARGS 比较;%d 传入 FUNC_MAX_ARGS(100)
functioncmds.c 过程调用 cannot pass more than %d argument to a procedure / cannot pass more than %d arguments to a procedure nargs = list_length(fexpr->args)FUNC_MAX_ARGS 比较;%d 传入 FUNC_MAX_ARGS
parse_func.cexecExpr.cexecSRF.cnodeWindowAgg.c 函数/SRF/window 调用 cannot pass more than %d argument to a function / cannot pass more than %d arguments to a function list_length(fargs)nargslist_length(sexpr->args)perfuncstate->numArgumentsFUNC_MAX_ARGS 比较;%d 传入 FUNC_MAX_ARGS
pg_aggregate.c 聚合定义/调用 aggregates cannot have more than %d argument / aggregates cannot have more than %d arguments numArgsFUNC_MAX_ARGS - 1 比较;%d 传入 99,为 transition/final function 预留槽位

这些是 errmsg_plural 分组,客户端应保留服务器的单复数渲染和实际上限,不要只搜索一条手写字符串。

诊断

先确认是在 CREATE/定义阶段还是调用阶段,以及对象是函数、过程、聚合、SRF 还是 window aggregate。统计显式参数和 parser 展开的默认参数;聚合使用更严格的 FUNC_MAX_ARGS - 1 边界。保留消息的单复数 primary 与上限,并检查 stored view/plan 是否由不同 FUNC_MAX_ARGS 的二进制建立。

处理

减少参数,把相关值组合为复合/record 类型,或重设计函数边界。修改过程或聚合签名时同步依赖调用者;不要静默丢弃参数、把 output 参数当 input 计数,也不要假设聚合和普通函数共用同一上限。修改 FUNC_MAX_ARGS 是构建级兼容决策,不是会话参数。显式事务中若发生 ERROR,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在定义或调用已改到固定计数以内后才能重试。

版本

锁定目录从 7.4 记录;引用 macro、catalog、parser、executor、aggregate 和 SRF 路径来自 PostgreSQL 18.6,未创建超大签名或调用。

540115400042883

来源

src/backend/catalog/pg_proc.c#L156-L161

src/backend/commands/functioncmds.c#L2261-L2266

src/backend/executor/execExpr.c#L2727-L2732

src/backend/executor/execSRF.c#L716-L721

src/include/pg_config_manual.h#L31-L43

src/backend/catalog/pg_aggregate.c#L121-L132

src/backend/parser/parse_func.c#L129-L142

src/backend/executor/nodeWindowAgg.c#L1042-L1054

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

217 - 55000 — 对象未处于前置状态

PostgreSQL SQLSTATE 55000(对象未处于前置状态,object_not_in_prerequisite_state)的源码证据、诊断与处理参考。

55000 — 对象未处于前置状态

速览

55000 表示请求的操作缺少某个必要的对象或服务器状态。本页选择 currval 所需的会话级序列前提;预加载、恢复和无效索引是不同机制。

字段
SQLSTATE 55000
条件名 object_not_in_prerequisite_state
状态 有效
已知存在于 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_OBJECT_NOT_IN_PREREQUISITE_STATE
别名

含义

currval 按后端会话记录状态。创建序列,或在另一个会话调用 nextval,都不会初始化当前会话。固定序列模板为 currval of sequence "%s" is not yet defined in this session,严重级别为 ERROR

其他固定的 55000 路径有不同前提:pg_stat_statementspg_stat_statements must be loaded via "shared_preload_libraries",应按正常配置流程加入启动参数并重启服务;pg_surgeryrecovery is in progress,detail 为 Heap surgery functions cannot be executed during recovery.,应等待恢复完成,或在合适的可写 primary 上执行;pgstattupleindex "%s" is not valid,应先检查索引,并按适当的 REINDEX 或迁移流程重建后再调用。它们都是对象或服务器状态检查,不是权限错误,也不能与会话级序列案例互相替代。

诊断

先确认对象状态以及对象所属的后端会话。对本路径,确认序列并检查这个 backend 是否调用过 nextval;连接池中另一个连接调用过也不满足当前会话前提。在显式事务中,失败的 currval 会使事务中止,因此修复前要执行 ROLLBACKROLLBACK TO SAVEPOINT。其他 55000 路径还要检查恢复状态、预加载设置、索引有效性或对象自身前提。

处理

在同一 backend 先调用 nextval 再调用 currval;如果业务契约如此设计,也可以传入明确已知的值。自动提交时失败语句的事务已结束,可以重新发起下一条语句;显式事务中则先回滚或回滚到保存点,再调用 nextval。不要把它当作权限错误,也不要假设连接池中另一个连接的成功调用会初始化当前连接。

实测诊断

选定源码组为 ERROR,使用上述动态序列名模板。实测诊断中的序列名为 currval_sequence;错误后自动提交会话仍为 IDLE,同一会话随后通过 nextvalcurrval 返回 10。

代表案例

选定注册表在一个自动提交 backend 上创建序列,然后在尚未调用 nextval 时调用 currval,再用 nextval(返回 10)初始化并再次读取 currval(返回 10)。失败调用、修复和验证属于同一会话状态转换;本案例不测试连接池切换。

CREATE SEQUENCE sequence_identifier START WITH 10;
SELECT currval('sequence_regclass');
SELECT nextval('sequence_regclass');
SELECT currval('sequence_regclass')

选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据

版本

锁定目录从 7.4 起记录 55000。18.6 与 10.21 的序列会话案例均通过;这不覆盖其他 55000 分支,也不推断所有中间版本。

来源

  • src.errcodes.18.6src/backend/utils/errcodes.txt at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.currval.18.6src/backend/commands/sequence.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 3e5afe17d5a84862fae502a5481211220368f1d639e9d07ba6f96ee8be92a8d8 (source).
  • src.currval.10.23src/backend/commands/sequence.c at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 5510e1266e8d8c548a4318d753392e92e689d348f3353a2aa53d8dea871c44ab (source).
  • src.path.0contrib/pg_stat_statements/pg_stat_statements.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7shared_preload_libraries 检查(来源)。
  • src.path.1contrib/pg_surgery/heap_surgery.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7 的恢复状态检查与 detail(来源)。
  • src.path.2contrib/pgstattuple/pgstatindex.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7 的无效索引检查(来源)。
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.55000 / snippet-registry.55000 — hashes are recorded in evidence/55000.json and each selected runtime record.

218 - 55006 — 对象正在使用

PostgreSQL SQLSTATE 55006(对象正在使用,object_in_use)的源码证据、诊断与处理参考。

55006 — 对象正在使用

速览

55006 表示请求的对象操作与正在进行的使用冲突。本页选择显式事务中同一会话的活动 cursor 占用表;数据库用户、逻辑复制和待处理触发器事件是不同路径。

字段
SQLSTATE 55006
条件名 object_in_use
状态 有效
已知存在于 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_OBJECT_IN_USE
别名

含义

选定的表命令模板为 cannot %s "%s" because it is being used by active queries in this session。关系引用计数指向同一 backend 的活动 portal 或扫描,不是一般权限问题。同一个表使用检查还有当前事务排队的 AFTER trigger 分支:cannot %s "%s" because it has pending trigger events。其他 55006 报文可能指明数据库用户或逻辑复制槽等不同阻塞者。

诊断

确认对象和持有使用状态的具体会话或服务器状态。本案例检查显式事务与命名 cursor;若是待处理 trigger event,应完成或回滚排队它们的事务。遇到数据库或复制路径时,应在终止任何会话前检查 pg_stat_activity、复制槽、订阅和维护归属。当前 backend 的 cursor 与其他用户 backend 或逻辑复制槽不是同一种阻塞。

处理

回滚失败的显式事务,让事务拥有的 cursor 和待处理 trigger event 释放,再在明确的维护边界重做 DDL。数据库用户阻塞要协调持有会话,逻辑复制槽则处理订阅/slot 生命周期。不要把 CASCADE 或终止无关会话当作通用处理。

实测诊断

选定源码组为 ERROR,操作和关系名是动态字段。实测主报文为 cannot DROP TABLE "cursor_drop_table" because it is being used by active queries in this session;事务进入 INERROR,回滚后恢复为 IDLE

代表案例

注册表创建一张空表,在同一后端开启事务、声明并 FETCH 命名 cursor,再尝试 DROP TABLE;即使没有行,活动 cursor 仍会触发同会话 active-query 分支。真实 55006 后,处理程序在同一连接回滚,再次删除表并确认关系已消失。本案例不代替其他数据库用户、逻辑复制槽或待处理 AFTER-trigger event 路径。

CREATE TABLE cursor_drop_table(id integer PRIMARY KEY);
BEGIN;
DECLARE active_cursor CURSOR FOR SELECT id FROM cursor_drop_table;
FETCH active_cursor;
DROP TABLE cursor_drop_table;
ROLLBACK;
DROP TABLE cursor_drop_table;
SELECT to_regclass('cursor_drop_table_regclass')

选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据

版本

锁定目录从 7.4 起记录 55006。18.6 与 10.21 的活动 cursor DDL 案例均通过;这不代表数据库、复制或待处理触发器路径。

来源

  • src.errcodes.18.6src/backend/utils/errcodes.txt at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).
  • src.active-cursor.18.6src/backend/commands/tablecmds.c at 724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-256 422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9 (source).
  • src.pending-trigger.18.6 — 同一 tablecmds.c 检查待处理 AFTER-trigger event,并在 4439-4444 发出 cannot %s "%s" because it has pending trigger events (source)。
  • src.active-cursor.10.23src/backend/commands/tablecmds.c at 02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-256 6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c (source).
  • src.calls.REL_18_6 / src.calls.REL_10_23 — fixed call scans, SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf / 00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.
  • manifest.55006 / snippet-registry.55006 — hashes are recorded in evidence/55006.json and each selected runtime record.

219 - 55P02 — cant_change_runtime_param

PostgreSQL SQLSTATE 55P02 的来源与诊断参考。

55P02

速览

55P02 表示 PostgreSQL 因 GUC 上下文或服务器生命周期阶段不允许,而拒绝修改运行时参数。同一条件名覆盖只能重启、只能 SIGHUP、只能在 backend 启动时、内部参数以及 binary-upgrade guard 等路径。

字段
SQLSTATE 55P02
条件名 cant_change_runtime_param
状态 有效
已知存在于 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_CANT_CHANGE_RUNTIME_PARAM
别名

含义

set_config_with_handle() 使用 ereport(elevel, ...),所以客户端看到的 severity 取决于调用者:SQL SET 通常使用 ERROR,配置文件、数据库/角色设置等路径可能使用 LOGWARNING。源码先检查 GUC context:内部参数不能由普通调用者修改;PGC_POSTMASTER 参数需要重启;PGC_SIGHUP 参数在 session 中修改会报 parameter "%s" cannot be changed now;backend 或 superuser-backend 参数在连接启动后修改会报 parameter "%s" cannot be set after connection start。重启提示也用于重载时试图改变 postmaster 参数的情形,ALTER SYSTEM 还会拒绝不能写入其配置文件的参数。

pg_upgrade_support.c 另有 binary-upgrade guard:IsBinaryUpgrade 为假时,升级辅助函数报此码。这是内部管理前置条件,不是普通 pg_settings.context 判断。

消息

  • 内部参数或配置文件拒绝:primary 为 parameter "%s" cannot be changedset_config_with_handle() 的调用者提供 severity,而 ALTER SYSTEM guard 使用 ERROR。
  • 只能重启的参数:primary 为 parameter "%s" cannot be changed without restarting the server;severity 由调用者提供。
  • 在 session 中修改 SIGHUP 参数:primary 为 parameter "%s" cannot be changed now;severity 由调用者提供。
  • 连接启动后修改 backend 参数:primary 为 parameter "%s" cannot be set after connection start;severity 由调用者提供。
  • binary-upgrade 模式外调用升级 helper:primary 为 function can only be called when server is in binary upgrade mode,ERROR。

诊断

记录参数名、完整 primary message、设置来源(SET、启动选项、配置重载、数据库/角色设置、ALTER SYSTEM 或 binary-upgrade helper)及服务器阶段。检查 pg_settings.contextpending_restartsourcesourcefilepostmaster 指向重启,sighup 指向 reload,backend 指向新连接。值格式错误属于其他 SQLSTATE,不能只凭 55P02 判断。

用户发出的 SET 若以 ERROR 失败,会使显式事务进入错误状态;配置重载或后台路径可能只记录日志或发 WARNING,并不等于客户端事务被回滚,要以实际 severity 和连接状态为准。

处理

pg_settings 指示的上下文修改:只能重启的值写入配置后重启,SIGHUP 值执行 reload,backend 值在新 session 中设置,内部或 binary-upgrade 参数交给所属机制。显式事务中的 SQL SET 失败后,先执行 ROLLBACKROLLBACK TO SAVEPOINT,再继续发送命令。autocommit 下先修正生命周期或设置来源,再重试;不要盲目重复同一被拒绝的操作。转换完成后核对实际生效值。

版本

锁定目录从 7.4 记录此条件;固定源码覆盖 PostgreSQL 18.6。已知存在于 是目录边界,不等于精确实现引入版本。

55P0357P0342501

来源

src/backend/utils/misc/guc.c#L3407-3428

src/backend/utils/misc/guc.c#L3477-3512

src/backend/utils/misc/guc.c#L3550-3581

src/backend/utils/adt/pg_upgrade_support.c#L32-39

src/backend/utils/misc/guc.c#L4691-4694

结构化证据记录保存固定消息、调用者 severity 边界以及源码/运行范围。

220 - 55P03 — lock_not_available

PostgreSQL SQLSTATE 55P03 的完整来源与诊断条目。

55P03

速览

55P03 表示在当前等待策略下无法取得请求的锁。固定路径覆盖行锁、关系锁、LOCK TABLElock_timeout,以及无法取得关系锁时跳过对象的维护命令。

字段
SQLSTATE 55P03
条件名 lock_not_available
状态 有效
已知存在于 8.0.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_LOCK_NOT_AVAILABLE
别名

含义

行锁调用使用 LockWaitErrorConditionalXactLockTableWait()/ConditionalMultiXactIdWait(),立即报告 could not obtain lock on row in relation "%s"。关系锁和 LOCK TABLE 使用 ConditionalLockRelationOid(),报告关系对象变体。lock_timeout 是另一个 ERROR 路径,报 canceling statement due to lock timeout;它表示等待超过配置的 timeout,并不表示请求使用了 NOWAIT

VACUUM 和 ANALYZE 取得关系锁失败时也使用此 SQLSTATE,但它们的 ereport(elevel) 有意不提升为 ERROR:普通维护报告 WARNING,autovacuum 的 verbose 路径可能使用 LOG。命令会跳过该对象并继续,因此这类 warning 不等于事务已中止。

诊断

保留完整 primary message、severity、关系或行名、锁模式和语句。检查 pg_stat_activitypg_locks、阻塞 PID、事务时长,以及语句使用的是 NOWAITlock_timeout 还是维护命令。不要把 VACUUM/ANALYZE 跳过对象的 warning 当成 DML 失败。

已接受的行锁案例使用独立 blocker 和 autocommit contender。显式事务中的锁 ERROR 会使 session 进入 INERROR,直到 ROLLBACKROLLBACK TO SAVEPOINT;该案例的 autocommit contender 在失败后保持 IDLE

处理

协调或释放 blocker,或明确选择等待、timeout、skip 策略。显式事务中的 ERROR 后,先回滚整个事务或回到既有 savepoint,再发送 SQL,并核对已提交工作后重放。autocommit 下先改变阻塞或 timeout 条件,再按幂等规则重试语句。维护 WARNING/LOG 只需记录跳过的关系并稍后补做维护;命令没有中止事务时不要执行 ROLLBACK

实测诊断

选定注册表创建 blocker,在显式事务中持有 SELECT ... FOR UPDATE,并由 autocommit contender 发出 FOR UPDATE NOWAIT。PostgreSQL 18.6 与 10.21 均返回 ERROR / 55P03could not obtain lock on row in relation "nowait_rows";contender 保持 IDLE。blocker 回滚后,同一 contender 将 marker 更新为 repaired 并完成验证。

代表案例

以下 SQL 是带角色说明的注册表片段。setup 只执行一次,blocker 与 contender 必须使用不同会话;片段只覆盖行锁 NOWAIT,不覆盖 lock_timeout 或维护跳过分支。

-- setup(一个维护会话)
CREATE TABLE nowait_rows(id integer PRIMARY KEY, marker text NOT NULL);
INSERT INTO nowait_rows VALUES (1, 'seed');

-- blocker 会话:保持事务打开
BEGIN;
SELECT id FROM nowait_rows WHERE id = 1 FOR UPDATE;

-- contender 会话,开启 autocommit:这里触发 55P03
SELECT id FROM nowait_rows WHERE id = 1 FOR UPDATE NOWAIT;

-- blocker 会话
ROLLBACK;

-- 释放 blocker 后,在 contender 会话中修复并验证
UPDATE nowait_rows SET marker = 'repaired' WHERE id = 1 RETURNING marker;
SELECT marker FROM nowait_rows WHERE id = 1;

该案例只确认行锁机制、ERROR/IDLE 边界和修复步骤,不能据此断言每种锁模式或维护命令有相同 severity。

版本

锁定目录从 8.0.0 记录此条件;固定源码覆盖 PostgreSQL 18.6。已接受的运行观察来自 PostgreSQL 18.6 和 10.21。

55P024000157014

来源

src/backend/access/heap/heapam.c#L5178-5210

src/backend/catalog/namespace.c#L585-610

src/backend/tcop/postgres.c#L3420-3444

src/backend/commands/lockcmds.c#L130-145

src/backend/commands/vacuum.c#L835-880

结构化证据记录保存固定消息角色、维护 severity 以及已接受的运行产物。

221 - 55P04 — unsafe_new_enum_value_usage

PostgreSQL SQLSTATE 55P04 的来源与诊断参考。

55P04

速览

55P04 保护“新加入的 enum 值必须先提交再使用”的规则。它发生在 PostgreSQL 找到仍未提交且被标记为不安全的 enum tuple 后,不是标签语法错误。

字段
SQLSTATE 55P04
条件名 unsafe_new_enum_value_usage
状态 有效
已知存在于 12.0
锁定快照 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE
别名

含义

固定 enum.c guard 先接受已经标记为 committed 的 tuple,再直接检查 tuple 的事务 ID;如果该值不在 EnumUncommitted() 列表中,也会接受,因为它不可能比所属类型存活更短。只有剩余的未提交新值才会报此码。因此,同一未提交事务中的 ALTER TYPE ... ADD VALUE 与使用新标签可能触发 55P04,已经提交的标签则不会触发这条 guard。

消息

  • Primary 模板:unsafe use of new value "%s" of enum type %s
  • Detail:本调用组没有 detail。
  • Hint:New enum values must be committed before they can be used.

两个 %s 分别是 enum 标签和格式化后的 enum 类型名,只提供诊断信息,不是值格式规则。

诊断

保留 enum 标签、类型名、SQLSTATE、severity 和事务状态,检查该值是否由同一仍未提交的事务刚刚加入,以及失败使用是否是 enum input/cast 或解析为该 enum 的其他表达式。把这个 guard 与无效 enum 标签(22P02)区分开;22P04 是 COPY 文件格式条件,不是这条 enum guard。还要与重复 ADD VALUE 区分。

处理

先从 ERROR 恢复事务:执行 ROLLBACK;若 savepoint 的位置合适、能够保留此前的 ADD VALUE,则执行 ROLLBACK TO SAVEPOINT。新增值仍未提交时不能使用。如果完整回滚或回滚到 savepoint 已丢弃 ADD VALUE,就在新事务中重新执行并 COMMIT;若 savepoint 保留了它,也要先提交该事务,再在能看到已提交 catalog 行的事务中使用新标签。autocommit 下修正提交边界后重试输入,不要重复同一未提交流程。

版本

锁定目录从 12.0 记录此条件;固定源码覆盖 PostgreSQL 18.6。目录边界不表示更早不存在私有或未解析实现。

22P022500623505

来源

src/backend/utils/adt/enum.c#L68-102

结构化证据记录保存精确 guard 和消息组;未声称有自然运行案例。

222 - 57000 — operator_intervention

PostgreSQL 57000 的来源与诊断参考。

57000

速览

57000 是 SQLSTATE Class 57 的 operator_intervention 条件。固定 18.6 定义确实存在,但有界的报告/调用扫描没有解析出该错误码的 PostgreSQL 核心发出调用。因此本页保留机制、消息、severity 与恢复边界未决,不把它归因于 shutdown、timeout 或 cancellation。

字段
SQLSTATE 57000
条件名 operator_intervention
状态 有效
已知存在于 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_OPERATOR_INTERVENTION
别名

含义

条件名只标识“操作员干预”类别,并不代表唯一服务器阶段。固定扫描结果是有界的否定发现:它不能证明扩展、未来源码路径或尚未解析的间接调用绝不会发出 57000。固定源码没有提供可确认的 primary/detail/hint 模板,本页也没有声称运行时观察。

诊断

保留 provider 返回的完整诊断:primary、detail、hint、severity、SQLSTATE、服务器版本、连接状态及服务器日志关联。依据实际消息和周边日志判断具体路径。不能只凭类别名推断为管理员 shutdown、语句取消、锁超时或启动拒绝;这些路径有各自的条件码和源码。

处理

遵循实际响应携带的操作员或扩展指示。若 session 仍可用,先处理消息指出的干预,并检查是否处于显式事务;若 severity 为 ERROR,应按情况执行 ROLLBACKROLLBACK TO SAVEPOINT 后再继续。autocommit 下先修正原因再重试。若连接已终止,确认服务器 ready 后重连,并在重放非幂等操作前核对业务结果。有界扫描不支持更具体的修复建议。

版本

锁定目录从 7.4 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6,另有有界报告/调用扫描。

55P0357P0157014

来源

src/backend/utils/errcodes.txt#L433

结构化证据记录保存固定定义、有界扫描原件及源码/运行范围。

223 - 57014 — query_canceled:查询已取消

当正在执行的语句被取消(包括 statement_timeout)时,PostgreSQL 会报告 SQLSTATE 57014。应区分取消来源,检查事务状态,并确认后续操作安全。

速览

57014 是 PostgreSQL 类别 57 operator_intervention 中的 query_canceled 条件。它表示服务器中断了某条语句。多个取消来源共用这个 SQLSTATE,因此必须结合主报文和服务器上下文,区分 statement timeout、客户端取消、恢复冲突或其他管理路径。

代表性案例在专用自动提交连接上设置 statement_timeout 为 100 ms,再执行 pg_sleep(1)。PostgreSQL 返回 canceling statement due to statement timeout;连接保持 IDLE,后续 SELECT 1 返回 1。这只证明本案例的超时路径及连接可用性,不能推断所有取消命令都没有副作用或拥有相同事务状态。

运行 57014-registry-final-20260909 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。逐目标断言和结构化观察见公开证据 JSON

字段
SQLSTATE 57014
条件名 query_canceled
状态 有效
已知存在于 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_QUERY_CANCELED
别名

含义与触发路径

statement_timeout 为每条语句启动计时器,预算到期后请求 backend 处理中断。在固定源码路径中,ProcessInterrupts 使用 ERRCODE_QUERY_CANCELEDcanceling statement due to statement timeout 报告错误。客户端取消使用相同 SQLSTATE 但主报文是 canceling statement due to user request;锁超时和某些恢复路径使用自己的报文或 detail。

取消会在可处理中断的点停止当前语句。它不等于所有关联请求的工作都已经停止,也不保证外部副作用已经撤销,更不保证无需回滚就能继续使用事务。必须结合事务边界、语句类型和取消来源确定清理方式。

报文与诊断

代表性操作是在专用自动提交连接上设置 100 ms 超时:

SET statement_timeout = '100ms';
SELECT pg_sleep(1);
SELECT 1;

PostgreSQL 18.6 返回:

SQLSTATE: 57014
severity: ERROR
message_primary: canceling statement due to statement timeout
source: postgres.c / ProcessInterrupts / line 3446

PG10 返回相同的主报文,对应源码行号为 3018。57014 没有统一的 detail 模板;如果客户端提供,应保存 message_detail、message_hint、上下文及被中断的语句。

诊断

记录 SQLSTATE、严重级别、主报文、detail、hint、上下文、backend PID、语句文本、超时设置和取消来源。区分 statement timeout、lock timeout、客户端取消、管理员请求以及备用机恢复冲突。客户端诊断不完整时,可使用 SQLSTATE 和 backend PID 检查服务器日志。

检查错误后的事务状态。本案例的自动提交超时后为 IDLE,并成功执行 SELECT 1;显式事务中的错误可能让事务进入 INERROR,需要回滚。如果语句在出错前已改变行,应检查数据库实际状态,不要假定数据库之外的整个请求都能自动回滚。

处理与修复

根据原因调整操作和预算:

  • 优化或拆分过长查询,设置符合服务预算的超时。
  • 将客户端或管理员取消视为控制决策,再判断应用是否应重试。
  • 如果报文指向 lock timeout,应独立解决锁竞争;提高 statement timeout 不会修复锁队列。
  • 显式事务中止后先回滚,再发送无关命令;对生命周期不受 PostgreSQL 控制的外部工作进行验证。

代表性后续查询返回 1,连接状态为 IDLE。这是自动提交 sleep 案例的修复断言,不保证被取消的写入、游标或事务都能原地继续。

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 57014,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。

statement timeout 案例在 PostgreSQL 18.6 和 10.21 上均通过。该 SQLSTATE 还用于其他取消机制,而它们的报文和事务影响不同;本证据范围限定为自动提交连接上的服务器 statement timeout。

40P01deadlock_detected 是锁管理器发现环后解决的死锁,不是超时预算。53300too_many_connections 是启动阶段容量失败。42P01undefined_table 是解析阶段的名称错误。25P02in_failed_sql_transaction 可能在取消使周围显式事务中止后出现。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留两个目标 ID 和结构化观察。

224 - 57P01 — admin_shutdown

PostgreSQL 57P01 的来源与诊断参考。

57P01

速览

57P01 表示服务器发起的管理 shutdown 条件。固定核心路径覆盖有序或立即终止客户端、worker/并行终止,以及同步复制等待;后者明确提示本地提交可能早于 standby 复制。

字段
SQLSTATE 57P01
条件名 admin_shutdown
状态 有效
已知存在于 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_ADMIN_SHUTDOWN
别名

含义

同一 SQLSTATE 在多个生命周期边界复用,因此 severity 与恢复取决于调用点。立即停止信号路径发送 client-only WARNING 后退出,不运行正常清理;普通客户端管理员命令路径使用 FATAL。同步复制路径使用 WARNING,并带有 detail:The transaction has already committed locally, but might not have been replicated to the standby. 并行和 worker 路径各自使用 FATAL 或 worker 控制流。不能把这些路径互相替代为同一条“业务已提交/已回滚”结论。

消息

  • 立即停止:primary terminating connection due to immediate shutdown command,severity 为 WARNING_CLIENT_ONLY;报告后进程退出。
  • 客户端 backend 管理员命令:primary terminating connection due to administrator command,severity 为 FATAL;连接关闭。
  • 同步复制等待:primary canceling the wait for synchronous replication and terminating connection due to administrator command,severity 为 WARNING,detail 为 The transaction has already committed locally, but might not have been replicated to the standby.
  • 并行事务:primary postmaster exited during a parallel transaction,severity 为 FATAL。
  • 另一个固定 promotion 等待分支在 FATAL 下报告 terminating connection due to unexpected postmaster exit,context 为 while waiting on promotion

诊断

关联完整 primary/detail/context、backend PID、管理员或 postmaster 动作、服务器 shutdown/recovery 日志及事务边界。选定运行案例只覆盖客户端 backend 的管理员命令分支,不能证明立即停止、同步复制、worker、并行或 promotion 分支的结果。出现同步复制 detail 时,事务已经在本地提交,而 standby 是否收到仍不确定;该 WARNING 之后原连接仍会终止,不能在旧 session 恢复。重放非幂等操作前应查询持久化状态与复制状态。

处理

对 FATAL 或 client-only shutdown 报告,原连接不是事务恢复点:等待服务器 ready,建立新连接,并在重试前检查持久化业务状态或幂等键。同步复制分支要记录本地提交已经发生,并分别确认 standby 接收;WARNING 之后连接会终止,不能在旧 session 恢复。不能假定任何 57P01 路径都留下可用 session。已接受案例中的 fresh SELECT 1 只能证明终止目标后服务器可连接,不能证明中断的业务操作已提交。

实测诊断

选定注册表在 PostgreSQL 18.6 与 10.21 上分别创建 runner-owned victim client backend、不同的 admin session 和 fresh session。admin 核对目标身份,pg_terminate_backend 返回 true。victim 驱动收到 FATAL / 57P01terminating connection due to administrator command 后断开;fresh session 返回 1 并处于 IDLE。这个有界案例不覆盖其他源码分支,也不证明业务提交结果。

代表案例

只能使用案例创建的 victim session 返回的 PID,不能替换为任意生产 PID 或 admin 自身 PID。fresh probe 验证的是定向终止后服务器可达。重放非幂等请求前检查持久化业务状态或幂等键。

-- 由案例运行器创建的 victim 会话
SELECT pg_backend_pid();  -- 保存为 :victim_pid
SELECT 1;                 -- 终止前探测

-- admin 会话:记录自身 PID,只使用运行器创建的 victim PID
SELECT pg_backend_pid(); -- 保存为 :admin_pid
SELECT pid, backend_type FROM pg_stat_activity WHERE pid = backend_pid;
SELECT pg_terminate_backend(backend_pid);

-- victim 断开后建立 fresh 会话
SELECT 1;

版本

锁定目录从 7.4 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6,选定运行案例另在 PostgreSQL 10.21 观察到。

57P0257P0340001

来源

src/backend/tcop/postgres.c#L2974-3001

src/backend/tcop/postgres.c#L3354-3356

src/backend/replication/syncrep.c#L283-305

src/backend/access/transam/parallel.c#L932-940

src/backend/access/transam/xlogfuncs.c#L737-741

结构化证据记录保存固定分支及有界运行案例。

225 - 57P02 — crash_shutdown

PostgreSQL 57P02 的来源与诊断参考。

57P02

速览

57P02 是 crash-shutdown 路径。crash-and-restart 周期开始时,backend 向客户端发送 client-only WARNING,说明 postmaster 命令其回滚并退出;随后由于共享内存可能已损坏,进程不运行正常清理回调而退出。

字段
SQLSTATE 57P02
条件名 crash_shutdown
状态 有效
已知存在于 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_CRASH_SHUTDOWN
别名

含义

固定 primary 是 terminating connection because of crash of another server process。detail 说明 postmaster 因另一个服务器进程异常退出、可能破坏共享内存,而命令当前 server process 回滚并退出;hint 建议稍后重连。源码使用 WARNING_CLIENT_ONLY 而不是 FATAL,使信号处理器能先把消息发给客户端再强制进程退出。连接仍会关闭,之后不能在原 session 发送普通恢复命令。

消息

  • primary:terminating connection because of crash of another server process
  • detail:The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
  • hint:In a moment you should be able to reconnect to the database and repeat your command.
  • severity 来源:WARNING_CLIENT_ONLY,这是发给客户端但不写服务器日志的 warning;报告后进程退出。因此不能把它理解成可在同一 session 继续的语句级 WARNING。

诊断

把 SQLSTATE 和完整诊断与 postmaster 崩溃/恢复日志、backend PID 及执行中的命令关联。源码明确要求回滚当前事务,但连接在 crash 周期中断开,重放非幂等请求前仍必须核对持久化业务状态。要和有序管理员 shutdown(57P01)及启动拒绝(57P03)区分。

处理

不要在已断开的连接上发送 ROLLBACK,也不要人为制造崩溃测试此路径。等待 postmaster 恢复并 ready,建立新连接,检查持久化业务状态和受影响对象;只有在操作幂等或已确认先前效果后再重试。保留 primary/detail/hint 及服务器日志用于事故诊断。

版本

锁定目录从 7.4 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0157P0308006

来源

src/backend/tcop/postgres.c#L2974-3001

src/include/utils/elog.h#L46-55

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

226 - 57P03 — cannot_connect_now

PostgreSQL 57P03 的来源与诊断参考。

57P03

速览

57P03 在连接启动阶段、数据库尚未达到可接受连接状态时发出。固定 guard 区分 startup、shutdown、recovery、禁用 hot standby,以及两种不同的 recovery 尚未达到一致状态。

字段
SQLSTATE 57P03
条件名 cannot_connect_now
状态 有效
已知存在于 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_CANNOT_CONNECT_NOW
别名

含义

startup packet 在正常认证完成前被拒绝。所有固定分支都使用 FATAL,因此尝试连接直接结束,不会进入客户端事务。hot-standby 分支不能只看 primary:detail 会区分功能禁用、recovery snapshot 尚未 ready,以及 recovery 尚未达到一致状态。

消息

  • startup gate:primary the database system is starting up,FATAL。
  • hot standby 禁用:primary the database system is not accepting connections,FATAL;detail 为 Hot standby mode is disabled.
  • recovery snapshot 未 ready:primary the database system is not yet accepting connections,FATAL;detail 为 Recovery snapshot is not yet ready for hot standby.;hint 为 To enable hot standby, close write transactions with more than %d subtransactions on the primary server.
  • recovery 尚未一致:primary the database system is not yet accepting connections,FATAL;detail 为 Consistent recovery state has not been yet reached.
  • shutdown gate:primary the database system is shutting down,FATAL。
  • recovery gate:primary the database system is in recovery mode,FATAL。

诊断

记录 primary/detail/hint、startup 阶段、hot-standby 配置、recovery 一致性/snapshot 状态、服务器 ready 日志及目标服务器角色。反复出现带 snapshot detail 的 not yet accepting 指向 hint 所说的 primary 端子事务条件;一致性 detail 则表示 recovery 尚未过早阶段。不要把它当成 INERROR 事务:连接在 session 事务建立前就被拒绝。

处理

按界限退避,等待相关 startup、shutdown 或 recovery 状态转换。若 hot standby 是有意禁用的,要注意 hot_standbyPGC_POSTMASTER 设置:修改服务器所属的配置来源后必须重启服务器,SIGHUP/reload 不能激活该设置。若 hint 指向 primary 上长时间写事务,则处理该运维原因。ready 后建立新连接。被拒绝的 startup 路径没有事务可回滚;若此前客户端操作在状态转换中断开,重放前先核对业务结果。

版本

锁定目录从 7.4 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0157P0408001

来源

src/backend/tcop/backend_startup.c#L298-338

src/backend/utils/misc/guc_tables.c#L1895-1903

结构化证据记录保存全部固定 startup gate 以及源码/运行范围。

227 - 57P04 — database_dropped

PostgreSQL 57P04 的来源与诊断参考。

57P04

速览

57P04 在 recovery conflict 因当前连接所在数据库必须被删除而终止 session 时选用。同一 recovery-conflict primary 也用于其他冲突原因,但那些分支选择 40001;这里决定条件身份的是 database-dropped guard。

字段
SQLSTATE 57P04
条件名 database_dropped
状态 有效
已知存在于 9.0.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_DATABASE_DROPPED
别名

含义

固定调用点以 FATAL 发出 primary terminating connection due to conflict with recovery、动态 recovery-conflict detail 以及 hint In a moment you should be able to reconnect to the database and repeat your command.。SQLSTATE 表达式是明确的:只有 reason == PROCSIG_RECOVERY_CONFLICT_DATABASE 时选择 ERRCODE_DATABASE_DROPPED;同一终止分支的其他 reason 选择 ERRCODE_T_R_SERIALIZATION_FAILURE。数据库分支的 detail 是 User was connected to a database that must be dropped.

消息

  • primary:terminating connection due to conflict with recovery,FATAL。
  • 数据库删除 detail:User was connected to a database that must be dropped.
  • hint:In a moment you should be able to reconnect to the database and repeat your command.
  • 其他 recovery-conflict reason 可能复用相同 primary,但选择 40001 和不同 detail;不能只凭 primary 把它们标成 57P04

诊断

保留 SQLSTATE、primary/detail/hint、数据库名、backend PID、recovery-conflict reason 及 standby/recovery 日志。确认 detail 指向被删除的数据库后,才按 57P04 处理。FATAL 报告会关闭连接,因此没有可发送 ROLLBACK 的 session。断开前中断的操作是否已提交,需要单独核对。

处理

等待 recovery conflict/数据库转换结束,连接到有效数据库,并在重放非幂等操作前核对持久化业务状态。若服务器返回带 40001 的其他 recovery-conflict detail,应使用 serialization/retry 处理。数据库仍在删除或 recovery 日志表明冲突活跃时,不要盲目反复重连。

版本

锁定目录从 9.0.4 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0357P0240001

来源

src/backend/tcop/postgres.c#L3233-3248

src/backend/tcop/postgres.c#L2549-2578

结构化证据记录保存 SQLSTATE guard、动态 detail 及源码/运行范围。

228 - 57P05 — idle_session_timeout

PostgreSQL 57P05 的来源与诊断参考。

57P05

速览

57P05idle_session_timeout 到期、backend 确实处于命令之间的 idle 状态时终止 session。固定代码只在无事务分支启动这个 timer;idle-in-transaction 使用另一条件和 timer。

字段
SQLSTATE 57P05
条件名 idle_session_timeout
状态 有效
已知存在于 14.0
锁定快照 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_IDLE_SESSION_TIMEOUT
别名

含义

固定 primary 是 terminating connection due to idle-session timeout,severity 为 FATAL。PostgresMain 在 backend 报告 STATE_IDLE 后、且 IsTransactionOrTransactionBlock() 为假时才启用 idle-session timer。读到命令后立即关闭该 timer。因此 57P05 是 session 生命周期终止,区别于 statement timeout 57014、lock timeout 55P03、idle-in-transaction timeout 25P03 和 transaction timeout 25P04

消息

  • primary:terminating connection due to idle-session timeout
  • severity:FATAL;timer interrupt 会终止连接,不返回可恢复的语句级 ERROR。
  • 边界:命令之间真正 idle 的 session 使用 57P05;开放事务内 idle 的 session 使用单独的 idle-in-transaction timer/条件。

诊断

记录 primary、backend PID、idle_session_timeout 值及来源、最后一条命令、pg_stat_activity 状态、事务状态和服务器日志。确认 timer 启动时 session 是 idle 还是 idle in transaction。单凭客户端耗时不能把它和 statement/lock timeout 区分开,还应结合连接最后的 ReadyForQuery 状态解释 SQLSTATE。

处理

关闭或重建已过期连接,把长时间工作改成明确的工作单元,不要依赖闲置 session。只有策略允许且工作负载确有需要时才调整 idle_session_timeout。FATAL 会关闭连接,原 session 上没有可发送的有效 ROLLBACK;重连后,重放非幂等命令前先核对持久化效果。若工作实际是在事务内 idle,应分别诊断 25P03/25P04 和事务归属。

版本

锁定目录从 14.0 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0125P0325P045701455P03

来源

src/backend/tcop/postgres.c#L3504-3513

src/backend/tcop/postgres.c#L4585-4650

src/backend/tcop/postgres.c#L4704-4721

结构化证据记录保存消息和 idle 状态边界。

229 - 58000 — system_error

PostgreSQL 58000 的来源与诊断参考。

58000

速览

58000 是 system-error 条件。在固定 backend 路径中,pg_promote 创建 promotion signal 文件后调用 kill(PostmasterPid, SIGUSR1);信号发送失败时以 ERROR 报告,并把操作系统的 %m 文本展开到消息中。

字段
SQLSTATE 58000
条件名 system_error
状态 有效
已知存在于 9.2.0
锁定快照 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_SYSTEM_ERROR
别名

含义

代表性 backend primary 是 failed to send signal to postmaster: %m。代码在报告 ERROR 前先删除 promotion signal 文件,所以这里是 postmaster 通知路径中的系统调用失败,不是用户值或 SQL 语法错误。共享的 common/exec.c 使用 log_error 宏,并有两个编译时分支:非 FRONTEND 构建展开为 ereport(LOG, (errcodefn, errmsg_internal(...)));FRONTEND 构建忽略 errcode() 参数,把格式化文本写到 stderr。因此 frontend 工具消息不能证明存在客户端协议 58000 诊断,也不能证明客户端事务已回滚。common/logging.h 中独立的 pg_log_error 宏才映射到 PG_LOG_ERROR,但 pclose_check() 并不调用它。

消息

  • backend pg_promote 信号路径:primary 为 failed to send signal to postmaster: %m,severity 为 ERROR;展开文本取决于失败 kill() 调用当时的 OS errno
  • 共享的 pclose_check() 源码:调用点模板是 %s() failed: %m;对 pclose() 会展开为 pclose() failed: <OS 文本>。非 FRONTEND 构建经 ereport(LOG) 携带传入的 ERRCODE_SYSTEM_ERROR;FRONTEND 构建忽略该 code、直接写 stderr,因此不是客户端协议 58000 路径。

诊断

保留 %m 展开后的完整 primary、操作类型(promotion signal、pclose 或其他系统 helper)、进程身份及服务器或工具日志上下文。对 backend pg_promote,检查 postmaster PID、信号权限/进程存活状态和 OS 错误。没有实际 errno 时,不要把系统错误替换成笼统的磁盘、权限或进程诊断;单凭 SQLSTATE 也不能判断事务结果。

处理

先修正展开消息所指出的操作系统条件,再确认 postmaster/服务器健康后重试。backend ERROR 通常会使当前显式事务进入错误状态,继续前先执行 ROLLBACKROLLBACK TO SAVEPOINT;autocommit 下也应在原因修正后再重试。pclose_check 的 frontend 日志由工具自身控制流处理,不应据此要求 SQL 回滚。若连接已断开,待服务器 ready 后重连并核对业务效果。

版本

锁定目录从 9.2.0 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0157P02XX000

来源

src/backend/access/transam/xlogfuncs.c#L702-708

src/common/exec.c#L52-70

src/common/exec.c#L391-412

src/include/common/logging.h#L106-110

结构化证据记录保存 backend 与 frontend/common 消息边界。

230 - 58030 — io_error

PostgreSQL SQLSTATE 58030 的源码核验与诊断参考。

58030

速览

58030 由共享缓冲区的一条特定清理路径发出:此前已经记录过写入失败,18.6 中该路径报告的是 WARNING,不是笼统的客户端 ERROR;消息保留数据块和关系对象信息,并提示重复失败可能是永久性的。

字段
SQLSTATE 58030
条件名 io_error
状态 有效
已知存在于 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_IO_ERROR
别名

含义

FlushBuffer 启动共享缓冲区写入;永久关系会先刷新 WAL,然后调用 smgrwrite。异常展开进入缓冲区 I/O 的资源所有者回调时,AbortBufferIO 将缓冲区标为 BM_IO_ERROR。如果缓冲区仍有效且为脏页,并且这不是第一次失败,它以 WARNING 和 SQLSTATE 58030 报告,再以错误标记结束缓冲区 I/O。较早的 smgrwrite 失败才可能使客户端语句失败;后面的警告是重复失败通知,本身不能证明客户端事务已进入错误状态。

关系文本由缓冲区标记通过 relpathperm 生成;共享缓冲区写入的错误上下文还可能是 writing block %u of relation "%s"。因此它指出排查位置,但不保证只有该数据块受影响。

另一个存储管理器路径用 FileWrite 扩展关系段。如果该调用返回负值,md.cERROR 报告 could not extend file "%s": %m 并调用 errcode_for_file_access();保存的 errno 为 EIO 时映射到 58030,为 ENOSPC 时映射到 53100。这个原始 ERROR 可能使客户端语句失败并令显式事务进入失败状态;它与 AbortBufferIO 后续重复失败的 WARNING 是不同的发出路径。

消息

  • WARNING,SQLSTATE 58030could not write block %u of %s
    • DETAIL:Multiple failures --- write error might be permanent.
  • 共享缓冲区写入周边的错误上下文:writing block %u of relation "%s"
  • ERROR,SQLSTATE 由 errcode_for_file_access() 选择;保存的 errno 为 EIO 时为 58030could not extend file "%s": %m
    • HINT:Check free disk space.

第一次写失败可能有不同的主消息和 SQLSTATE,例如由 OS errno 辅助函数选择的代码。应把第一次记录与该警告一起保留。在扩展关系的路径中,EIO 明确选择该条件,而 ENOSPC 选择 53100;不能把这些 errno 分支都压成笼统的磁盘已满诊断。

诊断

保留完整错误链、第一次写错误、该 warning、日志上下文、关系 fork 和数据块、文件系统/设备 errno、挂载状态,以及 WAL 或副本是否确认写入。确认是后端语句、检查点、后台写进程还是其他服务器路径;源码核验不能代替特定部署的存储定位。

处理

存储路径不健康时停止重试,检查挂载、设备、权限、空间/配额及存储日志,并在修复前保留关系与副本证据。扩展关系的 ERROR 可能令显式客户端事务失败,继续发 SQL 前先 ROLLBACK 或回到已经建立的保存点;AbortBufferIO 的重复失败 WARNING 本身不要求客户端回滚,但仍需修复存储并确认持久性。原因修复后仅按幂等边界重试整个工作单元;后端/服务器已停止时使用新连接,并在重放前确认提交状态。

版本

锁定目录从 7.4 记录此条件;固定机制和消息角色来自 PostgreSQL 18.6。本源码条目没有诱发自然 I/O 故障。

5310058P03XX001

来源

src/backend/storage/buffer/bufmgr.c#L4307-L4436

src/backend/storage/buffer/bufmgr.c#L6164-L6225

src/backend/storage/smgr/md.c#L512-L519

src/backend/utils/error/elog.c#L867-L942

结构化证据记录保存固定 warning、detail、源码边界和未运行自然故障的事实。

231 - 58P01 — undefined_file

PostgreSQL SQLSTATE 58P01 的源码核验与诊断参考。

58P01

速览

58P01 表示所需文件或目录找不到。固定表空间路径会把 chmodENOENT 与其他权限/文件系统失败分开;只有服务器正在恢复时才加入重启前创建目录的提示。

字段
SQLSTATE 58P01
条件名 undefined_file
状态 有效
已知存在于 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_UNDEFINED_FILE
别名

含义

utility.c 在进入 CreateTableSpace 前调用 PreventInTransactionBlock(isTopLevel, "CREATE TABLESPACE"),因此该命令必须在顶层执行,无需再手工回滚一个显式事务块。create_tablespace_directories() 在该命令之后以及表空间 WAL 重放中调用。目标不是原地目录时,如果 chmod(location, ...) 返回 ENOENT,源码以 SQLSTATE 58P01 报告 directory "%s" does not exist;仅在 InRecovery 为真时加入 Create this directory for the tablespace before restarting the server.。其他 chmod 失败通过 errcode_for_file_access() 报告动态主消息 could not set permissions on directory "%s": %m;原地创建失败也使用 could not create directory "%s": %m,其代码由 errno 选择。

因此此码不只属于表空间启动。实际操作和 %m 详细信息才能判断缺失的是表空间、关系文件、配置文件还是其他文件消费者。

消息

  • ERROR,SQLSTATE 58P01directory "%s" does not exist
    • 恢复时的条件提示:Create this directory for the tablespace before restarting the server.
  • ERROR,使用 errcode_for_file_access()could not set permissions on directory "%s": %m
  • ERROR,使用 errcode_for_file_access()could not create directory "%s": %m(原地目录分支)。

后两种模板不保证都是 58P01errcode_for_file_access() 会根据保存的 errno 选择 SQLSTATE。

诊断

记录完整主消息、%m 详细信息、阶段、路径、数据库/表空间身份,以及调用者是 SQL 执行还是 WAL 重放。确认目标卷挂载在精确路径,再检查所有者、权限、符号链接目标和表空间版本目录;卷未挂载与目录被删除需要不同处理。

处理

按部署和备份流程恢复预期挂载或目录,不要在未知表空间位置覆盖创建空路径。CREATE TABLESPACEPreventInTransactionBlock 保护,必须在显式事务之外运行;该命令本身无需再手工回滚一个显式事务块。若其他文件消费者在显式事务内报告客户端 ERROR,继续前先 ROLLBACK 或回到已建立的保存点。若消息来自 WAL 恢复,则没有可恢复的客户端事务:恢复路径并按服务器重启/恢复流程处理;确认所有者、权限和目录内容后再重试。

版本

锁定目录从 7.4 记录此条件;固定源码覆盖 PostgreSQL 18.6。本条为源码核验,没有诱发表空间故障。

58P0258P0358030

来源

src/backend/commands/tablespace.c#L347-L359

src/backend/commands/tablespace.c#L565-L625

src/backend/commands/tablespace.c#L1515-L1525

src/backend/tcop/utility.c#L713-L717

结构化证据记录保存条件提示、动态 errno 路径和源码/运行边界。

232 - 58P02 — duplicate_file

PostgreSQL SQLSTATE 58P02 的源码核验与诊断参考。

58P02

速览

58P02 是固定服务器端基础备份输出路径中的 duplicate-file 条件。缺失目录会尝试创建,已有空目录可以使用,已有非空目录则报告此码。

字段
SQLSTATE 58P02
条件名 duplicate_file
状态 有效
已知存在于 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_DUPLICATE_FILE
别名

含义

bbsink_server_new() 先检查并提交权限校验事务,然后拒绝相对路径并调用 pg_check_dir(pathname):结果 0 创建目录,结果 1 接受空目录,结果 2–4 进入固定的 ERRCODE_DUPLICATE_FILE 分支;访问错误走另一条 errcode_for_file_access() 分支。这是基础备份输出保护,不证明 PostgreSQL 中所有 EEXIST 或非空目录都使用 58P02

消息

  • ERROR,SQLSTATE 58P02directory "%s" exists but is not empty
  • ERROR,使用 errcode_for_file_access()could not access directory "%s": %m
  • ERROR,目标不存在但创建失败时,使用 errcode_for_file_access()could not create directory "%s": %m

后两个模板的 SQLSTATE 由保存的 OS errno 决定,不能因为它们在同一函数中就都标成 58P02

诊断

确认路径确实是预期的基础备份目标,检查所有者、挂载和内容,并判断是完整旧备份还是中断产物;变更前保留目录清单。源码在内部权限校验事务提交后才准备输出目录,因此这里表示备份建立失败,不能假设可以靠继续执行 SQL 修复用户 DML 事务。

处理

按备份策略使用已确认为空的目标,或先归档旧输出。创建后验证完整备份和 manifest;不要递归删除或强制覆盖未知目录。若外层客户端报告 ERROR,按实际会话状态回滚到已有保存点或事务;ROLLBACK 不能把非空备份目录变安全。只有所属服务器进程被终止时才需要新连接。

版本

锁定目录从 7.4 记录此条件;固定基础备份路径来自 PostgreSQL 18.6。本源码条目没有修改或测试备份目标。

58P0158P0353100

来源

src/backend/backup/basebackup_server.c#L59-L125

结构化证据记录保存目录状态分支、动态 errno 路径和源码/运行边界。

233 - 58P03 — file_name_too_long

PostgreSQL SQLSTATE 58P03 的源码核验与诊断参考。

58P03

速览

58P03 由 PostgreSQL 文件访问 errno 辅助函数在保存的 OS errno 为 ENAMETOOLONG 时选择。它不是固定的 file name too long 主消息;调用者提供带 %m 的消息,辅助函数提供 SQLSTATE。

字段
SQLSTATE 58P03
条件名 file_name_too_long
状态 有效
已知存在于 18.0
锁定快照 18.6, 19beta3
ERRCODE_FILE_NAME_TOO_LONG
别名

含义

errcode_for_file_access()ENAMETOOLONG 映射为 ERRCODE_FILE_NAME_TOO_LONG。同一完整 switch 还把 ENOENT 映射为 58P01EEXIST 映射为 58P02ENOSPC 映射为 53100EIO 映射为 58030,其他 errno 可能落到别的代码。辅助函数明确要求调用者的主消息保留 %m,所以 OS 文本和 locale(区域设置)是诊断的一部分。

18.6 固定后端调用者包括 base backup 的 could not access directory "%s": %m 和表空间的 could not set permissions on directory "%s": %m;两者先以 ERROR 发出,再由辅助函数选择代码。这说明实际操作上下文很重要:同一 SQLSTATE 可以来自不同文件操作,其他调用者的文件名过长也可能使用不同主消息模板。

消息

  • ERROR,base backup 代表主消息:could not access directory "%s": %m
  • ERROR,表空间代表主消息:could not set permissions on directory "%s": %m
  • %m 展开为保存的 OS 错误文本;若 errno 是 ENAMETOOLONGerrcode_for_file_access() 提供 SQLSTATE 58P03

本次核验没有找到脱离调用者的固定 58P03 主消息。不要把 %m 换成臆造的英文句子,也不要仅凭条件名推断扩展报文。

诊断

保留完整主消息/详细信息/上下文、操作和组件、完整路径、OS errno、文件系统限制、编码及 PostgreSQL 对象名映射。区分文件系统组件长度限制与 PostgreSQL 标识符限制,也要区分辅助函数的 ENAMETOOLONG 分支和 ENOENTEEXIST、磁盘满、I/O 分支。固定源码确认的是辅助函数与代表调用者,不声称在特定主机自然复现。

处理

使用组件和文件系统接受的路径/名称,或移动目标并保留持久映射。客户端 ERROR 若发生在显式事务中,继续执行前必须 ROLLBACK 或回到已有保存点;修正路径后重试受影响操作,不要继续发送无关语句。启动/后台调用可能没有客户端事务;后端已终止时使用新连接。上报时保留原始 OS 详细信息。

版本

锁定目录从 18.0 记录 58P03;固定辅助函数与调用者来自 PostgreSQL 18.6。本页仅源码复核,没有自然运行声明。

58P0158P0258030

来源

src/backend/utils/error/elog.c#L867-L942

src/backend/backup/basebackup_server.c#L119-L124

src/backend/commands/tablespace.c#L606-L618

结构化证据记录保存 errno 映射、代表主消息与源码/运行边界。

234 - 72000 — snapshot_too_old

PostgreSQL SQLSTATE 72000 的历史源码核验与诊断参考。

72000

速览

72000 是历史 snapshot_too_old 错误。PostgreSQL 16.15 仍定义并发出它;该 SQLSTATE 在 PostgreSQL 17 大版本移除。因此 16.15 是最后一个大版本线中的后续小版本快照,不是移除点。

字段
SQLSTATE 72000
条件名 snapshot_too_old
状态 已移除
已知存在于 9.6.0
锁定快照 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15
ERRCODE_SNAPSHOT_TOO_OLD
别名

含义

固定的 16.15 源码中,old_snapshot_thresholdPGC_POSTMASTER 整数 GUC,-1 关闭功能。TestForOldSnapshot 内联 guard 要求阈值非负、快照为 MVCC 或 TOAST 且 LSN 有效,并且页面 LSN 晚于快照;随后调用 TestForOldSnapshot_impl,它还要求关系是允许提前清理的永久、非系统目录关系,并比较 snapshot.whenTakenGetOldSnapshotThresholdTimestamp()。快照太旧时发出 ERROR 72000,主消息为 snapshot too old

阈值时间戳由旧快照的时间到 XID 映射维护,供提前清理和 vacuum 使用。PG16.15 文档说明阈值之前已死数据可以被 vacuum,读取在快照建立后修改过的页面可能失败;物化游标或系统目录可能不触发错误。为检测条件而保留的关系空间不会直接归还 OS,除非显式执行 VACUUM FULL 等操作。

消息

  • ERROR,SQLSTATE 72000snapshot too old

锁定目录在 PG17/18 没有当前定义行。不要推断替代 SQLSTATE,也不要把无关的当前错误声称为等价物。

诊断

在 PostgreSQL 9.6–16 上记录大版本、SHOW old_snapshot_threshold、事务快照年龄、关系类型、页面读取路径以及 vacuum/提前清理历史。检查关系是否被 guard 排除(例如系统目录)、读取是否使用物化游标或结果集,以及设置是否在服务器启动时生效。源码核验不能建立实际集群的阈值或清理历史。

处理

这是语句级 ERROR;显式事务中继续发 SQL 前先回滚整个事务,或回到已经建立的保存点。旧快照无法原地修复:结束或缩短长期读取事务,按历史大版本设置合适的启动配置(GUC 为 PGC_POSTMASTER,修改需重启),再以幂等边界重跑整个读取单元。PG17 及以后应先确认当前错误和机制,不要仅凭历史名称安装 72000 handler。

版本

锁定定义文件记录 72000 从 9.6.0 到 16.15,PG17/18 无定义。16.15 源码提供 GUC 与 guard;固定缓冲区管理器发出路径来自 commit 7d3e000c5961a544302072058a1184e9a588837b。目录边界说明它在 PG17 大版本线移除,而不是在 16.15 小版本移除。

40001XX001

来源

src/backend/storage/buffer/bufmgr.c#L5663-L5675

src/include/storage/bufmgr.h#L363-L392

src/backend/utils/time/snapmgr.c#L1697-L1714

src/backend/utils/misc/guc_tables.c#L3295-L3302

doc/src/sgml/config.sgml#L2827-L2884

结构化证据记录保存历史定义、guard、GUC、文档和源码/运行边界。

235 - F0000 — config_file_error

PostgreSQL SQLSTATE F0000 的源码核验与诊断参考。

F0000

速览

F0000 是配置文件错误条件,但严重性和恢复边界取决于所属调用者。固定核心路径包括归档恢复目标失败和 OAuth HBA 校验;unaccent contrib 词典还有自己的文件打开与规则解析路径。

字段
SQLSTATE F0000
条件名 config_file_error
状态 有效
已知存在于 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_CONFIG_FILE_ERROR
别名

含义

归档恢复路径在到达配置目标之前结束时发出 FATAL。OAuth 校验使用 ereport(elevel):HBA 解析器传入级别,load_hba() 在重载时以日志记录解析错误并保留旧规则,postmaster 初次启动时则把 HBA 加载失败转成另一个 FATAL,阻止启动。unaccent 加载器无法打开规则文件时报告 ERROR,重复规则和格式错误的规则行则以此 SQLSTATE 报告 WARNING

这些是不同所属组件的路径。HBA 解析带行号和文件上下文;词典打开错误带 %m;归档恢复目标消息没有这两类字段。

消息

  • FATAL,SQLSTATE F0000recovery ended before configured recovery target was reached
  • 由 HBA 加载者选择 elevel,SQLSTATE F0000oauth_validator_libraries must be set for authentication method %s;上下文:line %d of configuration file "%s"
  • 由 HBA 加载者选择 elevelinvalid list syntax in parameter "%s"
  • 由 HBA 加载者选择 elevelauthentication method "oauth" requires argument "validator" to be set when oauth_validator_libraries contains multiple options;上下文:line %d of configuration file "%s"
  • ERROR,SQLSTATE F0000could not open unaccent file "%s": %m
  • WARNING,SQLSTATE F0000duplicate source strings, first one will be used
  • WARNING,SQLSTATE F0000invalid syntax: more than two strings in unaccent ruleinvalid syntax: unfinished quoted string in unaccent rule

OAuth 模板使用 ereport(elevel),因此函数源码本身不能把所有 HBA 事件都定为 ERRORFATAL;实际启动/重载调用者决定边界。

诊断

保留完整主消息、详细信息、提示、上下文、文件名、行号、子系统和阶段。归档恢复要检查配置目标与可用 WAL/归档。OAuth 要检查 HBA 行和 oauth_validator_libraries 值,区分空列表、列表语法和缺少 validator 参数。unaccent 要检查解析后的规则路径、权限、编码和规则格式;警告可能使词典继续加载并采用首条规则或跳过坏行。

处理

按所属组件的格式修正配置,并保留已知正常副本。归档恢复目标的 FATAL 或首次 HBA 加载的 FATAL 会结束启动,没有客户端事务可回滚;修正目标/配置后重启并使用新连接。HBA 重载解析失败只记录日志并保留旧规则,修复文件后需再次重载,不能假设新规则已生效。unaccent ERROR 若在显式客户端事务中发生,继续执行前要 ROLLBACK 或回到已有保存点;警告路径不需要回滚,但应审查被跳过或重复的规则。

版本

锁定目录从 7.4 记录此条件;固定源码覆盖 PostgreSQL 18.6。本源码页没有诱发启动、重载或词典故障。

58P01F000157P03

来源

src/backend/access/transam/xlogrecovery.c#L1921-L1931

src/backend/libpq/auth-oauth.c#L813-L870

src/backend/libpq/hba.c#L2635-L2692

src/backend/postmaster/postmaster.c#L1327-L1338

contrib/unaccent/unaccent.c#L65-L109

contrib/unaccent/unaccent.c#L260-L271

结构化证据记录保存固定消息组、调用者选择的 severity 和源码/运行边界。

236 - F0001 — lock_file_exists

PostgreSQL SQLSTATE F0001 的源码核验与诊断参考。

F0001

速览

F0001 是启动时的所有权冲突。PostgreSQL 同时检查目标数据目录的 lock file 和共享内存身份;活跃所有者与崩溃留下的残留物是不同情况。

字段
SQLSTATE F0001
条件名 lock_file_exists
状态 有效
已知存在于 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_LOCK_FILE_EXISTS
别名

含义

CreateLockFileO_EXCL 原子创建锁文件。已有文件若包含 PID,会用 kill(pid, 0) 区分进程仍活跃还是已经消失;数据目录锁文件还会读取记录的共享内存标识并调用 PGSharedMemoryIsInUse。该辅助函数只把与目标 DataDir 关联的共享内存段视为相关,因为共享内存 ID 可能偶然重合。空锁文件是独立的 F0001 分支,可能表示另一个服务器正在启动,也可能是上次启动崩溃的残留。

SysV 共享内存启动路径也有同样边界:仍有进程附着或分析结果不确定的既有共享内存段报告仍在使用;与数据目录相关但无进程附着的共享内存段才可清理后重建。这些 guard 防止两个 postmaster 认领同一集群。

消息

  • FATAL,SQLSTATE F0001lock file "%s" already exists
    • 数据目录提示:Is another postgres (PID %d) running in data directory "%s"?(编码所有者为 postmaster 时会使用对应提示文案)。
    • socket lock 变体会写 using socket file "%s"
  • FATAL,SQLSTATE F0001lock file "%s" is empty
    • 提示:Either another server is starting, or the lock file is the remnant of a previous server startup crash.
  • FATAL,SQLSTATE F0001pre-existing shared memory block (key %lu, ID %lu) is still in use
    • 提示:Terminate any old server processes associated with data directory "%s".

其他锁文件 I/O 失败使用 errcode_for_file_access(),可能得到不同 SQLSTATE,不能都归入 F0001

诊断

确认精确 PGDATA、socket 目录、PID、启动时间、记录的 device/inode 身份、进程所有者和 postmaster 日志。kill(pid, 0) 成功,或失败 errno 既不是 ESRCH(进程不存在)也不是 EPERM(进程存在但调用者无权发送信号),会保持活跃进程分支。guard 将 EPERM 排除在活跃进程分支之外,是因为 checkDataDir() 以及 0600/0640 锁文件权限足以排除不同 UID 的进程作为竞争 postmaster;它只允许继续做身份和共享内存检查,并不授权直接删除锁文件。PID 消失或被视为不同 UID 候选后,还要检查数据目录共享内存 ID 及是否仍有孤儿后端附着,再考虑清理。空锁文件在源码中明确是歧义状态,不代表一定残留。

处理

这是启动阶段的 FATAL,没有客户端事务可恢复;解决所有权冲突后启动服务器,再使用新连接。若另有 postmaster/后端存活,应按正常管理流程协调或停止。只有确认集群、进程身份和共享内存状态后,才能按文档处理陈旧锁文件。绝不能仅凭路径、PID 文本或数字 ID 删除锁文件/共享内存;所有者活跃时删除可能造成双主冲突(两个 postmaster 认领同一集群)和数据丢失。

版本

锁定目录从 7.4 记录此条件;固定启动与共享内存路径来自 PostgreSQL 18.6。本源码条目没有诱发进程、lock-file 或共享内存故障。

F000057P0358P01

来源

src/backend/utils/init/miscinit.c#L1262-L1427

src/backend/port/sysv_shmem.c#L306-L335

src/backend/port/sysv_shmem.c#L765-L835

结构化证据记录保存活动/陈旧检查、固定 FATAL 消息和源码/运行边界。

237 - HV000 — fdw_error(外部数据包装器错误)

PostgreSQL SQLSTATE HV000 是 SQL/MED 外部数据包装器的通用错误条件。应先确认包装器回调和远端诊断,再决定恢复方式。

HV000 — fdw_error(外部数据包装器错误)

速览

HV000 是 SQL/MED 外部数据包装器(FDW)的通用错误条件,只说明错误位于 FDW 边界,不对应某一种远端故障、回调或重试策略。PostgreSQL 18.6 核心/contrib 扫描没有解析出直接的 ERRCODE_FDW_ERROR 报告组,具体触发方式取决于安装的实现。

包装器回调可以报告自己的 SQLSTATE,访问另一系统的包装器也可能转发远端诊断。解释 HV000 前,应保留完整诊断、外部表、外部服务器、包装器名称与版本以及操作阶段。

字段
SQLSTATE HV000
条件名 fdw_error
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_ERROR
别名

含义与范围

18.6 定义为 SQL/MED 专用 Class HV 中的 HV000 E ERRCODE_FDW_ERROR fdw_error。FDW API 提供规划、扫描、修改、导入和解释回调;执行器通过安装的包装器提供的 FDW routine 调用这些回调。条件集中定义而具体实现位于扩展,正是这个边界的结果。

postgres_fdwfile_fdw 和第三方 FDW 实现 FDW 回调 API。dblink 是独立的 contrib 客户端 API,访问另一 PostgreSQL 服务器时也可能使用 Class HV 代码,但它不是 FDW 回调实现。远端 SQLSTATE、libpq 连接错误和包装器本地错误可能出现在一次操作中,但不能互相替代。

报文与诊断

归档的 18.6 调用扫描没有解析出 HV000 的稳定核心报文变体。尽可能保留 C/SQLSTATE、SVMDHWFLR,以及包装器回调或远端命令;不能用“FDW error”概括实际报文。

诊断

先确定阶段:规划、扫描初始化、取数、增删改、提交/回滚、模式导入或 EXPLAIN。再检查外部表和服务器选项、用户映射、包装器版本及远端日志。若是远端 PostgreSQL 包装器,要分别记录远端和本地 SQLSTATE;它们描述的是同一故障的不同层。

本次扫描覆盖 PostgreSQL 18.6 核心及自带 contrib 源码,不覆盖所有外部包装器、驱动、远端数据库或用户回调。

处理

根据已确认的层次修复外部服务器或用户映射、包装器选项/回调契约、远端操作,或安装兼容的包装器版本。只有确认包装器是否已访问远端以及写操作是否可能提交后才重试;单独的 HV000 不能证明这两点。

版本

锁定目录在 9.1.0 已观察到 HV000,并存在于截至 18.6 的正式快照及 19 Beta 3 预览快照。pre-9 扫描的 7.4–8.4 定义文件未观察到它,这只是资料边界,不是精确引入版本。

比较 HV001fdw_out_of_memoryHV002fdw_dynamic_parameter_value_neededHV00Bfdw_invalid_handle。远端条件应按远端系统的 SQLSTATE 和诊断解释。

来源

238 - HV001 — fdw_out_of_memory(外部数据包装器内存不足)

PostgreSQL SQLSTATE HV001 表示 FDW 路径的内存分配失败。PostgreSQL 自带的 dblink 和 postgres_fdw 在获取 libpq 连接选项时会使用它。

HV001 — fdw_out_of_memory(外部数据包装器内存不足)

速览

HV001 是 FDW 内存不足条件。PostgreSQL 18.6 的 postgres_fdwdblinkPQconndefaults() 没有返回选项数组时使用它,postgres_fdw 复制选项的分配失败路径也使用它。固定源码报文是 out of memory,有些路径附带 Could not get libpq's default connection options.。它是 ERROR,远端操作是否已执行取决于阶段。

字段
SQLSTATE HV001
条件名 fdw_out_of_memory
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_OUT_OF_MEMORY
别名

含义与触发路径

postgres_fdw 在构建选项列表时调用 PQconndefaults();空结果被视为分配失败并报告 HV001。随后为复制选项分配内存失败时也使用该码。dblink 有两个对应的选项发现路径。这是包装器实现细节,不能把所有 HV001 都解释为后端全局耗尽内存。

报文与诊断

18.6 的已确认变体包括:dblink 1972–19742908–2910postgres_fdw/option.c:317–319ERROR: out of memory 加 detail;option.c:340–341 只有主报文。应同时保留函数阶段和包装器名称;该报文不是远端服务器响应。

诊断

记录所有诊断字段,确认是在读取 FDW/服务器选项还是建立 dblink/postgres_fdw 连接时失败。检查后端内存压力、进程限制、包装器与 libpq 版本;detail 指向 libpq 默认选项时,先区分 PQconndefaults() 分配失败与 libpq 安装或配置问题,再把本地库路径/版本作为辅助证据,最后排查远端 SQL。

处理

降低并发内存压力并检查后端进程或容器限制,理解分配失败后再重试选项发现。若服务器实际报告的是 53200,应按该代码的诊断处理;若已确认是 HV001,不能仅因发生分配失败就改标为 53200。写操作要结合回调阶段和远端日志确认是否已发命令;单独的 HV001 不是整事务重试信号。

版本

目录从 9.1.0 观察到该码,并延续到 18.6 与 19 Beta 3。上述 18.6 路径和大小写固定到 commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;旧版本措辞可能不同。

HV000 是通用 FDW 条件;HV002 是缺少包装器参数;53200 是后端通用内存不足,只有确认后端而非 FDW 报错时才使用它。

来源

239 - HV002 — fdw_dynamic_parameter_value_needed(需要外部数据包装器动态参数)

PostgreSQL SQLSTATE HV002 表示 FDW 所需参数不可用。file_fdw 在外部表既没有 filename 也没有 program 时报告它。

HV002 — fdw_dynamic_parameter_value_needed

速览

HV002 表示 FDW 操作所需的参数值不可用。PostgreSQL 18.6 自带的 file_fdw 在外部表选项校验期间发现 filenameprogram 都没有提供时报告此码。

字段
SQLSTATE HV002
条件名 fdw_dynamic_parameter_value_needed
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_DYNAMIC_PARAMETER_VALUE_NEEDED
别名

含义与触发路径

contrib/file_fdw/file_fdw.c 的校验器检查 ForeignTableRelationId 的选项;两者都缺失时以 ERROR 报告 either filename or program is required for file_fdw foreign tables。条件名比这一实现更宽,其他包装器可能在规划、扫描或修改阶段需要不同参数并产生不同报文。

报文与诊断

18.6 固定变体来自 file_fdw_validator 第 345–350 行:ERROR: either filename or program is required for file_fdw foreign tables。固定的 9.1.24 源码使用 ERROR: filename is required for file_fdw foreign tables;两个源码模板都没有 detail 或 hint。这些都是本地选项校验错误,不表示远端程序启动失败。

诊断

检查具体的 CREATE FOREIGN TABLEALTER FOREIGN TABLE ... OPTIONS 定义及包装器接受的选项名。对 file_fdw,确认有一个可用的源选项且服务器进程能访问其值;其他包装器应查其校验器或回调的参数契约。

处理

按包装器要求补上正确拼写和权限的选项,或使用其支持的动态参数机制;随后重新校验。未改变 SQL 就重试不能生成缺失参数。

版本

目录从 9.1.0 观察到 HV002,延续到 18.6 和 19 Beta 3。固定的 9.1.24 file_fdw 源码使用 “filename is required”,固定的 18.6 源码使用 “either filename or program is required”,匹配报文时要看服务器版本;这里不声称具体的变更发布版本。

HV00D 是包装器不认识选项名;HV000 是通用包装器失败;HV005 是外部列缺失而非 FDW 选项缺失。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • file_fdw.c — 校验条件与报文。
  • 9.1.24 历史 file_fdw.c — 固定的 filename-only 校验报文,SHA-256 6f948ed8f9ffa6d1077b289f23c53eff02c5182492f0827b908c2be86026dad8
  • 结构化证据 — 源码路径与历史报文边界。

240 - HV004 — fdw_invalid_data_type(外部数据包装器数据类型无效)

PostgreSQL SQLSTATE HV004 表示 FDW 数据类型不匹配。应确认包装器类型映射和外部表定义。

HV004 — fdw_invalid_data_type

速览

HV004 表示 FDW 无法使用某个数据类型。18.6 核心及 contrib 调用扫描没有解析出直接报告组,因此不能指定自带包装器报文或自然 SQL 触发器。

字段
SQLSTATE HV004
条件名 fdw_invalid_data_type
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_DATA_TYPE
别名

含义

包装器可能拒绝本地列类型、远端类型映射或值转换。FDW 文档说明,类型不匹配时可以报告错误,但没有规定统一映射或报文;不能把每个类型转换失败都归为此码。

报文与诊断

没有确认的 18.6 核心报文。保留 M/D/H、源码函数、操作阶段、本地列类型、远端类型和包装器版本;远端服务器的类型错误要和包装器本地 SQLSTATE 区分。

诊断

确认列和转换方向,查看固定版本包装器的校验器、deparser 与元组转换代码,并比较本地目录类型、必要的 typmod/collation 和远端元数据。不要从通用 cast 或 22xxx 推断 HV004

处理

选择包装器支持的类型映射,或在确认数据兼容后修改外部表定义。若转换由外部扩展实现,应按兼容契约升级或配置;相同元数据下错误是确定性的,不能靠重试解决。

版本

目录从 9.1.0 观察到该码,延续到 18.6 与 19 Beta 3;pre-9 定义扫描未观察到它,精确引入版本未知。

HV006 是类型描述符不一致;HV007 是列名无效;42804 是核心类型不匹配,边界不同。

来源

241 - HV005 — fdw_column_name_not_found(找不到外部列名)

PostgreSQL SQLSTATE HV005 表示包装器在远端或导入描述符中找不到外部列名。应检查元数据和名称映射。

HV005 — fdw_column_name_not_found

速览

HV005 表示包装器无法在相关远端或导入描述符中找到外部列名。18.6 核心/contrib 扫描没有解析出直接报告组,具体系统和报文必须从实际部署的包装器确认。

字段
SQLSTATE HV005
条件名 fdw_column_name_not_found
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_COLUMN_NAME_NOT_FOUND
别名

含义

这是 FDW 边界的名称查找问题:导入或规划得到的列名不在包装器正在使用的描述符中。它不同于外部表缺失,也不同于本地 SQL 的 42703

报文与诊断

没有固定核心报文。保留准确列名、大小写/引号上下文、外部表或远端关系、包装器版本以及导入、规划、扫描还是修改阶段。

诊断

比较 pg_attribute 和包装器的远端元数据及名称转换规则;适用时重新做模式发现或检查导入映射。不能只凭本地目标列表推断远端列存在。

处理

修正外部表列定义或包装器名称映射,并按文档刷新远端模式元数据。描述符一致后再重试;事务重试不能创建缺失列。

版本

目录从 9.1.0 观察到该码,延续到 18.6 与 19 Beta 3;pre-9 定义文件未观察到它,精确引入未知。

HV007 是名称无效;HV008 是序号无效;42703 是本地未定义列。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 描述符回调边界。
  • 结构化证据 — 有界扫描与来源边界。

242 - HV006 — fdw_invalid_data_type_descriptors(外部数据类型描述符无效)

PostgreSQL SQLSTATE HV006 表示 FDW 数据类型描述符不一致或不可用。应检查包装器元数据契约。

HV006 — fdw_invalid_data_type_descriptors

速览

HV006 针对 FDW 边界上无效的数据类型描述符。18.6 定义了它,但核心/contrib 调用扫描没有解析出直接报告组,因此没有自带包装器报文或自然 SQL 复现。

字段
SQLSTATE HV006
条件名 fdw_invalid_data_type_descriptors
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_DATA_TYPE_DESCRIPTORS
别名

含义

它描述的是描述符元数据本身,例如类型 OID、长度、精度或 typmod 与回调契约不一致;不是某一个值转换失败(HV004)。

报文与诊断

没有固定核心报文。记录描述符字段及其值、本地和远端关系、回调阶段、包装器版本及远端元数据响应,不能由条件名拼造报文。

诊断

沿着模式导入/规划到元组转换追踪描述符,查看构造或消费它的包装器回调,并与 fdwapi.h 和固定版本文档比较。扩展二进制与远端模式变更是更有价值的线索。

处理

修正描述符构造,或使外部表元数据与远端模式一致。若问题从扩展升级后出现,验证匹配的服务器/扩展 ABI;描述符修复前不要盲目重试。

版本

锁定目录从 9.1.0 观察到该码,正式快照延续至 18.6,19 Beta 3 也有;pre-9 没有可用观察。

HV004 是类型不匹配;HV021 是更广义的描述符信息不一致;本码聚焦类型描述符字段。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 回调契约。
  • 结构化证据 — 有界扫描与来源边界。

243 - HV007 — fdw_invalid_column_name(外部列名无效)

PostgreSQL SQLSTATE HV007 表示传入 FDW 描述符或回调的列名无效。应检查包装器命名规则和引用方式。

HV007 — fdw_invalid_column_name

速览

HV007 是 FDW 特有的列名无效条件。18.6 核心/contrib 扫描没有直接报告组,因此必须从实际部署确认哪个包装器校验名称及其报文。

字段
SQLSTATE HV007
条件名 fdw_invalid_column_name
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_COLUMN_NAME
别名

含义

传到 FDW API 的名称不符合包装器接受的描述符或远端命名规则。它不同于名称格式正确但找不到的 HV005,也不同于本地 SQL 的 42703

报文与诊断

没有确认的核心报文。记录原始名称、引号和大小写、外部表、回调阶段及包装器版本。

诊断

检查包装器的名称解析和远端标识符规则,比较 pg_attribute.attname、生成的查询标识符和带引号名称。先定位固定版本包装器源码,再决定是否是 PostgreSQL 本身的问题。

处理

使用本地外部表和远端都接受的名称,或配置包装器显式映射;变更元数据后重新构建外部描述符。重复相同语句不会修复名称。

版本

目录从 9.1.0 观察到该码,延续至 18.6 与 19 Beta 3;pre-9 定义扫描未观察到。

HV005 是找不到名称;HV008 是列序号无效;42703 是本地未定义列。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 回调边界。
  • 结构化证据 — 有界扫描与来源边界。

244 - HV008 — fdw_invalid_column_number(外部列号无效)

PostgreSQL SQLSTATE HV008 表示 FDW 描述符中的列序号无效。应检查本地到远端的列映射。

HV008 — fdw_invalid_column_number

速览

HV008 表示 FDW 描述符或回调收到超出范围的列序号。PostgreSQL 18.6 定义了它,但核心/contrib 扫描没有找到直接报告组或自带报文。

字段
SQLSTATE HV008
条件名 fdw_invalid_column_number
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_COLUMN_NUMBER
别名

含义

包装器使用的序号不在当前描述符范围内。这是映射/描述符问题,不代表列名缺失(HV005)或名称不合法(HV007)。

报文与诊断

没有确认的核心报文。保留序号、描述符宽度、本地关系、回调阶段以及包装器/远端元数据版本。

诊断

比较目标列表、pg_attribute.attnum 和包装器远端列数组,检查 dropped 列、投影改写以及规划与执行之间的模式变化;然后查看实际包装器索引描述符的回调。

处理

修正外部表映射或包装器的序号转换后重新规划语句。不要随意删列来掩盖问题,修复取决于错误序号来自哪个描述符边界。

版本

目录从 9.1.0 观察到该码,所有锁定正式快照至 18.6 及 19 Beta 3 均有;pre-9 定义文件未观察到。

HV005 是名称找不到;HV007 是名称无效;HV006 是类型描述符元数据无效。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 回调边界。
  • 结构化证据 — 有界扫描与来源边界。

245 - HV009 — fdw_invalid_use_of_null_pointer(外部数据包装器非法使用空指针)

PostgreSQL SQLSTATE HV009 表示 FDW 违反空指针契约。应定位实际包装器回调并保留失败上下文。

HV009 — fdw_invalid_use_of_null_pointer

速览

HV009 描述 FDW 边界的非法空指针使用。18.6 核心/contrib 调用扫描没有直接报告组,因此没有安全的 SQL 复现或自带报文。

字段
SQLSTATE HV009
条件名 fdw_invalid_use_of_null_pointer
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_USE_OF_NULL_POINTER
别名

含义

它用于包装器/API 契约中的空指针问题,例如包装器把缺少的描述符、handle 或回调结果当成存在。它不是普通 SQL NULL 值错误,不能从可空列推断。

报文与诊断

没有固定核心报文。保留拥有该指针的回调、handle/描述符、包装器构建版本和服务器日志;实现不同也可能表现为崩溃、XX000 或驱动异常。

诊断

在源码证明前,把它按包装器缺陷或契约/ABI 不匹配处理。检查回调实现和版本,确认远端断开或分配失败是否制造了空状态;不要从 SQL 侧解引用或修复对象。

处理

包装器缺陷存在时不要继续重试。保留日志,在一次性环境隔离外部表/服务器,确认后升级或修补包装器;若进程或连接已终止,按相应组件的恢复流程处理。

版本

目录从 9.1.0 观察到该码,延续到 18.6 与 19 Beta 3;pre-9 定义扫描未观察到,精确实现引入未知。

HV00B 是无效 FDW handle;XX000 是更宽的内部错误边界。普通 SQL 空值条件属于 Class 22。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 回调边界。
  • 结构化证据 — 有界扫描与来源边界。

246 - HV00A — fdw_invalid_string_format(外部数据包装器字符串格式无效)

PostgreSQL SQLSTATE HV00A 表示 FDW 无法接受字符串格式。应确认包装器格式语法和操作阶段。

HV00A — fdw_invalid_string_format

速览

HV00A 表示 FDW 边界的字符串格式无效。18.6 核心/contrib 调用扫描没有直接报告组,因此格式语法和报文必须从实际包装器或远端驱动确认。

字段
SQLSTATE HV00A
条件名 fdw_invalid_string_format
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_STRING_FORMAT
别名

含义

包装器拒绝了不符合其语法、转义、编码或格式字段契约的字符串。该码本身不能说明字符串是选项、远端标识符、序列化值还是驱动响应。

报文与诊断

没有确认的核心报文。保留操作、选项或字段名、原始编码/引号、包装器版本和远端诊断,不能只根据条件名改写字符串。

诊断

定位包装器解析或转换函数,按固定版本的格式语法比较原始输入;只在该包装器有明确要求时检查 server encoding 和转义。区分 FDW 选项格式错误、远端 SQL 语法错误和 Class 22 的值格式错误。

处理

按包装器文档修正格式,或改用结构化选项/API,避免手工拼接文本。修改后重新创建计划或外部表元数据;相同字符串重试仍会得到相同校验结果。

版本

目录从 9.1.0 观察到 HV00A,延续至 18.6 与 19 Beta 3;pre-9 定义文件未观察到,精确引入未知。

HV00D 是选项名不被识别;HV004 是类型不匹配;核心文本/值格式错误可能使用 Class 22 条件。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 回调边界。
  • 结构化证据 — 有界扫描与来源边界。

247 - HV00B — fdw_invalid_handle

PostgreSQL SQLSTATE HV00B 表示 FDW 或 SQL/MED 边界收到无效句柄;实际句柄的所有者与生命周期取决于已安装的包装器。

HV00B — fdw_invalid_handle

速览

HV00B 表示 FDW 包装器收到的句柄未知、已关闭,或对当前操作无效。对 PostgreSQL 18.6 核心与 contrib 调用的扫描没有解析出直接的 HV00B 报告组,因此句柄类型和具体消息取决于实现。

字段
SQLSTATE HV00B
条件名 fdw_invalid_handle
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_HANDLE
别名

含义

SQL/MED 中的“句柄”是实现自己管理的引用,不是 PostgreSQL 关系 OID 或 SQL 事务 ID。包装器可能用句柄表示远端连接、游标、回复或执行对象;这些只是可能的例子,本批没有确认具体的发码包装器。仅凭类别定义无法判断具体是哪一种。

消息与诊断

在已检查的 18.6 核心与 contrib 路径中没有解析出直接的消息变体。应记录包装器名称和版本、句柄种类及生命周期、回调阶段、外部服务器和外部表,以及完整诊断信息。远端连接失败也可能使用其他 SQLSTATE。

诊断

沿包装器源码追踪句柄的创建、传递、复用和关闭。检查扫描或修改回调是否晚于连接销毁,回调是否在清理后运行,以及包装器 ABI 是否与服务器匹配。不要把 NULL SQL 值推断为无效句柄。

处理

按包装器 API 修复句柄生命周期,或重新建立包装器管理的连接或对象。如果无法确定写操作是否已经完成,应先查看远端日志再决定是否重试。重复提交相同请求通常不能修复陈旧或已关闭的句柄。

版本

HV00B 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这只是历史边界,不是精确的引入版本结论。

HV00K 涉及回复句柄;HV009 涉及无效空指针使用;HV00N 涉及建立连接。

来源

248 - HV00C — fdw_invalid_option_index

PostgreSQL SQLSTATE HV00C 表示 FDW 实现收到无效的选项索引;具体选项数组和包装器行为必须由实现源码确定。

HV00C — fdw_invalid_option_index

速览

HV00C 表示 FDW 包装器在处理自己的选项数组时收到无效索引。已检查的 PostgreSQL 18.6 核心与 contrib 调用没有解析出直接的 HV00C 报告组,因此不能仅凭条件名推断选项来源。

字段
SQLSTATE HV00C
条件名 fdw_invalid_option_index
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_OPTION_INDEX
别名

含义

包装器实现维护的选项表可能对应连接参数、服务器选项或一次执行的描述符。HV00C 的类别定义没有说明数组布局、索引基数或具体对象。

消息与诊断

已检查的 18.6 核心与 contrib 路径没有解析出直接消息。记录包装器和版本、对象类型、选项表或描述符阶段、索引值,以及完整的 detail 和 hint;若错误来自驱动或应用层,应保留其原始诊断。

诊断

从产生索引的解析或遍历代码开始,检查选项表长度、边界判断和对象生命周期。把服务器、外部表、用户映射与导入选项区分开;HV00D 是无效选项名称,不能用它替代索引边界诊断。

处理

修复包装器生成或传递索引的逻辑,或者按该包装器支持的选项接口重新构造对象。只有在实际证据表明扩展与服务器 ABI 不匹配时,才安排版本调整。重复同一选项定义不会改变索引边界。

版本

HV00C 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这表示历史资料边界,不是精确引入版本。

HV00D 表示无效选项名称;HV00B 表示无效句柄;HV00J 是 dblink 的选项名未找到条件。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用回调接口边界。
  • 结构化证据 — 有界源码扫描。

249 - HV00D — fdw_invalid_option_name

PostgreSQL SQLSTATE HV00D 表示 FDW 实现不接受当前上下文中的选项名称;file_fdw 与 postgres_fdw 提供了具体消息和提示。

HV00D — fdw_invalid_option_name

速览

当 FDW 选项名称不符合当前包装器上下文时,会产生 HV00D。PostgreSQL 18.6 在 file_fdwpostgres_fdw 以及 postgres_fdw 的导入选项解析器中都有直接路径。

字段
SQLSTATE HV00D
条件名 fdw_invalid_option_name
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_OPTION_NAME
别名

含义与消息

包装器会按当前上下文检查选项:可能是 FDW、服务器、外部表、用户映射或导入。18.6 的主消息模板是 invalid option "%s"file_fdwpostgres_fdw/option.c 只有在找到足够相近名称时才提示 Perhaps you meant the option "%s".;若存在合法选项但没有相近候选,源码不发送 hint;只有不存在任何合法选项时才提示 There are no valid options in this context.postgres_fdw 导入解析器只有主消息。

诊断

记录正在修改的对象和包装器版本,然后查看该包装器的验证逻辑与选项表。确认选项属于服务器、外部表还是用户映射;同名选项可能只在其中一个范围有效。保留消息中的相近名称,不要套用其他包装器的选项表。

处理

使用已安装包装器在该范围支持的名称,或删除不支持的选项。若选项来自较新的扩展,先确认版本差异确实是原因,再协调扩展与服务器版本。重复相同定义不会改变验证结果。

消息与诊断

18.6 的确认路径位于 file_fdwpostgres_fdw 选项验证器和 postgres_fdw 导入选项解析器,严重级别均为 ERROR%s 代表动态选项名称或相近名称;提示会随匹配结果变化。

版本

HV00D 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。固定的 REL9_6_24 file_fdwpostgres_fdw 验证器快照使用较早的 Valid options in this context are: %s 提示,而固定的 18.6 路径使用相近名称或无可用选项的提示。这两个快照只界定措辞范围,不能确定具体切换版本;比较日志时应以实际安装版本为准。

HV00C 涉及选项索引;HV00J 是 dblink 的选项名称未找到条件;HV00A 涉及字符串格式而不是选项身份。

来源

250 - HV00J — fdw_option_name_not_found

PostgreSQL SQLSTATE HV00J 是 dblink 的选项名称未找到条件,与 postgres_fdw 和 file_fdw 的 FDW 选项验证分开。

HV00J — fdw_option_name_not_found

速览

当 dblink 的连接选项不在接受的 dblink/libpq 选项集合中时,会使用 HV00J。dblink 是独立的 contrib 客户端 API,不是 FDW 回调实现;18.6 核心与 contrib 扫描没有解析出其他 HV00J 报告组。

字段
SQLSTATE HV00J
条件名 fdw_option_name_not_found
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_OPTION_NAME_NOT_FOUND
别名

含义与消息

在 dblink 的选项解析路径中,ERROR 的主消息为 invalid option "%s"。只有找到相近名称时才提示 Perhaps you meant the option "%s".;若存在合法选项但没有相近候选,源码不发送 hint;只有不存在任何合法选项时才提示 There are no valid options in this context.。固定的 REL9_6_24 dblink 快照显示较早的动态 Valid options in this context are: %s 提示;这只是有界比较,不代表精确的切换版本。

诊断

确认该选项属于 dblink 连接字符串或选项列表,并查看安装版本对应的 libpq 选项名称。保留确切选项名、dblink/libpq 版本,以及错误是否发生在解析连接定义时。不要把 postgres_fdw 的选项表用于 dblink。

处理

改用 dblink/libpq 支持的名称,或删除该选项,并保留相近名称提示作为线索。重新校验连接定义即可;无效选项名称是确定性的,不需要重试数据库事务。

诊断边界

确认的实现是 dblink 的选项解析器。本批没有运行自然环境实验,源码证据也不表示远端连接已经成功或失败。

版本

该条件从 9.1.0 到 18.6 以及 19 Beta 3 均存在。固定的 18.6 与 REL9_6_24 dblink 快照显示了不同的提示措辞;它们界定已观察版本,但不确定切换版本。解读日志时应匹配实际安装版本。

HV00D 涵盖 file_fdw/postgres_fdw 的选项名称;HV00N 涉及建立连接;HV001 涉及获取 libpq 默认值时的内存分配失败。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • dblink.c — 18.6 dblink 选项解析器。
  • REL9_6_24 中的 dblink.c — 有界历史提示比较;SHA-256 ff331aac2153e21aa88cc6c4e656ab00b0593744062270849f27281434db3b55。
  • 结构化证据 — 消息、detail 和 hint 的分组。

251 - HV00K — fdw_reply_handle

PostgreSQL SQLSTATE HV00K 表示 FDW 包装器收到无效的回复句柄;具体回复对象和生命周期由实现决定。

HV00K — fdw_reply_handle

速览

HV00K 表示包装器在读取、消费或关闭回复时收到无效的回复句柄。已检查的 PostgreSQL 18.6 核心与 contrib 调用没有解析出直接的 HV00K 报告组,因此不能由条件名确定回复来自哪个协议或驱动。

字段
SQLSTATE HV00K
条件名 fdw_reply_handle
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_REPLY_HANDLE
别名

含义

回复句柄通常由包装器或客户端 API 管理,可能指向结果集、消息缓冲区或异步响应。该条件定义没有规定对象布局、有效时长或是否允许重复读取。

消息与诊断

没有解析出直接的 18.6 核心或 contrib 消息。记录句柄类型、创建和消费阶段、请求是否已经关闭、相关服务器或外部表,以及完整的 detail 和 hint。

诊断

检查回复句柄是否跨越了错误的回调边界,是否被提前释放或重复消费,并核对包装器与驱动的 ABI 和版本。区分回复句柄失效与远端返回的业务错误。

处理

按包装器 API 修复回复对象的所有权和关闭顺序,必要时重新执行能够安全重做的读取。若写请求的完成状态不明,先根据远端日志和包装器文档确认幂等性,再决定是否重新发送。

版本

HV00K 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这是资料边界,不是精确引入版本。

HV00B 是一般无效句柄;HV00M 涉及创建回复失败;HV00N 涉及建立连接。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用回调接口边界。
  • 结构化证据 — 有界源码扫描。

252 - HV00L — fdw_unable_to_create_execution

PostgreSQL SQLSTATE HV00L 表示 FDW 包装器无法创建执行对象;实际资源、阶段和修复方式取决于包装器实现。

HV00L — fdw_unable_to_create_execution

速览

HV00L 表示 FDW 在准备一次执行时无法创建自己的执行对象。已检查的 PostgreSQL 18.6 核心与 contrib 调用没有解析出直接的 HV00L 报告组,不能据此指定连接、内存或远端协议原因。

字段
SQLSTATE HV00L
条件名 fdw_unable_to_create_execution
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_UNABLE_TO_CREATE_EXECUTION
别名

含义

条件名描述包装器在使用执行对象前创建它时发生失败。该对象可能承载扫描、修改或远端请求状态;只有包装器源码才能确定具体对象以及失败发生在计划、启动、执行还是清理阶段。

消息与诊断

没有解析出直接的 18.6 核心或 contrib 消息。应保存操作类型、扫描或修改阶段、外部服务器和表、连接或描述符状态,以及完整诊断。

诊断

沿包装器创建执行对象的函数检查输入描述符、资源分配和连接状态。把创建对象失败与随后收到的远端错误分开,并核对包装器版本与服务器回调 ABI。

处理

按实际包装器的资源和生命周期契约修复执行对象创建条件。只有在证据指向扩展二进制或 ABI 不匹配时才调整版本;在执行状态未知时,先确认请求是否已经到达远端,再决定是否重做。

版本

HV00L 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这是历史资料边界。

HV00M 涉及创建回复对象;HV00K 涉及回复句柄;HV000 是一般 FDW 错误。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用回调接口边界。
  • 结构化证据 — 有界源码扫描。

253 - HV00M — fdw_unable_to_create_reply

PostgreSQL SQLSTATE HV00M 表示 FDW 包装器无法创建回复对象;具体结果状态由包装器实现决定。

HV00M — fdw_unable_to_create_reply

速览

HV00M 表示 FDW 无法建立用于保存返回结果的回复对象。已检查的 PostgreSQL 18.6 核心与 contrib 调用没有解析出直接的 HV00M 报告组,因此不能从条件名推断是内存、连接还是协议失败。

字段
SQLSTATE HV00M
条件名 fdw_unable_to_create_reply
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_UNABLE_TO_CREATE_REPLY
别名

含义

回复对象可能承载结果集、远端消息或异步请求状态。该类别定义没有规定对象布局、分配时机,也没有把它限定为某一个 FDW 或驱动。

消息与诊断

没有解析出直接的 18.6 核心或 contrib 消息。记录操作类型、回复创建阶段、相关连接或执行句柄、外部服务器和表,以及完整 detail 和 hint。

诊断

检查包装器创建回复对象前后的资源分配、连接状态和错误清理。确认失败发生在本地结果对象创建,而不是远端返回了应用错误;同时核对包装器与服务器的 ABI。

处理

按包装器 API 修复回复对象的分配和所有权管理。只有在证据明确指向扩展二进制或 ABI 不匹配时才调整版本;如果请求是否完成不明,应先查看远端状态再决定是否重做。

版本

HV00M 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这是历史资料边界。

HV00L 涉及创建执行对象;HV00K 涉及回复句柄;HV00B 是一般无效句柄。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用回调接口边界。
  • 结构化证据 — 有界源码扫描。

254 - HV00N — fdw_unable_to_establish_connection

PostgreSQL SQLSTATE HV00N 表示 FDW 无法建立连接;具体连接入口、阶段和诊断必须来自实际包装器。

HV00N — fdw_unable_to_establish_connection

速览

HV00N 表示 FDW 在需要连接时未能建立连接。已检查的 PostgreSQL 18.6 核心与 contrib 调用没有解析出直接的 HV00N 报告组;检查到的 postgres_fdw 和 dblink 路径使用了其他 SQLSTATE,不能作为本条件的实现证据。

字段
SQLSTATE HV00N
条件名 fdw_unable_to_establish_connection
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_UNABLE_TO_ESTABLISH_CONNECTION
别名

含义

条件名描述连接建立阶段,但类别定义没有说明连接由哪个 FDW、驱动或外部服务管理,也没有指定 DNS、认证、网络或资源原因。

消息与诊断

没有解析出直接的 18.6 核心或 contrib 消息。保留包装器和驱动版本、连接选项(隐藏凭据)、连接建立阶段、外部服务器,以及完整的 detail 和 hint。实际 SQLSTATE 应以运行中的包装器为准。

诊断

定位实际包装器的连接函数,按其日志区分解析选项、建立套接字、认证和会话初始化。检查外部服务器地址、映射用户和驱动日志;不要把所有连接错误归入 HV00N

处理

按实际诊断修复地址、认证、网络或包装器配置,并在连接状态明确后重新执行安全的操作。若请求可能已经到达远端,先确认远端状态再重试;不要只因条件名就重装扩展或反复重连。

版本

HV00N 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。可用的 9.1 之前定义扫描没有观察到它;这是历史资料边界。

HV00J 是 dblink 的选项名未找到;HV00B 是无效句柄;08001 是客户端连接异常类别中的常见条件。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用回调接口边界。
  • 结构化证据 — 有界源码扫描。

255 - HV00P — fdw_no_schemas

PostgreSQL SQLSTATE HV00P 表示 FDW 不支持 IMPORT FOREIGN SCHEMA;核心命令直接检查包装器回调。

HV00P — fdw_no_schemas

速览

当选定的 FDW 没有 ImportForeignSchema 回调时,核心的 IMPORT FOREIGN SCHEMA 命令会产生 HV00P。它表示包装器不支持该导入机制,不表示远端模式为空。

字段
SQLSTATE HV00P
条件名 fdw_no_schemas
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_NO_SCHEMAS
别名

含义与消息

fdw_routine->ImportForeignSchema 为空时,核心路径以 ERROR: foreign-data wrapper "%s" does not support IMPORT FOREIGN SCHEMA 报告。包装器名称是动态字段;此时未必已经查询远端模式。

诊断

确认 SERVER 子句中的 FDW,并检查其 handler 是否实现 ImportForeignSchema。将这种能力缺失与 HV00Q 区分开;后者是 postgres_fdw 支持导入却找不到请求的远端模式。

处理

使用显式的 CREATE FOREIGN TABLE 定义,改用实现了模式导入的包装器,或为包装器增加受支持的回调。对同一个 handler 重复执行相同的 IMPORT FOREIGN SCHEMA 只会得到同一能力错误。

消息与诊断

确认的严重级别为 ERROR,该调用组没有 detail 或 hint。保留 fdwname、服务器身份和 handler 扩展版本。

版本

锁定的 9.1.0 及后续快照中已有 HV00P 条件定义,但这不表示 IMPORT FOREIGN SCHEMA 在 9.1 已存在。固定的 PostgreSQL 9.5.0 源码快照已经包含该命令及其 ImportForeignSchema 回调;上面的 18.6 路径是本文确认的当前消息实现。没有可用的 9.1 之前定义观察资料。

HV00Qpostgres_fdw 找不到远端模式;HV00D 是无效选项名称;HV000 是一般 FDW 错误。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • foreigncmds.c — 回调检查与消息。
  • fdwapi.hImportForeignSchema 回调定义;SHA-256 572ba892e6435ca92d3b3bc84dde5bbd3160cc3a082693daab8daa835c4d2cd7
  • REL9_5_0 快照中的 foreigncmds.c — 命令及回调的功能边界;SHA-256 d2ab3a8883ed1e27c38a0a7ff83f0fc9d493c488d7e30f56eef7d1ae449f9a16
  • 结构化证据 — 来源路径和有界运行范围。

256 - HV00Q — fdw_schema_not_found

PostgreSQL SQLSTATE HV00Q 表示 postgres_fdw 在 IMPORT FOREIGN SCHEMA 期间找不到请求的远端模式。

HV00Q — fdw_schema_not_found

速览

HV00Q 是具体的 postgres_fdw 导入错误。远端连接会按请求的 nspname 精确查询 pg_catalog.pg_namespace;结果行数不是恰好一行时,包装器按名称报告远端模式不存在。

字段
SQLSTATE HV00Q
条件名 fdw_schema_not_found
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_SCHEMA_NOT_FOUND
别名

含义与消息

postgres_fdw.c:5515-5526 的导入路径在映射的远端连接上发送 SELECT 1 FROM pg_catalog.pg_namespace WHERE nspname = ...,检查 PQntuples(res) != 1,再报告 ERROR: schema "%s" is not present on foreign server "%s"。请求的远端模式和服务器名称都是动态字段。这个固定查询不使用本地 search_path;连接或查询错误会在更早路径报告,后续远端权限则是导入成功后的另一项检查。

诊断

检查 IMPORT FOREIGN SCHEMA 的源名称、远端数据库、映射用户和 postgres_fdw 服务器选项。确认映射的远端连接能按精确名称执行固定的 pg_catalog.pg_namespace 查询;不要用本地 search_path 推断这一分支。将零行或异常行数与更早发生的连接/查询错误区分开,并在导入继续后另行检查远端模式和表权限。

处理

使用远端模式的确切名称,在适当时创建远端模式,或改用正确的外部服务器和数据库。自动提交时,只有远端目录状态或用户映射修正后才重新导入。显式事务中的 ERROR 会使本地事务失败;重试修正后的导入前,先执行 ROLLBACK,或回滚到此前已经建立且仍可用的保存点,不要在 INERROR 事务中重放命令。

消息与诊断

确认的调用组严重级别为 ERROR,主消息是 schema "%s" is not present on foreign server "%s",没有 detail 或 hint。保留远端模式和服务器值,以及包装器版本。

版本

HV00Q 从 9.1.0 到 18.6 以及 19 Beta 3 均存在。旧版本的措辞或目录查询细节可能不同;18.6 路径固定于指定提交。

HV00P 表示包装器不支持模式导入;3D000 是本地数据库不存在;HV00D 涉及无效包装器选项。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • postgres_fdw.c — 远端 pg_namespace 查询、结果检查与消息。
  • 事务与保存点恢复 — 显式事务恢复边界;固定 xact.sgml SHA-256 b48fbe8bd02ce3d1181a350c88c8baa6e11c73edc90a936e77b180daef328c5c
  • 结构化证据 — 来源路径和消息分组。

257 - HV00R — fdw_table_not_found

PostgreSQL SQLSTATE HV00R 表示 FDW 边界上的表未找到条件;涉及哪次表查找以及如何诊断取决于实际包装器。

HV00R — fdw_table_not_found

速览

HV00R 表示 FDW 类别中的表未找到条件。锁定的 PostgreSQL 18.6 核心与 contrib 调用扫描没有解析出 HV00R 报告组,因此不能据此指定核心发射点、远端目录或消息模板。

字段
SQLSTATE HV00R
条件名 fdw_table_not_found
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_TABLE_NOT_FOUND
别名

含义

该条件名指向 FDW 操作无法满足的一次表查找。表可能是远端对象、包装器侧映射或其他实现管理的名称;SQLSTATE 定义本身无法在它们之间作出选择。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接 HV00R 消息变体。解释前应保留完整诊断、包装器和驱动版本、外部服务器与表身份、操作阶段,以及远端返回的消息。

诊断

定位已安装包装器的表查找函数及其 SQLSTATE 映射。检查确切的外部表或远端关系名、数据库/模式上下文、映射用户,以及错误发生在规划、执行还是元数据发现阶段。不要把每个零行查询都理解为此条件。

处理

修正包装器诊断所指向的表或映射,或改用操作实际指定的远端对象和服务器。如果无法确定此前写操作是否完成,应先检查远端状态再重做;无关的 FDW 选项变化不能解释此条件。

版本

HV00R 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV021 涉及描述符信息不一致;HV010 涉及 FDW 函数顺序;HV00Q 是具体的 postgres_fdw 远端模式条件。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

258 - HV010 — fdw_function_sequence_error

PostgreSQL SQLSTATE HV010 表示 FDW 函数调用顺序条件;必须从实际实现确定包装器和回调阶段。

HV010 — fdw_function_sequence_error

速览

HV010 表示 FDW 函数以无效顺序被调用。固定的 18.6 核心与 contrib 调用扫描没有解析出 HV010 报告组,因此不能确认核心回调或消息。

字段
SQLSTATE HV010
条件名 fdw_function_sequence_error
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_FUNCTION_SEQUENCE_ERROR
别名

含义

该条件涉及包装器操作的顺序或生命周期。fdwapi.h 定义规划和外部扫描等回调入口,但这只是 API 背景,不会发出 HV010,也不规定每个包装器的合法顺序。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留完整消息、回调名称、操作阶段、包装器/驱动版本,以及调用发生在规划、扫描启动、迭代、重扫描、修改还是清理之后。

诊断

围绕失败回调追踪包装器状态机。确认哪个对象已经初始化、回调是否重复或遗漏,以及清理是否早于后续调用。应以包装器自身契约和源码映射判断顺序错误发生在本地还是远端。

处理

恢复已安装包装器及其回调契约要求的调用顺序,再从新对象状态验证同一操作。不要盲目重复回调:包装器可能已经发出远端请求或释放了状态。

版本

HV010 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不能证明精确引入版本。

HV00B 涉及无效句柄;HV00K 涉及回复句柄;HV009 涉及无效空指针使用。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

259 - HV014 — fdw_too_many_handles

PostgreSQL SQLSTATE HV014 表示 FDW 句柄数量达到限制;资源所有者和限制范围来自实际包装器。

HV014 — fdw_too_many_handles

速览

HV014 表示 FDW 出现句柄过多条件。锁定的 PostgreSQL 18.6 核心与 contrib 调用扫描没有解析出 HV014 报告组,因此不能归因于某个核心句柄限制或消息。

字段
SQLSTATE HV014
条件名 fdw_too_many_handles
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_TOO_MANY_HANDLES
别名

含义

句柄可能是实现管理的连接、游标、结果或执行对象引用。类别定义没有指定句柄类型、限制范围,也没有说明限制属于包装器、驱动还是远端服务。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留完整诊断、句柄类型、若报出的计数或限制、操作阶段、包装器/驱动版本和外部服务器身份。

诊断

找到包装器分配或追踪句柄的代码,确认限制是每条语句、会话、进程、服务器还是远端连接级别。检查错误后的句柄是否没有关闭,但仍以包装器自己的所有权规则为准。

处理

关闭或释放包装器明确指出不再需要的句柄;确认范围后再使用其支持的池化或限制配置。如果失败操作可能已到达远端,应先核实远端状态再重试。

版本

HV014 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV00B 是无效句柄条件;HV00K 涉及回复句柄;HV00L 涉及创建执行对象。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

260 - HV021 — fdw_inconsistent_descriptor_information

PostgreSQL SQLSTATE HV021 表示 FDW 描述符信息不一致;必须从包装器实现确定描述符和生产者。

HV021 — fdw_inconsistent_descriptor_information

速览

HV021 表示 FDW 描述符中的信息不一致。18.6 核心与 contrib 调用扫描没有解析出 HV021 报告组,因此不能指定核心描述符检查或消息。

字段
SQLSTATE HV021
条件名 fdw_inconsistent_descriptor_information
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INCONSISTENT_DESCRIPTOR_INFORMATION
别名

含义

描述符可能描述列、类型、名称、长度或其他包装器结果契约。fdwapi.h 展示回调和 slot 边界,但没有说明哪种描述符差异会映射到此 SQLSTATE。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留完整诊断、描述符类型、消息中出现的期望值和实际值、回调阶段、包装器/驱动版本及关系身份。

诊断

比较包装器提供的描述符与回调或消费者期待的描述符。只有包装器或诊断明确支持时,才检查模式变化、类型与列顺序、可空性或长度元数据;不要从一般转换失败推断描述符不一致。

处理

修正实际诊断所指向的包装器描述符构造或远端/模式契约,然后重新建立受影响的计划或对象。若元数据没有改变,重复同一操作不能修复描述符。

版本

HV021 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV008 涉及 FDW 列序列;HV091 涉及描述符字段标识符;HV024 涉及属性值。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

261 - HV024 — fdw_invalid_attribute_value

PostgreSQL SQLSTATE HV024 表示 FDW 属性值无效;相关属性和验证器取决于具体实现。

HV024 — fdw_invalid_attribute_value

速览

HV024 表示 FDW 边界拒绝某个属性值。锁定的 PostgreSQL 18.6 核心与 contrib 调用扫描没有解析出 HV024 报告组,因此不能确认具体属性或消息。

字段
SQLSTATE HV024
条件名 fdw_invalid_attribute_value
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_ATTRIBUTE_VALUE
别名

含义

属性可能是包装器选项、描述符属性、列属性或连接属性,具体取决于实现。SQLSTATE 定义不提供可接受的值集合,也不说明验证在本地还是远端进行。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留原样呈现的属性名和值、操作阶段、包装器/驱动版本、外部服务器和表,以及 detail 或 hint。

诊断

定位诊断所指向的包装器或驱动验证器,并按该版本的文档或源码比较值域。将无效值与未知属性名区分开;只有实际 SQLSTATE 为 HV00D 时,后者才可能相关。

处理

使用实际验证器接受的值,或修正提供该值的对象/远端定义。在确认验证器支持的值域前,不要只扩大取值范围或重复不变的请求。

版本

HV024 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV00D 涉及无效选项名称;HV021 涉及描述符信息不一致;HV090 涉及字符串或缓冲区长度。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

262 - HV090 — fdw_invalid_string_length_or_buffer_length

PostgreSQL SQLSTATE HV090 表示 FDW 字符串或缓冲区长度条件;缓冲区所有者和有效边界来自实际包装器或驱动。

HV090 — fdw_invalid_string_length_or_buffer_length

速览

HV090 表示 FDW 边界上的字符串长度或缓冲区长度无效。锁定的 18.6 核心与 contrib 调用扫描没有解析出 HV090 报告组,因此不能确认核心缓冲区检查或消息。

字段
SQLSTATE HV090
条件名 fdw_invalid_string_length_or_buffer_length
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH
别名

含义

该条件可能涉及字符串长度、目标缓冲区或包装器定义的长度字段。定义没有说明无效值来自远端响应、驱动还是本地包装器代码。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留完整诊断、其中披露的长度和缓冲区上下文、编码或类型上下文、回调阶段及包装器/驱动版本。

诊断

追踪包装器进行长度验证和分配的边界。按该实现使用的单位和边界比较值;只有源码或诊断支持时,才区分字节与字符。

处理

修正提供无效长度的生产者或选项,或使用包装器支持的缓冲区/编码路径。不要盲目截断值;先确认包装器契约和远端请求是否已发出。

版本

HV090 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV024 涉及无效属性值;HV00A 涉及无效字符串格式;HV091 涉及描述符字段标识符。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

263 - HV091 — fdw_invalid_descriptor_field_identifier

PostgreSQL SQLSTATE HV091 表示 FDW 描述符字段标识符无效;描述符 API 和字段命名空间必须来自具体实现。

HV091 — fdw_invalid_descriptor_field_identifier

速览

HV091 表示 FDW 边界无法使用某个描述符字段标识符。锁定的 PostgreSQL 18.6 核心与 contrib 调用扫描没有解析出 HV091 报告组,因此不能确认具体描述符命名空间或消息。

字段
SQLSTATE HV091
条件名 fdw_invalid_descriptor_field_identifier
状态 有效
已知存在于 9.1.0
锁定快照 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_FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER
别名

含义

字段标识符可能在包装器管理的接口中选择名称、类型、长度或其他描述符属性。通用 FDW 回调签名没有定义此 SQLSTATE 的字段命名空间。

消息与诊断

没有解析出 18.6 核心与 contrib 的直接消息变体。保留完整诊断、描述符类型、字段标识符、消息中出现的期望命名空间、回调阶段和包装器/驱动版本。

诊断

识别描述符生产者和消费者,再按该实现的文档或源码比较字段标识符。除非包装器明确规定映射,否则不要把它替换成列序号。

处理

使用实际描述符接口支持的字段标识符;只有源码证实存在生产者/消费者版本不匹配时,才调整相应版本。重复同一查找不能使未知标识符生效。

版本

HV091 在锁定定义快照 9.1.24 至 18.6 以及 19 Beta 3 中存在,known_present_by 为 9.1.0。现有 9.1 之前定义资料不足以确定精确引入版本。

HV021 涉及描述符信息不一致;HV008 涉及 FDW 列序列;HV090 涉及字符串或缓冲区长度。

来源

  • errcodes.txt — 定义,SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba
  • fdwapi.h — 通用 FDW 回调接口边界。
  • 结构化证据 — 18.6 固定来源与有界扫描。

264 - P0000 — plpgsql_error

PostgreSQL SQLSTATE P0000 的源码与诊断参考。

P0000

速览

P0000 是 PostgreSQL 专用 plpgsql_error 类别项。固定 18.6 调用归档没有解析出该类别码本身的报告路径,因此不能把成员码的行为倒推成 P0000 发出的错误。

字段
SQLSTATE P0000
条件名 plpgsql_error
状态 有效
已知存在于 8.0.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_PLPGSQL_ERROR
别名

含义

它表示 PL/pgSQL Error 类别的目录身份。实际执行路径可能选择更具体的成员 SQLSTATE,例如 P0002P0003P0004;类别定义和成员实现不能互相替代。

诊断

以客户端或日志中实际收到的 SQLSTATE 为准,再按该码检查 PL/pgSQL 的执行上下文。若只知道错误来自 PL/pgSQL 而没有 SQLSTATE,应保留完整诊断字段,并检查部署版本和自定义代码,而不是直接归类为 P0000。

处置

根据实际成员码修正对应的 PL/pgSQL 语句、函数契约或异常处理。只有定义层面的 P0000 信息时,无法给出更窄的 SQL 操作建议;应继续定位实际报告路径。

版本

锁定目录从 8.0.0 记录该类别项,并在列出的正式快照及 19beta3 中出现;有界源码扫描未确认其自然报告路径。

P0002, P0003, P0004

来源

详见结构化的证据记录,其中列出固定源码链接、消息模板与范围限制。

265 - P0001 — raise_exception(引发异常)

PostgreSQL 使用 SQLSTATE P0001 表示没有显式条件名或 SQLSTATE 的 PL/pgSQL RAISE EXCEPTION。应按应用控制流诊断,并在正确的事务边界恢复。

速览

P0001 是 PostgreSQL 专用类别 P0(PL/pgSQL Error)中的 raise_exception 条件。不写条件名、也不写显式 SQLSTATE 的 RAISE EXCEPTION 会默认使用这个代码。报文由函数作者提供,因此 P0001 通常是应用或过程的控制信号,而不是某个服务器子系统的诊断。

严重级别和代码是两个选择。EXCEPTIONRAISE 的默认级别,通常会中止当前事务。NOTICEWARNINGINFOLOGDEBUG 只按对应优先级生成消息;显式的 ERRCODE 也可以选择其他 SQLSTATE。读取时应始终同时记录严重级别和 SQLSTATE。

代表性案例 plpgsql_raise_exception 创建包含 RAISE EXCEPTION 'calibration exception' 的函数,调用它,再在同一自动提交连接上执行 SELECT 1。PostgreSQL 18.6 和 10.21 都返回 P0001、保留该报文,连接状态为 IDLE,并接受后续查询。下面的 SQL 摘录是共享注册表中的完整有序函数、调用和后续语句;实际运行中的模式限定函数名和清理由测试执行器统一管理。

字段
SQLSTATE P0001
条件名 raise_exception
状态 有效
已知存在于 8.0.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_RAISE_EXCEPTION
别名

含义与触发路径

18.6 目录把 P0001 放在 PostgreSQL 专用的 P0 类 PL/pgSQL Error 中,并命名为 raise_exception。在 PL/pgSQL 执行器中,只有在未提供代码且级别不低于 ERROR 时才设置默认代码;之后执行器会报告调用方的报文,并附带可选的详细信息、提示和对象字段。

语法支持几条不同路径:

  • RAISE EXCEPTION 'message' 默认使用 P0001
  • RAISE EXCEPTION condition_name 使用该条件自己的 SQLSTATE,因此不一定是 P0001
  • RAISE EXCEPTION SQLSTATE '5-character-code'RAISE ... USING ERRCODE = ... 可以让过程暴露特定领域契约。除 00000 外,PostgreSQL 允许使用自选的五字符代码。
  • 较低级别的 RAISE WARNING 'message' 只按该优先级送出消息。即使调用方显式选择了错误码,它也不是 RAISE EXCEPTION 的同一种事务事件。

无参数的 RAISE; 是活动异常处理器中的重新抛出控制。它的行为和 SQLSTATE 由正在重新抛出的异常决定,不是一次新的默认 P0001 事件。

报文与诊断

代表性注册表操作如下:

CREATE FUNCTION raise_exception_case() RETURNS void
LANGUAGE plpgsql AS $$
BEGIN
    RAISE EXCEPTION 'calibration exception';
END
$$;
SELECT raise_exception_case();
SELECT 1;

实际运行的函数名由测试执行器生成并带模式限定。18.6 观察到的诊断是:

SQLSTATE: P0001
severity: ERROR
message_primary: calibration exception
context: PL/pgSQL function ...raise_exception_case() line 3 at RAISE
source: pl_exec.c / exec_stmt_raise / line 3923

P0001 没有统一的英文主报文,具体内容由函数提供。USING MESSAGEDETAILHINTCOLUMNCONSTRAINTDATATYPETABLESCHEMA 可以添加结构化诊断。消息文本可以本地化而 SQLSTATE 保持不变,因此应按 P0001 分支,再读取结构化字段,不要解析主报文字符串。

诊断

先判断该代码是否来自有意的 RAISE EXCEPTION,还是函数显式选择了某个领域条件。记录 SQLSTATE、本地化和未本地化严重级别、主报文、详细信息、提示、上下文、源码位置以及调用函数的语句。在 PL/pgSQL 处理器中,SQLSTATESQLERRM 表示当前异常,GET STACKED DIAGNOSTICS 可以取出其字段。

随后定位函数分支及其事务上下文。自动提交下的失败调用只结束该语句,连接仍可执行下一条命令,代表性案例正是如此。显式事务中的调用通常会让事务进入中止状态,直到客户端执行 ROLLBACK 或回滚到保存点;服务器连接本身不一定终止。

EXCEPTION 子句会改变边界。受保护主体在子事务中运行;主体出错后,主体内对持久数据库状态的修改会先回滚,再执行第一个匹配的条件处理器,块外的修改仍保留。WHEN OTHERS 匹配除 QUERY_CANCELEDASSERT_FAILURE 以外的所有错误,范围很宽,不能用它代替对目标 P0001 路径的识别。

处理

当过程确实要暴露通用的 PL/pgSQL RAISE 契约时使用 P0001。如果调用方需要区分校验、冲突、配额或其他业务结果,应选择并记录合适的 SQLSTATE,并补充便于处理的 DETAILHINT。不要为了简化应用代码就把无关的服务器错误都改成 P0001

在客户端边界,显式事务需要先回滚后再执行无关命令;如果可以隔离函数调用,则使用保存点。在 PL/pgSQL 中,恢复逻辑明确时优先使用 WHEN raise_exceptionWHEN SQLSTATE 'P0001' 这样的窄处理器。如果确实需要宽处理器,请先保存 RETURNED_SQLSTATEMESSAGE_TEXTPG_EXCEPTION_DETAILPG_EXCEPTION_HINT 和上下文,再决定继续还是重新抛出。

自然的 RAISE EXCEPTION 案例可以安全演示,因为它测试的正是预期的 PL/pgSQL 机制。这并不使 P0001 成为服务器故障证据;它是函数明确引发的异常。

版本

目录记录 P0001 存在于锁定的 8.0.0–8.4.22 pre-9.0 正式源码、9.0.23 至 18.6 的全部正式快照及 19 Beta 3 预览快照。同 tag 的 REL8_1_4 errcodes.sgml 表已经列出 P0001 和条件名 raise_exception,因此至少可以确认 8.1.4 已有该条件名。9.0 头文件视图中的类标题为 PL/pgSQL Error (PostgreSQL-specific error class),到 9.1 的文本定义变为 PL/pgSQL Error。7.0–7.3 仍有候选源码缺口;这些是目录观察边界,不是实现引入日期的断言。

18.6 固定源码 commit 为 724edf9bde9d356724ad384a2e196edc3c9f80f7。默认 RAISE EXCEPTION 规则有 PostgreSQL 18 文档和 18.6 执行器源码两方面依据。代表性案例在 PostgreSQL 18.6 和 10.21 上通过;它没有覆盖每一种自定义代码、处理器或事务模式。

P0000plpgsql_error 是更宽的 PL/pgSQL 专用类条件。P0002no_data_foundP0003too_many_rowsP0004assert_failure 是独立的 P0 条件。25P02in_failed_sql_transaction 描述未处理异常中止显式事务后的后续状态。XX000internal_error 是服务器内部错误代码,不应作为有意 RAISE 的同义词。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留共享注册表、两个目标摘要和 P0001-snippet-registry-final-20260909 运行 ID。

266 - P0002 — no_data_found

PostgreSQL SQLSTATE P0002 的源码与诊断参考。

P0002

速览

P0002 是 PL/pgSQL 专用的 no_data_found。固定源码确认它既有 PL/pgSQL 查询契约中的 ERROR,也有核心 tablespace 路径中的 NOTICE;不能把它等同于所有返回零行的 SELECT。

字段
SQLSTATE P0002
条件名 no_data_found
状态 有效
已知存在于 8.2.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_NO_DATA_FOUND
别名

含义

在 PL/pgSQL 固定路径中,受检查的查询没有返回行时会报告 query returned no rows,若启用 strict 参数打印还会附带 parameters: %s detail。另一个固定路径在 tablespace 没有匹配 relation 时以 NOTICE 使用同一 SQLSTATE。

诊断

先确认完整 message 和 severity,再定位操作。PL/pgSQL 路径要检查目标赋值、严格单行契约和 print_strict_params;tablespace NOTICE 则检查目标 tablespace 与匹配 relation。普通查询返回零行本身不会自动等于 P0002。

处置

对 PL/pgSQL 严格查询,修正查询预期、目标赋值或显式处理无行分支;也可以在明确业务允许时改用不要求单行的逻辑。对 tablespace NOTICE,先核对没有匹配 relation 是否符合预期;如果这是正常结果,无需修复,否则再修正目标后继续。不要仅因零行就自动重试。

版本

锁定目录从 8.2.0 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码还显示它可以是 ERROR 或 NOTICE。

P0003, P0004, 02000

来源

可直接阅读固定的 pl_exec.ctablecmds.c 路径;完整范围见结构化证据记录

267 - P0003 — too_many_rows

PostgreSQL SQLSTATE P0003 的源码与诊断参考。

P0003

速览

P0003 是 PL/pgSQL too_many_rows。固定路径给出准确的 message、可选 detail、hint 和按实际分支决定的严重级别。

字段
SQLSTATE P0003
条件名 too_many_rows
状态 有效
已知存在于 8.2.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_TOO_MANY_ROWS
别名

含义

当受检查的 PL/pgSQL 查询返回多于一行时,源码报告 query returned more than one row;开启 strict 参数打印时可附带 parameters: %s,并在一条路径提供 Make sure the query returns a single row, or use LIMIT 1. hint。普通多行 SELECT 不会因此自动成为 P0003。

诊断

先看是否是严格目标赋值或 modifying statement,再检查完整 detail/hint。固定源码先按 plpgsql.extra_errors/plpgsql.extra_warningstoo_many_rows 的选择设置级别:前者优先并使用 ERROR,只有后者生效时才使用 WARNING;strict/modifying 路径无论这些设置如何都使用 ERROR,所以不要只凭条件名断言严重级别。

处置

让查询满足单行契约,或改用能表达多行结果的 PL/pgSQL 结构;若业务允许第一行,必须显式设计排序和截取语义,而不是盲目套用 hint。修正查询契约后再执行,避免把同一多行结果自动重放成重复业务操作。

版本

锁定目录从 8.2.0 记录该条件,并在列出的正式快照及 19beta3 中出现;运行时未在本批次重演。

P0002, P0004, 02000

来源

可直接阅读固定的 pl_exec.c GUC 分支和报告路径;完整范围见结构化证据记录

268 - P0004 — assert_failure

PostgreSQL SQLSTATE P0004 的源码与诊断参考。

P0004

速览

P0004 是 PL/pgSQL assert_failure。固定 ASSERT 执行路径确认它以 ERROR 报告,并按是否提供 message 选择错误文本;运行案例已在 PostgreSQL 18.6 和 10.21 上通过。

字段
SQLSTATE P0004
条件名 assert_failure
状态 有效
已知存在于 9.5.0
锁定快照 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_ASSERT_FAILURE
别名

共享的 assertion_failure_recovery 案例已在 PostgreSQL 18.6 和 PostgreSQL 10.21 上通过。启用 plpgsql.check_asserts 后,失败的 ASSERT 返回 P0004value must be positive,显式事务进入 INERRORROLLBACK 恢复为 IDLE,有效输入执行成功,关闭断言的对照调用返回零。

CREATE OR REPLACE FUNCTION p0004_assert(value integer) RETURNS integer LANGUAGE plpgsql AS $$ BEGIN ASSERT value > 0, 'value must be positive'; RETURN value; END $$;
SET plpgsql.check_asserts = on;
SHOW plpgsql.check_asserts;
BEGIN;
SELECT p0004_assert(0);
ROLLBACK;
SELECT p0004_assert(1);
SET plpgsql.check_asserts = off;
SHOW plpgsql.check_asserts;
SELECT p0004_assert(0);
SET plpgsql.check_asserts = on;
SHOW plpgsql.check_asserts;
SELECT p0004_assert(1);

含义

ASSERT 是 PL/pgSQL 中执行的不变量检查。PostgreSQL 计算其 Boolean 条件;结果为 false 或 NULL 时进入断言失败路径。固定执行器随后以 ERROR 和 SQLSTATE P0004 报告:只在进入该路径后计算 message 表达式,非 NULL 结果成为主报文,NULL 或省略 message 时使用 assertion failed。关闭检查时,条件和 message 表达式都会跳过。

plpgsql.check_asserts 是按会话生效的设置,用来控制是否检查 ASSERT。启用时,失败断言是真正的 ERROR,显式事务会进入 INERROR;关闭时 ASSERT 会被跳过,同一个 false 输入不能证明不变量成立,也不能替代生产环境的输入校验。

选定运行覆盖了带非 NULL message 的 false 条件,以及关闭检查时的 false 条件。NULL 条件和无 message 的回退文本是源码确认的语义,不是本批额外的自然运行观察。

诊断

先把 ErrorResponse 字段与服务器日志中的同一条记录对照。固定 18.6 路径的 message_primary 是计算后的 message 或 assertion failed;运行案例还记录了 ERRORP0004exec_stmt_assert,以及指向 PL/pgSQL 函数和 line 1 at ASSERT 的 context。要在出错的同一个会话执行 SHOW plpgsql.check_asserts,其他连接的设置不会影响它。

如果主报文是 assertion failed,检查 ASSERT 是否没有 message,或 message 表达式是否计算为 NULL。如果完全没有 P0004,先检查 SHOW plpgsql.check_asserts:关闭时会在计算条件前跳过检查。比较调用时要同时保留函数源码和会话设置;连接池中的另一个连接可能有不同设置,即使它们调用的是同一个函数。

区分程序不变量和预期业务输入。value > 0 这类 ASSERT 适合检查经过验证后本应永远成立的假设;预期的负数等业务输入应使用普通校验、约束或明确的应用错误。若错误发生在显式事务中,先检查事务状态再发送下一条命令:运行案例中事务在 ROLLBACK 前是 INERROR,并不是连接已经失效。

处置

显式事务中先执行 ROLLBACK,再以修正后的不变量或输入重现。共享案例验证了 ROLLBACK → IDLE、有效调用返回 1,以及把 plpgsql.check_asserts 设为 off 后同一个 false 输入不再报告断言。

如果 PL/pgSQL block 有意处理这个命名条件,可以使用 WHEN ASSERT_FAILUREWHEN OTHERS 不会捕获 ASSERT_FAILURE,因此不能靠宽泛 handler 隐藏断言失败。异常块可以按文档规定的子事务边界恢复,但吞掉错误前必须检查不变量;关闭断言只是诊断对照,不是修复。

版本

锁定目录从 9.5.0 记录 P0004,并在列出的正式快照及 19beta3 中出现。固定执行器源码是 PostgreSQL 18.6 的 pl_exec.c#L3965-L3968。官方 PL/pgSQL 错误和消息文档说明 ASSERT 和命名条件;控制结构中的错误捕获文档定义 EXCEPTION 子事务及 handler 匹配边界。最新版本与 PG10 的运行案例确认了共享函数中的 P0004 和事务行为。

P0002 是 PL/pgSQL 无数据条件, P0003 是严格多行条件, P0000 是 PL/pgSQL 错误类别。应以响应中的实际 SQLSTATE 为准,不要把所有 PL/pgSQL 失败都归为 P0004。

来源

固定实现见 pl_exec.c#L3965-L3968。官方 PL/pgSQL 错误和消息参考说明 ASSERT 语义;控制结构中的错误捕获参考说明 WHEN OTHERS 排除项和子事务边界。结构化的证据记录固定了源码 SHA、运行摘要、原始结果和共享片段注册表。

269 - PostgreSQL 10.23 — 正式版本

PostgreSQL 10.23 SQLSTATE 定义快照与证据成员。

PostgreSQL 10.23 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 240 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.6.24 相比,当前快照 PostgreSQL 10.23,新增 2 项,移除 0 项。新增:2200H, 428C9

来源

锁定来源:https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/utils/errcodes.txt

270 - PostgreSQL 11.22 — 正式版本

PostgreSQL 11.22 SQLSTATE 定义快照与证据成员。

PostgreSQL 11.22 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 241 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 10.23 相比,当前快照 PostgreSQL 11.22,新增 1 项,移除 0 项。新增:22013

来源

锁定来源:https://github.com/postgres/postgres/blob/fd851f9e4a13d81cccc4ac5d6059d732c7518111/src/backend/utils/errcodes.txt

271 - PostgreSQL 12.22 — 正式版本

PostgreSQL 12.22 SQLSTATE 定义快照与证据成员。

PostgreSQL 12.22 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 257 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 11.22 相比,当前快照 PostgreSQL 12.22,新增 16 项,移除 0 项。新增:22030, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 55P04

来源

锁定来源:https://github.com/postgres/postgres/blob/498f30a8b7025a2a7bd3715acc1d1692122ba542/src/backend/utils/errcodes.txt

272 - PostgreSQL 13.23 — 正式版本

PostgreSQL 13.23 SQLSTATE 定义快照与证据成员。

PostgreSQL 13.23 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 258 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 12.22 相比,当前快照 PostgreSQL 13.23,新增 1 项,移除 0 项。新增:22031

来源

锁定来源:https://github.com/postgres/postgres/blob/89df812eb890814b105d871185935b580478e660/src/backend/utils/errcodes.txt

273 - PostgreSQL 14.24 — 正式版本

PostgreSQL 14.24 SQLSTATE 定义快照与证据成员。

PostgreSQL 14.24 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 259 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 13.23 相比,当前快照 PostgreSQL 14.24,新增 1 项,移除 0 项。新增:57P05

来源

锁定来源:https://github.com/postgres/postgres/blob/6b3806732b7c5df06bdd0ed150e8a07b4ad62315/src/backend/utils/errcodes.txt

274 - PostgreSQL 15.19 — 正式版本

PostgreSQL 15.19 SQLSTATE 定义快照与证据成员。

PostgreSQL 15.19 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 260 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 14.24 相比,当前快照 PostgreSQL 15.19,新增 1 项,移除 0 项。新增:2203G

来源

锁定来源:https://github.com/postgres/postgres/blob/2ff1375b5dd8bf09d8cb0e795974528180fd75ca/src/backend/utils/errcodes.txt

275 - PostgreSQL 16.15 — 正式版本

PostgreSQL 16.15 SQLSTATE 定义快照与证据成员。

PostgreSQL 16.15 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 260 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 15.19 相比,当前快照 PostgreSQL 16.15,新增 0 项,移除 0 项。

来源

锁定来源:https://github.com/postgres/postgres/blob/7d3e000c5961a544302072058a1184e9a588837b/src/backend/utils/errcodes.txt

276 - PostgreSQL 17.11 — 正式版本

PostgreSQL 17.11 SQLSTATE 定义快照与证据成员。

PostgreSQL 17.11 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 260 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 25P04, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 16.15 相比,当前快照 PostgreSQL 17.11,新增 1 项,移除 1 项。新增:25P04;移除:72000

来源

锁定来源:https://github.com/postgres/postgres/blob/083ac033419f690758508e08c1736089384bbee8/src/backend/utils/errcodes.txt

277 - PostgreSQL 18.6 — 正式版本

PostgreSQL 18.6 SQLSTATE 定义快照与证据成员。

PostgreSQL 18.6 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 262 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 10608, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 25P04, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, 58P03, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 17.11 相比,当前快照 PostgreSQL 18.6,新增 2 项,移除 0 项。新增:10608, 58P03

来源

锁定来源:https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt

278 - PostgreSQL 19beta3 — 预发行

PostgreSQL 19beta3 SQLSTATE 定义快照与证据成员。

PostgreSQL 19beta3 — 预发行

快照

这是预发行的锁定定义快照,目录记录 262 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 10608, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 25P04, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 55P04, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05, 58000, 58030, 58P01, 58P02, 58P03, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 18.6 相比,预发行快照 PostgreSQL 19beta3,新增 0 项,移除 0 项。

来源

锁定来源:https://github.com/postgres/postgres/blob/3638289fb57bdabec00deda98ee9624a35f5d66a/src/backend/utils/errcodes.txt

279 - PostgreSQL 9.0.23 — 正式版本

PostgreSQL 9.0.23 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.0.23 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 199 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 44000, 53000, 53100, 53200, 53300, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58030, 58P01, 58P02, F0000, F0001, P0000, P0001, P0002, P0003, XX000, XX001, XX002

增删与变化

这是第一个锁定快照 PostgreSQL 9.0.23,作为版本边界基线。

来源

锁定来源:https://github.com/postgres/postgres/blob/9a42e8514f7e42737992bb09bd93540dd9630a9a/src/include/utils/errcodes.h

280 - PostgreSQL 9.1.24 — 正式版本

PostgreSQL 9.1.24 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.1.24 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 228 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.0.23 相比,当前快照 PostgreSQL 9.1.24,新增 29 项,移除 0 项。新增:42P21, 42P22, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091

来源

锁定来源:https://github.com/postgres/postgres/blob/e85493559c4678f54d30b6b4e04b17c03a3192d7/src/backend/utils/errcodes.txt

281 - PostgreSQL 9.2.24 — 正式版本

PostgreSQL 9.2.24 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.2.24 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 232 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.1.24 相比,当前快照 PostgreSQL 9.2.24,新增 4 项,移除 0 项。新增:0Z000, 0Z002, 53400, 58000

来源

锁定来源:https://github.com/postgres/postgres/blob/8786f783ab2398468a8c4d8eac937fc6533d16e3/src/backend/utils/errcodes.txt

282 - PostgreSQL 9.3.25 — 正式版本

PostgreSQL 9.3.25 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.3.25 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 232 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.2.24 相比,当前快照 PostgreSQL 9.3.25,新增 0 项,移除 0 项。

来源

锁定来源:https://github.com/postgres/postgres/blob/c10bb239d29017ba66eca88a24b84a1d4db36a6c/src/backend/utils/errcodes.txt

283 - PostgreSQL 9.4.26 — 正式版本

PostgreSQL 9.4.26 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.4.26 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 232 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.3.25 相比,当前快照 PostgreSQL 9.4.26,新增 0 项,移除 0 项。

来源

锁定来源:https://github.com/postgres/postgres/blob/30ffdd24d7222bc01183a56d536c236240674516/src/backend/utils/errcodes.txt

284 - PostgreSQL 9.5.25 — 正式版本

PostgreSQL 9.5.25 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.5.25 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 236 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.4.26 相比,当前快照 PostgreSQL 9.5.25,新增 4 项,移除 0 项。新增:2202G, 2202H, 39P03, P0004

来源

锁定来源:https://github.com/postgres/postgres/blob/202c587e2f28bc295f6935d044e20680b627e7a1/src/backend/utils/errcodes.txt

285 - PostgreSQL 9.6.24 — 正式版本

PostgreSQL 9.6.24 SQLSTATE 定义快照与证据成员。

PostgreSQL 9.6.24 — 正式版本

快照

这是正式版本的锁定定义快照,目录记录 238 个 SQLSTATE。版本存在表示源码定义文件中出现该值,不单独证明某个运行路径。

成员

00000, 01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01, 02000, 02001, 03000, 08000, 08001, 08003, 08004, 08006, 08007, 08P01, 09000, 0A000, 0B000, 0F000, 0F001, 0L000, 0LP01, 0P000, 0Z000, 0Z002, 20000, 21000, 22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06, 23000, 23001, 23502, 23503, 23505, 23514, 23P01, 24000, 25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 26000, 27000, 28000, 28P01, 2B000, 2BP01, 2D000, 2F000, 2F002, 2F003, 2F004, 2F005, 34000, 38000, 38001, 38002, 38003, 38004, 39000, 39001, 39004, 39P01, 39P02, 39P03, 3B000, 3B001, 3D000, 3F000, 40000, 40001, 40002, 40003, 40P01, 42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22, 44000, 53000, 53100, 53200, 53300, 53400, 54000, 54001, 54011, 54023, 55000, 55006, 55P02, 55P03, 57000, 57014, 57P01, 57P02, 57P03, 57P04, 58000, 58030, 58P01, 58P02, 72000, F0000, F0001, HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091, P0000, P0001, P0002, P0003, P0004, XX000, XX001, XX002

增删与变化

与前一个锁定快照 PostgreSQL 9.5.25 相比,当前快照 PostgreSQL 9.6.24,新增 2 项,移除 0 项。新增:25P03, 72000

来源

锁定来源:https://github.com/postgres/postgres/blob/a4116b8d5a4f68803452d8f1aa3f74f302049a90/src/backend/utils/errcodes.txt

286 - XX000 — internal_error(内部错误)

PostgreSQL 使用 SQLSTATE XX000 表示内部错误路径,也把没有显式代码的 ERROR 默认映射到这里。应保留完整诊断并调查具体子系统;XX000 本身不能证明数据损坏。

速览

XX000 是类别 XX Internal Error 中的 internal_error 条件。PostgreSQL 源码目录把这个类别描述为“本不应发生”的条件和软件缺陷。它是通用的诊断边界,不能据此断言数据库已经损坏。

这个代码也有机械的默认来源。在错误栈初始化时,没有后续显式代码的 ERROR 或更高级别会先使用 ERRCODE_INTERNAL_ERRORWARNING 级别从 ERRCODE_WARNING01000)开始;低于 WARNING 的级别若没有自己的代码则从 00000 开始。显式 errcode() 可以选择其他 SQLSTATE。因此,XX000 可能来自没有显式 SQLSTATE 的默认 elog(ERROR, ...) 路径,也可能来自主动报告内部错误的路径。

严重级别和连接后果取决于具体路径。ERRORFATALPANIC 是不同的协议严重级别;扩展测试代码甚至可以在 NOTICE 中显式携带 XX000。应把严重级别、事务状态、连接状态、源码位置和完整诊断放在一起读取。

代表性案例 internal_error_safety_boundary 只做源码核验,未实测自然触发路径。由于强行制造内部损坏或故障会越过安全的临时数据库边界,PostgreSQL 18.6 和 10.21 上均记录为 not_applicable,也没有用手写 RAISE 冒充服务器内部失败。

字段
SQLSTATE XX000
条件名 internal_error
状态 有效
已知存在于 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_INTERNAL_ERROR
别名

含义与触发路径

18.6 的定义是在类别 XX 下的 XX000 E ERRCODE_INTERNAL_ERROR internal_error。这个类别注释有意保持宽泛。对于数据损坏(XX001)和索引损坏(XX002)还有更具体的代码;选用 XX000 不会自动把通用内部报文升级成这两种诊断。

需要区分两种源码模式:

  1. 默认内部代码。 后端路径调用没有显式 SQLSTATE 的 elog(ERROR, ...),或以同样方式到达 ereport(ERROR, ...)elog.c 会把这个错误初始化为 XX000,但报文和源码函数仍能指出所属子系统。
  2. 显式内部代码。 某条路径调用 errcode(ERRCODE_INTERNAL_ERROR),因为某个不变量或操作系统/服务结果被视为不可能或不可用。18.6 中的例子包括 B-tree 重检时无法重新找到索引元组、动态共享内存控制段无效、尝试重新定义非占位配置参数,以及 UUID 生成无法取得强随机字节。

显式代码不会强制唯一的严重级别。共享内存路径报告 FATAL,而 B-tree、GUC 和 UUID 例子报告 ERROR。一个访问控制测试钩子还会在 NOTICE 中显式报告 ERRCODE_INTERNAL_ERROR,说明 SQLSTATE 与严重级别是分开的字段。这个钩子只是源码例子,不是普通生产提示表示内部故障的证据。

报文与诊断

XX000 没有统一的主报文。源码中可见的代表性模板包括:

  • failed to re-find tuple within index "%s",并提示索引表达式可能不是不可变的(nbtinsert.c)。
  • dynamic shared memory control segment is not valid,出现在 FATAL 初始化路径(dsm.c)。
  • attempt to redefine parameter "%s"guc.c)和 could not generate random valuesuuid.c)。
  • 默认 elog(ERROR, ...) 路径中的 invalid page pd_lower %u pd_upper %u pd_special %ubufmask.c);没有其他显式代码替换时,默认映射会提供 XX000

这些都是具体路径的诊断模板。应记录 SQLSTATE、两种严重级别字段、主报文、详细信息、提示、上下文、源码文件、函数、行号、后端 PID、数据库和服务器版本。本地化文本和模板措辞可能变化;源码路径和结构化字段比报文子串更稳定。

诊断

在重试或重启前保留完整的客户端错误和对应服务器日志。先按协议严重级别分类:

  • ERROR 通常会中止当前显式事务,但回滚后后端连接仍可使用。
  • FATAL 会结束后端会话,客户端需要建立新连接才能继续。
  • PANIC 是影响服务器的紧急路径,进程和连接后果必须根据服务器日志和进程监管状态确认。
  • 显式携带 XX000WARNINGNOTICE 具有不同控制流,单凭它既不能证明内部故障,也不能断言事务中止。

随后按源码函数和子系统归类。检查是否有先发生的 I/O、内存、扩展、索引、配置或并发故障;比对确切服务器构建和固定源码版本;寻找是否重复出现。只有当诊断指向相关对象时,才使用只读的目录、索引或页面检查。不能仅凭类别名推断损坏,也不要用手写 RAISE EXCEPTION 来制造复现:那默认测试的是 P0001,不是服务器内部路径。

处理

按照严重级别和子系统处理。ERROR 要先回滚事务再发无关命令;FATAL 后重新建立连接;PANIC 后遵循服务器重启和事故流程。内部错误若源码指向不变量、存储、索引或共享内存边界,不应盲目重试。

收集服务器版本、确切 SQL、后端和服务器日志、源码位置、关系对象或其他对象身份,以及近期配置和扩展变化。如果证据指向损坏,应根据事故流程在适当时停止写入,保留副本或快照,并使用 PostgreSQL 文档化的恢复与支持流程。如果证据指向没有损坏迹象的软件或扩展缺陷,则隔离可复现条件并比较受支持的版本。正确处理取决于这些证据,而不是 XX000 本身。

版本

目录记录 XX000 存在于锁定的 7.4–8.4.22 pre-9.0 正式源码、9.0.23 至 18.6 的全部正式快照及 19 Beta 3 预览快照。同 tag 的 REL8_1_4 errcodes.sgml 表已经列出 XX000 和条件名 internal_error,因此至少可以确认 8.1.4 已有该条件名。9.0 头文件视图中的类标题为 Internal Error (PostgreSQL-specific error class),到 9.1 的文本定义变为 Internal Error。7.0–7.3 仍有候选源码缺口;这些是目录观察边界,不是确切实现引入日期的断言。

18.6 固定源码 commit 为 724edf9bde9d356724ad384a2e196edc3c9f80f7。默认严重级别到代码的映射以及上面的源码路径均有 18.6 证据。代表性运行案例没有接受确定且安全的 SQL 触发方式,因此两个目标的运行时状态均保持 not_applicable

XX001data_corruptedXX002index_corrupted 是更具体的损坏条件。P0001raise_exception 是没有代码的 PL/pgSQL RAISE EXCEPTION 的通常默认值。57P01admin_shutdown 是不同类别的服务器连接事件。25P02in_failed_sql_transaction 是前一个错误导致的后续事务状态,不是 XX000 的同义词。

来源

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行时记录保留精确的源码边界案例 ID 和两个目标摘要。

  • src.errcodes.18.6errcodes.txt
  • src.elog.18.6elog.c
  • src.nbtinsert.18.6src.dsm.18.6src.guc.18.6src.uuid.18.6src.bufmask.18.6 — 源码确认的内部路径
  • src.oat-hooks.18.6 — 在 NOTICE 中显式提供内部代码
  • doc.protocol.18Error and Notice Message Fields

287 - XX001 — data_corrupted

PostgreSQL SQLSTATE XX001 的源码核验与诊断参考。

XX001

速览

XX001 报告完整性不变量失败。固定源码覆盖 PGLZ TOAST 数据损坏、堆中不可能的 MultiXact/XID freeze 状态,以及 amcheck 检测到的元组/索引不匹配(其根因仍可能是堆/HOT 链)。

字段
SQLSTATE XX001
条件名 data_corrupted
状态 有效
已知存在于 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_DATA_CORRUPTED
别名

含义

TOAST 解压器无法解码保存的压缩 datum 时,会以 ERRCODE_DATA_CORRUPTED 报错。堆 freeze 在 MultiXact 早于 relminmxid、在 freeze cutoff 前仍运行,或带有早于 relfrozenxid/可移除 cutoff 的 update XID 时,也使用此码。这些是存储数据和事务元数据的一致性检查,不是普通输入错误。

amcheckheapallindexed 回调报告堆元组缺少匹配的索引元组。源码注释明确指出,表面上的索引扫描问题仍可能源于堆损坏、错误的 HOT 安全性判断或其他底层故障;可选提示只是建议使用更强的检查函数。

消息

  • ERROR,SQLSTATE XX001compressed pglz data is corrupt
  • ERROR,SQLSTATE XX001found multixact %u from before relminmxid %u
  • ERROR,SQLSTATE XX001multixact %u from before multi freeze cutoff %u found to be still running
  • ERROR,SQLSTATE XX001multixact %u contains update XID %u from before relfrozenxid %u
  • ERROR,SQLSTATE XX001multixact %u contains committed update XID %u from before removable cutoff %u
  • ERROR,SQLSTATE XX001heap tuple (%u,%u) from table "%s" lacks matching index tuple within index "%s"
    • 通过 bt_index_check 进入时(该入口取得 AccessShareLock,并向回调传入 readonly=false),提示为:Retrying verification using the function bt_index_parent_check() might provide a more specific error. bt_index_parent_check 入口取得 ShareLock、传入 readonly=true,不会附加这个提示。这里的 readonly 是内部校验模式,与 SQL 事务的 transaction_read_only 设置无关。

诊断

保留完整消息与标识符、关系/索引名称、数据块/页面上下文、校验和与副本比较、日志以及首次发现不变量的操作。TOAST 要定位所属表和压缩 datum 路径;堆消息要检查 relfrozenxid/relminmxid 与 MultiXact 历史,不能手工改系统目录。对 amcheck 记录调用的是 bt_index_check/AccessShareLock 还是 bt_index_parent_check/ShareLock,以及是否有提示;不要先假定索引是根因。

处理

按完整性事件处理。显式事务中的 ERROR 需要先 ROLLBACK,或回到已有保存点,再发送 SQL;回滚不会修复存储对象。用只读流程比较可信备份、副本、校验和和存储历史,再按事故方案恢复或重建受影响表/TOAST 数据。只有证据确认损坏局限于索引时才考虑 REINDEX;它不是堆、TOAST、XID 或 MultiXact 不变量的通用修复。若另有 FATAL 或进程终止,恢复后使用新连接;不要为测试而制造损坏。

版本

锁定目录从 7.4 记录此条件;固定 TOAST、堆和 amcheck 源码覆盖 PostgreSQL 18.6。本源码页没有运行损坏或崩溃实验。

XX0025803072000

来源

src/backend/access/common/toast_compression.c#L90-L100

src/backend/access/heap/heapam.c#L6983-L7042

contrib/amcheck/verify_nbtree.c#L2760-L2818

contrib/amcheck/verify_nbtree.c#L252-L305

contrib/amcheck/verify_common.c#L60-L149

结构化证据记录保存完整性消息组、条件提示和源码/运行边界。

288 - XX002 — index_corrupted

PostgreSQL SQLSTATE XX002 的源码核验与诊断参考。

XX002

速览

XX002 报告索引结构失败。固定源码按索引访问方法区分:BRIN 检查范围映射指针,GiST 和 hash 检查页面头部、特殊区域以及方法特有的 metadata。

字段
SQLSTATE XX002
条件名 index_corrupted
状态 有效
已知存在于 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_INDEX_CORRUPTED
别名

含义

BRIN revmap 路径在范围映射项指向普通页面之外或未使用项时报告 XX002。GiST 和 hash 页面检查会拒绝异常零页面或无效特殊区域;hash 还检查页面类型、magic 和 version 是否符合 hash 索引访问方法。这些检查可以在普通索引访问或校验时触发,不能单独证明堆完好。

消息

  • ERROR,SQLSTATE XX002corrupted BRIN index: inconsistent range map
  • ERROR,SQLSTATE XX002(GiST):index "%s" contains unexpected zero page at block %u;hint:Please REINDEX it.
  • ERROR,SQLSTATE XX002(GiST 或 hash):index "%s" contains corrupted page at block %u;hint:Please REINDEX it.
  • ERROR,SQLSTATE XX002(hash):index "%s" is not a hash index
  • ERROR,SQLSTATE XX002(hash):index "%s" has wrong hash version;hint:Please REINDEX it.

引用的 BRIN 分支没有固定 REINDEX 提示。同一消息可能由多个页面检查分支触发,因此应保留索引访问方法和数据块。

诊断

记录索引访问方法、索引 OID/名称、数据块、页面头部/特殊区域详细信息、主消息/详细信息/提示以及首次发现错误的查询、检查或维护操作。比较索引、堆、amcheck 输出、校验和、副本和存储历史。重建后立即再次损坏,通常提示堆、存储或软件问题,而非单个索引页面。

处理

显式事务中的 ERROR 需要先回滚,或回到已有保存点,再发送 SQL。修复前保留原始索引和证据。只有比较确认损坏局限于索引且堆可信时,才按索引访问方法的维护流程重建;GiST/hash 提示明确写 REINDEX it,BRIN 消息本身没有指定修复。重建后验证索引和依赖约束。REINDEX 不能修复堆/TOAST/存储损坏,在坏堆上重建可能再次产生问题;若另有 FATAL 使后端终止,恢复后使用新连接。

版本

锁定目录从 7.4 记录此条件;固定 BRIN、GiST 和 hash 源码覆盖 PostgreSQL 18.6。本源码页没有诱发索引或损坏故障。

XX0015803054011

来源

src/backend/access/brin/brin_revmap.c#L381-L389

src/backend/access/gist/gistutil.c#L796-L812

src/backend/access/hash/hashutil.c#L221-L270

结构化证据记录保存索引访问方法特有的消息检查分支、提示和源码/运行边界。

289 - 类别 00 — 成功完成

PostgreSQL SQLSTATE 类别 00 的成员与证据边界。

类别 00 — 成功完成

共同语义

SQLSTATE 的前两位 00 表示“成功完成”。语句成功完成。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

00000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

290 - 类别 01 — 警告

PostgreSQL SQLSTATE 类别 01 的成员与证据边界。

类别 01 — 警告

共同语义

SQLSTATE 的前两位 01 表示“警告”。语句完成,但带有警告条件。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 8 个成员:

01000, 01003, 01004, 01006, 01007, 01008, 0100C, 01P01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

291 - 类别 02 — 无数据

PostgreSQL SQLSTATE 类别 02 的成员与证据边界。

类别 02 — 无数据

共同语义

SQLSTATE 的前两位 02 表示“无数据”。语句完成,但没有返回请求的数据。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

02000, 02001

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

292 - 类别 03 — SQL语句尚未完成

PostgreSQL SQLSTATE 类别 03 的成员与证据边界。

类别 03 — SQL语句尚未完成

共同语义

SQLSTATE 的前两位 03 表示“SQL语句尚未完成”。SQL 语句尚不完整,需要继续输入。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

03000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

293 - 类别 08 — 连接异常

PostgreSQL SQLSTATE 类别 08 的成员与证据边界。

类别 08 — 连接异常

共同语义

SQLSTATE 的前两位 08 表示“连接异常”。客户端或服务器无法建立或维持连接。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 7 个成员:

08000, 08001, 08003, 08004, 08006, 08007, 08P01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

294 - 类别 09 — 触发动作异常

PostgreSQL SQLSTATE 类别 09 的成员与证据边界。

类别 09 — 触发动作异常

共同语义

SQLSTATE 的前两位 09 表示“触发动作异常”。语句或触发器调用的动作失败。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

09000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

295 - 类别 0A — 不支持的特性

PostgreSQL SQLSTATE 类别 0A 的成员与证据边界。

类别 0A — 不支持的特性

共同语义

SQLSTATE 的前两位 0A 表示“不支持的特性”。请求的 SQL 特性未实现或不受支持。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

0A000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

296 - 类别 0B — 无效的事务发起

PostgreSQL SQLSTATE 类别 0B 的成员与证据边界。

类别 0B — 无效的事务发起

共同语义

SQLSTATE 的前两位 0B 表示“无效的事务发起”。事务以无效方式启动。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

0B000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

297 - 类别 0F — 定位器异常

PostgreSQL SQLSTATE 类别 0F 的成员与证据边界。

类别 0F — 定位器异常

共同语义

SQLSTATE 的前两位 0F 表示“定位器异常”。定位器值或定位器操作无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

0F000, 0F001

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

298 - 类别 0L — 无效授权者

PostgreSQL SQLSTATE 类别 0L 的成员与证据边界。

类别 0L — 无效授权者

共同语义

SQLSTATE 的前两位 0L 表示“无效授权者”。授权操作指定的授权者无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

0L000, 0LP01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

299 - 类别 0P — 无效角色规范

PostgreSQL SQLSTATE 类别 0P 的成员与证据边界。

类别 0P — 无效角色规范

共同语义

SQLSTATE 的前两位 0P 表示“无效角色规范”。授权操作指定的角色无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

0P000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

300 - 类别 0Z — 诊断异常

PostgreSQL SQLSTATE 类别 0Z 的成员与证据边界。

类别 0Z — 诊断异常

共同语义

SQLSTATE 的前两位 0Z 表示“诊断异常”。诊断操作的状态或请求无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

0Z000, 0Z002

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

301 - 类别 10 — XQuery错误

PostgreSQL SQLSTATE 类别 10 的成员与证据边界。

类别 10 — XQuery错误

共同语义

SQLSTATE 的前两位 10 表示“XQuery错误”。XQuery 表达式或处理步骤失败。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

10608

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

302 - 类别 20 — 未找到 Case

PostgreSQL SQLSTATE 类别 20 的成员与证据边界。

类别 20 — 未找到 Case

共同语义

SQLSTATE 的前两位 20 表示“未找到 Case”。请求的 case 或分支没有匹配选项。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

20000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

303 - 类别 21 — 基数冲突

PostgreSQL SQLSTATE 类别 21 的成员与证据边界。

类别 21 — 基数冲突

共同语义

SQLSTATE 的前两位 21 表示“基数冲突”。操作得到的结果基数不符合要求。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

21000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

304 - 类别 22 — 数据异常

PostgreSQL SQLSTATE 类别 22 的成员与证据边界。

类别 22 — 数据异常

共同语义

SQLSTATE 的前两位 22 表示“数据异常”。值违反数据类型、格式或范围规则。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 68 个成员:

22000, 22001, 22002, 22003, 22004, 22005, 22007, 22008, 22009, 2200B, 2200C, 2200D, 2200F, 2200G, 2200H, 2200L, 2200M, 2200N, 2200S, 2200T, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 22018, 22019, 2201B, 2201E, 2201F, 2201G, 2201W, 2201X, 22021, 22022, 22023, 22024, 22025, 22026, 22027, 2202E, 2202G, 2202H, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 22039, 2203A, 2203B, 2203C, 2203D, 2203E, 2203F, 2203G, 22P01, 22P02, 22P03, 22P04, 22P05, 22P06

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

305 - 类别 23 — 完整性约束冲突

PostgreSQL SQLSTATE 类别 23 的成员与证据边界。

类别 23 — 完整性约束冲突

共同语义

SQLSTATE 的前两位 23 表示“完整性约束冲突”。行操作违反了声明的完整性约束。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 7 个成员:

23000, 23001, 23502, 23503, 23505, 23514, 23P01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

306 - 类别 24 — 游标状态无效

PostgreSQL SQLSTATE 类别 24 的成员与证据边界。

类别 24 — 游标状态无效

共同语义

SQLSTATE 的前两位 24 表示“游标状态无效”。游标不处于操作所需的状态。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

24000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

307 - 类别 25 — 事务状态无效

PostgreSQL SQLSTATE 类别 25 的成员与证据边界。

类别 25 — 事务状态无效

共同语义

SQLSTATE 的前两位 25 表示“事务状态无效”。事务不处于操作所需的状态。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 13 个成员:

25000, 25001, 25002, 25003, 25004, 25005, 25006, 25007, 25008, 25P01, 25P02, 25P03, 25P04

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

308 - 类别 26 — SQL语句名称无效

PostgreSQL SQLSTATE 类别 26 的成员与证据边界。

类别 26 — SQL语句名称无效

共同语义

SQLSTATE 的前两位 26 表示“SQL语句名称无效”。找不到或不能使用指定的 SQL 语句。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

26000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

309 - 类别 27 — 触发数据变更冲突

PostgreSQL SQLSTATE 类别 27 的成员与证据边界。

类别 27 — 触发数据变更冲突

共同语义

SQLSTATE 的前两位 27 表示“触发数据变更冲突”。触发的数据变更违反操作规则。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

27000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

310 - 类别 28 — 授权规范无效

PostgreSQL SQLSTATE 类别 28 的成员与证据边界。

类别 28 — 授权规范无效

共同语义

SQLSTATE 的前两位 28 表示“授权规范无效”。授权规范无效或被拒绝。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

28000, 28P01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

311 - 类别 2B — 依赖权限描述符仍存在

PostgreSQL SQLSTATE 类别 2B 的成员与证据边界。

类别 2B — 依赖权限描述符仍存在

共同语义

SQLSTATE 的前两位 2B 表示“依赖权限描述符仍存在”。依赖的权限描述符阻止了请求的变更。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

2B000, 2BP01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

312 - 类别 2D — 事务终止无效

PostgreSQL SQLSTATE 类别 2D 的成员与证据边界。

类别 2D — 事务终止无效

共同语义

SQLSTATE 的前两位 2D 表示“事务终止无效”。事务以无效方式终止。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

2D000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

313 - 类别 2F — SQL例程异常

PostgreSQL SQLSTATE 类别 2F 的成员与证据边界。

类别 2F — SQL例程异常

共同语义

SQLSTATE 的前两位 2F 表示“SQL例程异常”。SQL 例程在调用或执行时失败。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

2F000, 2F002, 2F003, 2F004, 2F005

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

314 - 类别 34 — 游标名称无效

PostgreSQL SQLSTATE 类别 34 的成员与证据边界。

类别 34 — 游标名称无效

共同语义

SQLSTATE 的前两位 34 表示“游标名称无效”。指定的游标不存在或无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

34000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

315 - 类别 38 — 外部例程异常

PostgreSQL SQLSTATE 类别 38 的成员与证据边界。

类别 38 — 外部例程异常

共同语义

SQLSTATE 的前两位 38 表示“外部例程异常”。外部例程执行失败。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

38000, 38001, 38002, 38003, 38004

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

316 - 类别 39 — 外部例程调用异常

PostgreSQL SQLSTATE 类别 39 的成员与证据边界。

类别 39 — 外部例程调用异常

共同语义

SQLSTATE 的前两位 39 表示“外部例程调用异常”。外部例程无法正确调用。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 6 个成员:

39000, 39001, 39004, 39P01, 39P02, 39P03

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

317 - 类别 3B — 保存点异常

PostgreSQL SQLSTATE 类别 3B 的成员与证据边界。

类别 3B — 保存点异常

共同语义

SQLSTATE 的前两位 3B 表示“保存点异常”。保存点操作对当前事务无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

3B000, 3B001

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

318 - 类别 3D — 目录名称无效

PostgreSQL SQLSTATE 类别 3D 的成员与证据边界。

类别 3D — 目录名称无效

共同语义

SQLSTATE 的前两位 3D 表示“目录名称无效”。指定的数据库目录不存在或无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

3D000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

319 - 类别 3F — 模式名称无效

PostgreSQL SQLSTATE 类别 3F 的成员与证据边界。

类别 3F — 模式名称无效

共同语义

SQLSTATE 的前两位 3F 表示“模式名称无效”。指定的模式不存在或无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

3F000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

320 - 类别 40 — 事务回滚

PostgreSQL SQLSTATE 类别 40 的成员与证据边界。

类别 40 — 事务回滚

共同语义

SQLSTATE 的前两位 40 表示“事务回滚”。事务无法安全继续,因此被回滚。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

40000, 40001, 40002, 40003, 40P01

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

321 - 类别 42 — 语法错误或访问规则冲突

PostgreSQL SQLSTATE 类别 42 的成员与证据边界。

类别 42 — 语法错误或访问规则冲突

共同语义

SQLSTATE 的前两位 42 表示“语法错误或访问规则冲突”。语句违反语法或访问规则。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 44 个成员:

42000, 42501, 42601, 42602, 42611, 42622, 42701, 42702, 42703, 42704, 42710, 42712, 42723, 42725, 42803, 42804, 42809, 42830, 42846, 42883, 428C9, 42939, 42P01, 42P02, 42P03, 42P04, 42P05, 42P06, 42P07, 42P08, 42P09, 42P10, 42P11, 42P12, 42P13, 42P14, 42P15, 42P16, 42P17, 42P18, 42P19, 42P20, 42P21, 42P22

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

322 - 类别 44 — WITH CHECK OPTION 冲突

PostgreSQL SQLSTATE 类别 44 的成员与证据边界。

类别 44 — WITH CHECK OPTION 冲突

共同语义

SQLSTATE 的前两位 44 表示“WITH CHECK OPTION 冲突”。行将违反 WITH CHECK OPTION 视图条件。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

44000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

323 - 类别 53 — 资源不足

PostgreSQL SQLSTATE 类别 53 的成员与证据边界。

类别 53 — 资源不足

共同语义

SQLSTATE 的前两位 53 表示“资源不足”。服务器缺少操作所需的资源。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

53000, 53100, 53200, 53300, 53400

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

324 - 类别 54 — 程序限制超出

PostgreSQL SQLSTATE 类别 54 的成员与证据边界。

类别 54 — 程序限制超出

共同语义

SQLSTATE 的前两位 54 表示“程序限制超出”。操作超过了配置的程序限制。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 4 个成员:

54000, 54001, 54011, 54023

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

325 - 类别 55 — 前置状态不满足

PostgreSQL SQLSTATE 类别 55 的成员与证据边界。

类别 55 — 前置状态不满足

共同语义

SQLSTATE 的前两位 55 表示“前置状态不满足”。缺少前置对象或状态不适合当前操作。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

55000, 55006, 55P02, 55P03, 55P04

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

326 - 类别 57 — 操作员干预

PostgreSQL SQLSTATE 类别 57 的成员与证据边界。

类别 57 — 操作员干预

共同语义

SQLSTATE 的前两位 57 表示“操作员干预”。操作被取消或遭到操作员干预。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 7 个成员:

57000, 57014, 57P01, 57P02, 57P03, 57P04, 57P05

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

327 - 类别 58 — 系统错误

PostgreSQL SQLSTATE 类别 58 的成员与证据边界。

类别 58 — 系统错误

共同语义

SQLSTATE 的前两位 58 表示“系统错误”。服务器遇到 PostgreSQL 外部的错误。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

58000, 58030, 58P01, 58P02, 58P03

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

328 - 类别 72 — 快照失败

PostgreSQL SQLSTATE 类别 72 的成员与证据边界。

类别 72 — 快照失败

共同语义

SQLSTATE 的前两位 72 表示“快照失败”。无法创建或使用快照。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 1 个成员:

72000

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

329 - 类别 F0 — 配置文件错误

PostgreSQL SQLSTATE 类别 F0 的成员与证据边界。

类别 F0 — 配置文件错误

共同语义

SQLSTATE 的前两位 F0 表示“配置文件错误”。配置文件或其内容无效。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 2 个成员:

F0000, F0001

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

330 - 类别 HV — 外部数据包装器错误

PostgreSQL SQLSTATE 类别 HV 的成员与证据边界。

类别 HV — 外部数据包装器错误

共同语义

SQLSTATE 的前两位 HV 表示“外部数据包装器错误”。SQL/MED 外部数据包装器操作失败。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 27 个成员:

HV000, HV001, HV002, HV004, HV005, HV006, HV007, HV008, HV009, HV00A, HV00B, HV00C, HV00D, HV00J, HV00K, HV00L, HV00M, HV00N, HV00P, HV00Q, HV00R, HV010, HV014, HV021, HV024, HV090, HV091

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

331 - 类别 P0 — PL/pgSQL错误

PostgreSQL SQLSTATE 类别 P0 的成员与证据边界。

类别 P0 — PL/pgSQL错误

共同语义

SQLSTATE 的前两位 P0 表示“PL/pgSQL错误”。PL/pgSQL 程序抛出了错误条件。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 5 个成员:

P0000, P0001, P0002, P0003, P0004

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。

332 - 类别 XX — 内部错误

PostgreSQL SQLSTATE 类别 XX 的成员与证据边界。

类别 XX — 内部错误

共同语义

SQLSTATE 的前两位 XX 表示“内部错误”。PostgreSQL 遇到内部故障。 类别只说明目录层面的共同范围;每个成员的报文、事务后果和处理方式仍须回到独立条目核对。

成员

本类别在锁定目录中包含 3 个成员:

XX000, XX001, XX002

版本边界

成员链接指向各自的版本化事实块;具体增删边界以版本页面和源码证据为准。

来源

类别成员由 data/classes.json 与锁定的 SQLSTATE 目录生成。