Skip to main content

uqa_sql/plpgsql/
conditions.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! `PostgreSQL` condition-name to SQLSTATE mappings.
8
9/// `PostgreSQL` 17.4's PL/pgSQL condition-name table. Duplicate names are
10/// intentional: exception handlers match every SQLSTATE assigned to the
11/// name, while `RAISE condition_name` uses `PostgreSQL`'s first entry.
12const PLPGSQL_CONDITION_SQLSTATES: &[(&str, &str)] = &[
13    ("sql_statement_not_yet_complete", "03000"),
14    ("connection_exception", "08000"),
15    ("connection_does_not_exist", "08003"),
16    ("connection_failure", "08006"),
17    ("sqlclient_unable_to_establish_sqlconnection", "08001"),
18    ("sqlserver_rejected_establishment_of_sqlconnection", "08004"),
19    ("transaction_resolution_unknown", "08007"),
20    ("protocol_violation", "08P01"),
21    ("triggered_action_exception", "09000"),
22    ("feature_not_supported", "0A000"),
23    ("invalid_transaction_initiation", "0B000"),
24    ("locator_exception", "0F000"),
25    ("invalid_locator_specification", "0F001"),
26    ("invalid_grantor", "0L000"),
27    ("invalid_grant_operation", "0LP01"),
28    ("invalid_role_specification", "0P000"),
29    ("diagnostics_exception", "0Z000"),
30    (
31        "stacked_diagnostics_accessed_without_active_handler",
32        "0Z002",
33    ),
34    ("case_not_found", "20000"),
35    ("cardinality_violation", "21000"),
36    ("data_exception", "22000"),
37    ("array_subscript_error", "2202E"),
38    ("character_not_in_repertoire", "22021"),
39    ("datetime_field_overflow", "22008"),
40    ("division_by_zero", "22012"),
41    ("error_in_assignment", "22005"),
42    ("escape_character_conflict", "2200B"),
43    ("indicator_overflow", "22022"),
44    ("interval_field_overflow", "22015"),
45    ("invalid_argument_for_logarithm", "2201E"),
46    ("invalid_argument_for_ntile_function", "22014"),
47    ("invalid_argument_for_nth_value_function", "22016"),
48    ("invalid_argument_for_power_function", "2201F"),
49    ("invalid_argument_for_width_bucket_function", "2201G"),
50    ("invalid_character_value_for_cast", "22018"),
51    ("invalid_datetime_format", "22007"),
52    ("invalid_escape_character", "22019"),
53    ("invalid_escape_octet", "2200D"),
54    ("invalid_escape_sequence", "22025"),
55    ("nonstandard_use_of_escape_character", "22P06"),
56    ("invalid_indicator_parameter_value", "22010"),
57    ("invalid_parameter_value", "22023"),
58    ("invalid_preceding_or_following_size", "22013"),
59    ("invalid_regular_expression", "2201B"),
60    ("invalid_row_count_in_limit_clause", "2201W"),
61    ("invalid_row_count_in_result_offset_clause", "2201X"),
62    ("invalid_tablesample_argument", "2202H"),
63    ("invalid_tablesample_repeat", "2202G"),
64    ("invalid_time_zone_displacement_value", "22009"),
65    ("invalid_use_of_escape_character", "2200C"),
66    ("most_specific_type_mismatch", "2200G"),
67    ("null_value_not_allowed", "22004"),
68    ("null_value_no_indicator_parameter", "22002"),
69    ("numeric_value_out_of_range", "22003"),
70    ("sequence_generator_limit_exceeded", "2200H"),
71    ("string_data_length_mismatch", "22026"),
72    ("string_data_right_truncation", "22001"),
73    ("substring_error", "22011"),
74    ("trim_error", "22027"),
75    ("unterminated_c_string", "22024"),
76    ("zero_length_character_string", "2200F"),
77    ("floating_point_exception", "22P01"),
78    ("invalid_text_representation", "22P02"),
79    ("invalid_binary_representation", "22P03"),
80    ("bad_copy_file_format", "22P04"),
81    ("untranslatable_character", "22P05"),
82    ("not_an_xml_document", "2200L"),
83    ("invalid_xml_document", "2200M"),
84    ("invalid_xml_content", "2200N"),
85    ("invalid_xml_comment", "2200S"),
86    ("invalid_xml_processing_instruction", "2200T"),
87    ("duplicate_json_object_key_value", "22030"),
88    ("invalid_argument_for_sql_json_datetime_function", "22031"),
89    ("invalid_json_text", "22032"),
90    ("invalid_sql_json_subscript", "22033"),
91    ("more_than_one_sql_json_item", "22034"),
92    ("no_sql_json_item", "22035"),
93    ("non_numeric_sql_json_item", "22036"),
94    ("non_unique_keys_in_a_json_object", "22037"),
95    ("singleton_sql_json_item_required", "22038"),
96    ("sql_json_array_not_found", "22039"),
97    ("sql_json_member_not_found", "2203A"),
98    ("sql_json_number_not_found", "2203B"),
99    ("sql_json_object_not_found", "2203C"),
100    ("too_many_json_array_elements", "2203D"),
101    ("too_many_json_object_members", "2203E"),
102    ("sql_json_scalar_required", "2203F"),
103    ("sql_json_item_cannot_be_cast_to_target_type", "2203G"),
104    ("integrity_constraint_violation", "23000"),
105    ("restrict_violation", "23001"),
106    ("not_null_violation", "23502"),
107    ("foreign_key_violation", "23503"),
108    ("unique_violation", "23505"),
109    ("check_violation", "23514"),
110    ("exclusion_violation", "23P01"),
111    ("invalid_cursor_state", "24000"),
112    ("invalid_transaction_state", "25000"),
113    ("active_sql_transaction", "25001"),
114    ("branch_transaction_already_active", "25002"),
115    ("held_cursor_requires_same_isolation_level", "25008"),
116    ("inappropriate_access_mode_for_branch_transaction", "25003"),
117    (
118        "inappropriate_isolation_level_for_branch_transaction",
119        "25004",
120    ),
121    ("no_active_sql_transaction_for_branch_transaction", "25005"),
122    ("read_only_sql_transaction", "25006"),
123    ("schema_and_data_statement_mixing_not_supported", "25007"),
124    ("no_active_sql_transaction", "25P01"),
125    ("in_failed_sql_transaction", "25P02"),
126    ("idle_in_transaction_session_timeout", "25P03"),
127    ("transaction_timeout", "25P04"),
128    ("invalid_sql_statement_name", "26000"),
129    ("triggered_data_change_violation", "27000"),
130    ("invalid_authorization_specification", "28000"),
131    ("invalid_password", "28P01"),
132    ("dependent_privilege_descriptors_still_exist", "2B000"),
133    ("dependent_objects_still_exist", "2BP01"),
134    ("invalid_transaction_termination", "2D000"),
135    ("sql_routine_exception", "2F000"),
136    ("function_executed_no_return_statement", "2F005"),
137    ("modifying_sql_data_not_permitted", "2F002"),
138    ("prohibited_sql_statement_attempted", "2F003"),
139    ("reading_sql_data_not_permitted", "2F004"),
140    ("invalid_cursor_name", "34000"),
141    ("external_routine_exception", "38000"),
142    ("containing_sql_not_permitted", "38001"),
143    ("modifying_sql_data_not_permitted", "38002"),
144    ("prohibited_sql_statement_attempted", "38003"),
145    ("reading_sql_data_not_permitted", "38004"),
146    ("external_routine_invocation_exception", "39000"),
147    ("invalid_sqlstate_returned", "39001"),
148    ("null_value_not_allowed", "39004"),
149    ("trigger_protocol_violated", "39P01"),
150    ("srf_protocol_violated", "39P02"),
151    ("event_trigger_protocol_violated", "39P03"),
152    ("savepoint_exception", "3B000"),
153    ("invalid_savepoint_specification", "3B001"),
154    ("invalid_catalog_name", "3D000"),
155    ("invalid_schema_name", "3F000"),
156    ("transaction_rollback", "40000"),
157    ("transaction_integrity_constraint_violation", "40002"),
158    ("serialization_failure", "40001"),
159    ("statement_completion_unknown", "40003"),
160    ("deadlock_detected", "40P01"),
161    ("syntax_error_or_access_rule_violation", "42000"),
162    ("syntax_error", "42601"),
163    ("insufficient_privilege", "42501"),
164    ("cannot_coerce", "42846"),
165    ("grouping_error", "42803"),
166    ("windowing_error", "42P20"),
167    ("invalid_recursion", "42P19"),
168    ("invalid_foreign_key", "42830"),
169    ("invalid_name", "42602"),
170    ("name_too_long", "42622"),
171    ("reserved_name", "42939"),
172    ("datatype_mismatch", "42804"),
173    ("indeterminate_datatype", "42P18"),
174    ("collation_mismatch", "42P21"),
175    ("indeterminate_collation", "42P22"),
176    ("wrong_object_type", "42809"),
177    ("generated_always", "428C9"),
178    ("undefined_column", "42703"),
179    ("undefined_function", "42883"),
180    ("undefined_table", "42P01"),
181    ("undefined_parameter", "42P02"),
182    ("undefined_object", "42704"),
183    ("duplicate_column", "42701"),
184    ("duplicate_cursor", "42P03"),
185    ("duplicate_database", "42P04"),
186    ("duplicate_function", "42723"),
187    ("duplicate_prepared_statement", "42P05"),
188    ("duplicate_schema", "42P06"),
189    ("duplicate_table", "42P07"),
190    ("duplicate_alias", "42712"),
191    ("duplicate_object", "42710"),
192    ("ambiguous_column", "42702"),
193    ("ambiguous_function", "42725"),
194    ("ambiguous_parameter", "42P08"),
195    ("ambiguous_alias", "42P09"),
196    ("invalid_column_reference", "42P10"),
197    ("invalid_column_definition", "42611"),
198    ("invalid_cursor_definition", "42P11"),
199    ("invalid_database_definition", "42P12"),
200    ("invalid_function_definition", "42P13"),
201    ("invalid_prepared_statement_definition", "42P14"),
202    ("invalid_schema_definition", "42P15"),
203    ("invalid_table_definition", "42P16"),
204    ("invalid_object_definition", "42P17"),
205    ("with_check_option_violation", "44000"),
206    ("insufficient_resources", "53000"),
207    ("disk_full", "53100"),
208    ("out_of_memory", "53200"),
209    ("too_many_connections", "53300"),
210    ("configuration_limit_exceeded", "53400"),
211    ("program_limit_exceeded", "54000"),
212    ("statement_too_complex", "54001"),
213    ("too_many_columns", "54011"),
214    ("too_many_arguments", "54023"),
215    ("object_not_in_prerequisite_state", "55000"),
216    ("object_in_use", "55006"),
217    ("cant_change_runtime_param", "55P02"),
218    ("lock_not_available", "55P03"),
219    ("unsafe_new_enum_value_usage", "55P04"),
220    ("operator_intervention", "57000"),
221    ("query_canceled", "57014"),
222    ("admin_shutdown", "57P01"),
223    ("crash_shutdown", "57P02"),
224    ("cannot_connect_now", "57P03"),
225    ("database_dropped", "57P04"),
226    ("idle_session_timeout", "57P05"),
227    ("system_error", "58000"),
228    ("io_error", "58030"),
229    ("undefined_file", "58P01"),
230    ("duplicate_file", "58P02"),
231    ("config_file_error", "F0000"),
232    ("lock_file_exists", "F0001"),
233    ("fdw_error", "HV000"),
234    ("fdw_column_name_not_found", "HV005"),
235    ("fdw_dynamic_parameter_value_needed", "HV002"),
236    ("fdw_function_sequence_error", "HV010"),
237    ("fdw_inconsistent_descriptor_information", "HV021"),
238    ("fdw_invalid_attribute_value", "HV024"),
239    ("fdw_invalid_column_name", "HV007"),
240    ("fdw_invalid_column_number", "HV008"),
241    ("fdw_invalid_data_type", "HV004"),
242    ("fdw_invalid_data_type_descriptors", "HV006"),
243    ("fdw_invalid_descriptor_field_identifier", "HV091"),
244    ("fdw_invalid_handle", "HV00B"),
245    ("fdw_invalid_option_index", "HV00C"),
246    ("fdw_invalid_option_name", "HV00D"),
247    ("fdw_invalid_string_length_or_buffer_length", "HV090"),
248    ("fdw_invalid_string_format", "HV00A"),
249    ("fdw_invalid_use_of_null_pointer", "HV009"),
250    ("fdw_too_many_handles", "HV014"),
251    ("fdw_out_of_memory", "HV001"),
252    ("fdw_no_schemas", "HV00P"),
253    ("fdw_option_name_not_found", "HV00J"),
254    ("fdw_reply_handle", "HV00K"),
255    ("fdw_schema_not_found", "HV00Q"),
256    ("fdw_table_not_found", "HV00R"),
257    ("fdw_unable_to_create_execution", "HV00L"),
258    ("fdw_unable_to_create_reply", "HV00M"),
259    ("fdw_unable_to_establish_connection", "HV00N"),
260    ("plpgsql_error", "P0000"),
261    ("raise_exception", "P0001"),
262    ("no_data_found", "P0002"),
263    ("too_many_rows", "P0003"),
264    ("assert_failure", "P0004"),
265    ("internal_error", "XX000"),
266    ("data_corrupted", "XX001"),
267    ("index_corrupted", "XX002"),
268];
269
270/// Map a PL/pgSQL condition name to the SQLSTATE used by
271/// `RAISE condition_name`.
272pub fn condition_sqlstate(name: &str) -> Option<&'static str> {
273    PLPGSQL_CONDITION_SQLSTATES
274        .iter()
275        .find(|(condition, _)| *condition == name)
276        .map(|(_, state)| *state)
277}
278
279/// Return every SQLSTATE matched by a PL/pgSQL exception condition.
280pub fn condition_sqlstates(name: &str) -> impl Iterator<Item = &'static str> + '_ {
281    PLPGSQL_CONDITION_SQLSTATES
282        .iter()
283        .filter(move |(condition, _)| *condition == name)
284        .map(|(_, state)| *state)
285}