Skip to main content

icydb_diagnostic_code/
lib.rs

1//! Compact diagnostic identity for IcyDB.
2//!
3//! This crate intentionally contains no rich diagnostic prose or Candid wire
4//! types. Production canister builds collapse diagnostics to numeric wire
5//! codes before they cross the public canister boundary. `Debug` output is
6//! numeric for the same reason: host tooling can recover labels from the code
7//! table without making every wasm canister retain those labels.
8
9use std::fmt;
10
11///
12/// DiagnosticCode
13///
14/// Stable machine-readable diagnostic reason.
15///
16
17#[derive(Clone, Copy, Eq, Hash, PartialEq)]
18pub enum DiagnosticCode {
19    QueryValidate,
20    QueryIntent,
21    QueryPlan,
22    QueryAccessRequirement,
23    QueryUnorderedPagination,
24    QueryInvalidContinuationCursor,
25    QueryNotFound,
26    QueryNotUnique,
27    QueryNumericOverflow,
28    QueryNumericNotRepresentable,
29    QueryUnknownAggregateTargetField,
30    QueryUnsupportedProjection,
31    QueryResultShapeMismatch,
32    QueryUnsupportedSqlFeature,
33    QuerySqlSurfaceMismatch,
34    QuerySqlWriteBoundary,
35    SchemaDdlAdmission,
36    StoreNotFound,
37    StoreCorruption,
38    StoreInvariantViolation,
39    RuntimeCorruption,
40    RuntimeIncompatiblePersistedFormat,
41    RuntimeInvariantViolation,
42    RuntimeConflict,
43    RuntimeNotFound,
44    RuntimeUnsupported,
45    RuntimeInternal,
46}
47
48impl DiagnosticCode {
49    /// Return the broad diagnostic class for this code.
50    #[must_use]
51    pub const fn class(self) -> ErrorClass {
52        match self {
53            Self::StoreCorruption | Self::RuntimeCorruption => ErrorClass::Corruption,
54            Self::RuntimeIncompatiblePersistedFormat => ErrorClass::IncompatiblePersistedFormat,
55            Self::QueryNotFound | Self::StoreNotFound | Self::RuntimeNotFound => {
56                ErrorClass::NotFound
57            }
58            Self::RuntimeConflict => ErrorClass::Conflict,
59            Self::QueryUnsupportedSqlFeature
60            | Self::QueryUnknownAggregateTargetField
61            | Self::QueryUnsupportedProjection
62            | Self::QueryResultShapeMismatch
63            | Self::QuerySqlSurfaceMismatch
64            | Self::QuerySqlWriteBoundary
65            | Self::RuntimeUnsupported => ErrorClass::Unsupported,
66            Self::StoreInvariantViolation | Self::RuntimeInvariantViolation => {
67                ErrorClass::InvariantViolation
68            }
69            Self::RuntimeInternal => ErrorClass::Internal,
70            Self::QueryValidate
71            | Self::QueryIntent
72            | Self::QueryPlan
73            | Self::QueryAccessRequirement
74            | Self::QueryUnorderedPagination
75            | Self::QueryInvalidContinuationCursor
76            | Self::QueryNotUnique
77            | Self::QueryNumericOverflow
78            | Self::QueryNumericNotRepresentable
79            | Self::SchemaDdlAdmission => ErrorClass::Query,
80        }
81    }
82
83    /// Return the default diagnostic origin for this code.
84    #[must_use]
85    pub const fn origin(self) -> ErrorOrigin {
86        match self {
87            Self::StoreNotFound | Self::StoreCorruption | Self::StoreInvariantViolation => {
88                ErrorOrigin::Store
89            }
90            Self::RuntimeCorruption
91            | Self::RuntimeIncompatiblePersistedFormat
92            | Self::RuntimeInvariantViolation
93            | Self::RuntimeConflict
94            | Self::RuntimeNotFound
95            | Self::RuntimeUnsupported
96            | Self::RuntimeInternal => ErrorOrigin::Runtime,
97            Self::QueryValidate
98            | Self::QueryIntent
99            | Self::QueryPlan
100            | Self::QueryAccessRequirement
101            | Self::QueryUnorderedPagination
102            | Self::QueryInvalidContinuationCursor
103            | Self::QueryNotFound
104            | Self::QueryNotUnique
105            | Self::QueryNumericOverflow
106            | Self::QueryNumericNotRepresentable
107            | Self::QueryUnknownAggregateTargetField
108            | Self::QueryUnsupportedProjection
109            | Self::QueryResultShapeMismatch
110            | Self::QueryUnsupportedSqlFeature
111            | Self::QuerySqlSurfaceMismatch
112            | Self::QuerySqlWriteBoundary
113            | Self::SchemaDdlAdmission => ErrorOrigin::Query,
114        }
115    }
116
117    /// Return the compact public wire code for this broad diagnostic reason.
118    #[must_use]
119    pub const fn error_code(self) -> ErrorCode {
120        match self {
121            Self::QueryValidate => ErrorCode::QUERY_VALIDATE,
122            Self::QueryIntent => ErrorCode::QUERY_INTENT,
123            Self::QueryPlan => ErrorCode::QUERY_PLAN,
124            Self::QueryAccessRequirement => ErrorCode::QUERY_ACCESS_REQUIREMENT,
125            Self::QueryUnorderedPagination => ErrorCode::QUERY_UNORDERED_PAGINATION,
126            Self::QueryInvalidContinuationCursor => ErrorCode::QUERY_INVALID_CONTINUATION_CURSOR,
127            Self::QueryNotFound => ErrorCode::QUERY_NOT_FOUND,
128            Self::QueryNotUnique => ErrorCode::QUERY_NOT_UNIQUE,
129            Self::QueryNumericOverflow => ErrorCode::QUERY_NUMERIC_OVERFLOW,
130            Self::QueryNumericNotRepresentable => ErrorCode::QUERY_NUMERIC_NOT_REPRESENTABLE,
131            Self::QueryUnknownAggregateTargetField => {
132                ErrorCode::QUERY_UNKNOWN_AGGREGATE_TARGET_FIELD
133            }
134            Self::QueryUnsupportedProjection => ErrorCode::QUERY_UNSUPPORTED_PROJECTION,
135            Self::QueryResultShapeMismatch => ErrorCode::QUERY_RESULT_SHAPE_MISMATCH,
136            Self::QueryUnsupportedSqlFeature => ErrorCode::QUERY_UNSUPPORTED_SQL_FEATURE,
137            Self::QuerySqlSurfaceMismatch => ErrorCode::QUERY_SQL_SURFACE_MISMATCH,
138            Self::QuerySqlWriteBoundary => ErrorCode::QUERY_SQL_WRITE_BOUNDARY,
139            Self::SchemaDdlAdmission => ErrorCode::SCHEMA_DDL_ADMISSION,
140            Self::StoreNotFound => ErrorCode::STORE_NOT_FOUND,
141            Self::StoreCorruption => ErrorCode::STORE_CORRUPTION,
142            Self::StoreInvariantViolation => ErrorCode::STORE_INVARIANT_VIOLATION,
143            Self::RuntimeCorruption => ErrorCode::RUNTIME_CORRUPTION,
144            Self::RuntimeIncompatiblePersistedFormat => {
145                ErrorCode::RUNTIME_INCOMPATIBLE_PERSISTED_FORMAT
146            }
147            Self::RuntimeInvariantViolation => ErrorCode::RUNTIME_INVARIANT_VIOLATION,
148            Self::RuntimeConflict => ErrorCode::RUNTIME_CONFLICT,
149            Self::RuntimeNotFound => ErrorCode::RUNTIME_NOT_FOUND,
150            Self::RuntimeUnsupported => ErrorCode::RUNTIME_UNSUPPORTED,
151            Self::RuntimeInternal => ErrorCode::RUNTIME_INTERNAL,
152        }
153    }
154}
155
156///
157/// ErrorCode
158///
159/// Stable numeric public error identity.
160///
161/// The public Candid `icydb::Error` stores this value as `nat16` so canister
162/// interfaces do not retain rich diagnostic enum labels. Rich diagnostics can
163/// still be reconstructed by host-side tooling from this leaf code. Before
164/// 1.0.0, the code space is hard-cut to a single compact sequential range.
165///
166
167#[derive(Clone, Copy, Eq, Hash, PartialEq)]
168pub struct ErrorCode(u16);
169
170impl ErrorCode {
171    pub const QUERY_VALIDATE: Self = Self(1);
172    pub const QUERY_INTENT: Self = Self(2);
173    pub const QUERY_PLAN: Self = Self(3);
174    pub const QUERY_ACCESS_REQUIREMENT: Self = Self(4);
175    pub const QUERY_UNORDERED_PAGINATION: Self = Self(5);
176    pub const QUERY_INVALID_CONTINUATION_CURSOR: Self = Self(6);
177    pub const QUERY_NOT_FOUND: Self = Self(7);
178    pub const QUERY_NOT_UNIQUE: Self = Self(8);
179    pub const QUERY_NUMERIC_OVERFLOW: Self = Self(9);
180    pub const QUERY_NUMERIC_NOT_REPRESENTABLE: Self = Self(10);
181    pub const QUERY_UNKNOWN_AGGREGATE_TARGET_FIELD: Self = Self(11);
182    pub const QUERY_UNSUPPORTED_SQL_FEATURE: Self = Self(12);
183    pub const QUERY_SQL_SURFACE_MISMATCH: Self = Self(13);
184    pub const SCHEMA_DDL_ADMISSION: Self = Self(14);
185    pub const STORE_NOT_FOUND: Self = Self(15);
186    pub const STORE_CORRUPTION: Self = Self(16);
187    pub const STORE_INVARIANT_VIOLATION: Self = Self(17);
188    pub const RUNTIME_CORRUPTION: Self = Self(18);
189    pub const RUNTIME_INCOMPATIBLE_PERSISTED_FORMAT: Self = Self(19);
190    pub const RUNTIME_INVARIANT_VIOLATION: Self = Self(20);
191    pub const RUNTIME_CONFLICT: Self = Self(21);
192    pub const RUNTIME_NOT_FOUND: Self = Self(22);
193    pub const RUNTIME_UNSUPPORTED: Self = Self(23);
194    pub const RUNTIME_INTERNAL: Self = Self(24);
195
196    pub const RUNTIME_BOUNDARY_SQL_SURFACE_CONTROLLER_REQUIRED: Self = Self(25);
197    pub const RUNTIME_BOUNDARY_SCHEMA_SURFACE_CONTROLLER_REQUIRED: Self = Self(26);
198    pub const RUNTIME_BOUNDARY_SQL_QUERY_NO_CONFIGURED_ENTITIES: Self = Self(27);
199    pub const RUNTIME_BOUNDARY_SQL_QUERY_ENTITY_NOT_CONFIGURED: Self = Self(28);
200    pub const RUNTIME_BOUNDARY_SQL_DDL_TARGET_REQUIRED: Self = Self(29);
201    pub const RUNTIME_BOUNDARY_SQL_DDL_ENTITY_NOT_CONFIGURED: Self = Self(30);
202    pub const RUNTIME_BOUNDARY_QUERY_RESPONSE_ROWS_REQUIRED: Self = Self(31);
203    pub const RUNTIME_BOUNDARY_QUERY_RESPONSE_GROUPED_ROWS_REQUIRED: Self = Self(32);
204    pub const RUNTIME_BOUNDARY_MUTATION_RESULT_ENTITY_REQUIRED: Self = Self(33);
205    pub const RUNTIME_BOUNDARY_MUTATION_RESULT_ENTITIES_REQUIRED: Self = Self(34);
206    pub const RUNTIME_BOUNDARY_MUTATION_RESULT_ID_REQUIRED: Self = Self(35);
207    pub const RUNTIME_BOUNDARY_MUTATION_RESULT_IDS_REQUIRED: Self = Self(36);
208    pub const RUNTIME_BOUNDARY_ROW_PROJECTION_FIELD_NOT_CONFIGURED: Self = Self(37);
209
210    pub const SQL_FEATURE_AGGREGATE_FILTER_CLAUSE: Self = Self(38);
211    pub const SQL_FEATURE_ALTER_STATEMENT_BEYOND_ALTER_TABLE: Self = Self(39);
212    pub const SQL_FEATURE_ALTER_TABLE_ADD_COLUMN_DUPLICATE_DEFAULT: Self = Self(40);
213    pub const SQL_FEATURE_ALTER_TABLE_ADD_COLUMN_MODIFIERS: Self = Self(41);
214    pub const SQL_FEATURE_ALTER_TABLE_ADD_STATEMENT_BEYOND_ADD_COLUMN: Self = Self(42);
215    pub const SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_DROP_UNSUPPORTED_ACTION: Self = Self(43);
216    pub const SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_MODIFIERS: Self = Self(44);
217    pub const SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_SET_UNSUPPORTED_ACTION: Self = Self(45);
218    pub const SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_UNSUPPORTED_ACTION: Self = Self(46);
219    pub const SQL_FEATURE_ALTER_TABLE_ALTER_STATEMENT_BEYOND_ALTER_COLUMN: Self = Self(47);
220    pub const SQL_FEATURE_ALTER_TABLE_DROP_COLUMN_IF_EXISTS_SYNTAX: Self = Self(48);
221    pub const SQL_FEATURE_ALTER_TABLE_DROP_COLUMN_MODIFIERS: Self = Self(49);
222    pub const SQL_FEATURE_ALTER_TABLE_DROP_STATEMENT_BEYOND_DROP_COLUMN: Self = Self(50);
223    pub const SQL_FEATURE_ALTER_TABLE_RENAME_COLUMN_MISSING_TO: Self = Self(51);
224    pub const SQL_FEATURE_ALTER_TABLE_RENAME_COLUMN_MODIFIERS: Self = Self(52);
225    pub const SQL_FEATURE_ALTER_TABLE_RENAME_STATEMENT_BEYOND_RENAME_COLUMN: Self = Self(53);
226    pub const SQL_FEATURE_ALTER_TABLE_UNSUPPORTED_OPERATION: Self = Self(54);
227    pub const SQL_FEATURE_COLUMN_ALIAS: Self = Self(55);
228    pub const SQL_FEATURE_CREATE_INDEX_IF_NOT_EXISTS_SYNTAX: Self = Self(56);
229    pub const SQL_FEATURE_CREATE_INDEX_KEY_ORDERING_MODIFIERS: Self = Self(57);
230    pub const SQL_FEATURE_CREATE_INDEX_MODIFIERS: Self = Self(58);
231    pub const SQL_FEATURE_CREATE_STATEMENT_BEYOND_CREATE_INDEX: Self = Self(59);
232    pub const SQL_FEATURE_DESCRIBE_MODIFIER: Self = Self(60);
233    pub const SQL_FEATURE_DDL_SCHEMA_VERSION_DUPLICATE_EXPECTED_CLAUSE: Self = Self(61);
234    pub const SQL_FEATURE_DDL_SCHEMA_VERSION_DUPLICATE_SET_CLAUSE: Self = Self(62);
235    pub const SQL_FEATURE_DROP_INDEX_MODIFIERS: Self = Self(63);
236    pub const SQL_FEATURE_DROP_INDEX_IF_EXISTS_SYNTAX: Self = Self(64);
237    pub const SQL_FEATURE_DROP_STATEMENT_BEYOND_DROP_INDEX: Self = Self(65);
238    pub const SQL_FEATURE_EXPRESSION_INDEX_UNSUPPORTED_FUNCTION: Self = Self(66);
239    pub const SQL_FEATURE_HAVING: Self = Self(67);
240    pub const SQL_FEATURE_INSERT: Self = Self(68);
241    pub const SQL_FEATURE_JOIN: Self = Self(69);
242    pub const SQL_FEATURE_LIKE_PATTERN_BEYOND_TRAILING_PREFIX: Self = Self(70);
243    pub const SQL_FEATURE_LOWER_FIELD_PREDICATE_UNSUPPORTED: Self = Self(71);
244    pub const SQL_FEATURE_MULTI_STATEMENT_SQL: Self = Self(72);
245    pub const SQL_FEATURE_NESTED_AGGREGATE_INPUT: Self = Self(73);
246    pub const SQL_FEATURE_NESTED_PROJECTION_FUNCTION_IN_ARITHMETIC: Self = Self(74);
247    pub const SQL_FEATURE_ORDER_BY_UNSUPPORTED_FORM: Self = Self(75);
248    pub const SQL_FEATURE_OTHER: Self = Self(76);
249    pub const SQL_FEATURE_PARAMETER_BINDING: Self = Self(77);
250    pub const SQL_FEATURE_PARAMETERIZED_SCHEMA_VERSION: Self = Self(78);
251    pub const SQL_FEATURE_PREDICATE_STARTS_WITH_FIRST_ARGUMENT: Self = Self(79);
252    pub const SQL_FEATURE_QUOTED_IDENTIFIERS: Self = Self(80);
253    pub const SQL_FEATURE_RETURNING_UNSUPPORTED_SHAPE: Self = Self(81);
254    pub const SQL_FEATURE_SCALAR_FUNCTION_EXPRESSION_POSITION: Self = Self(82);
255    pub const SQL_FEATURE_SCALE_TAKING_NUMERIC_FUNCTION_EXPRESSION_POSITION: Self = Self(83);
256    pub const SQL_FEATURE_SEARCHED_CASE_GROUPED_ORDER_BY: Self = Self(84);
257    pub const SQL_FEATURE_SHOW_COLUMNS_MODIFIERS: Self = Self(85);
258    pub const SQL_FEATURE_SHOW_ENTITIES_MODIFIERS: Self = Self(86);
259    pub const SQL_FEATURE_SHOW_INDEXES_MODIFIERS: Self = Self(87);
260    pub const SQL_FEATURE_SHOW_MEMORY_MODIFIERS: Self = Self(88);
261    pub const SQL_FEATURE_SHOW_STORES_MODIFIERS: Self = Self(89);
262    pub const SQL_FEATURE_SHOW_UNSUPPORTED_COMMAND: Self = Self(90);
263    pub const SQL_FEATURE_SIMPLE_CASE_EXPRESSION: Self = Self(91);
264    pub const SQL_FEATURE_STANDALONE_LITERAL_PROJECTION_ITEM: Self = Self(92);
265    pub const SQL_FEATURE_SUPPORTED_GROUPED_ORDER_BY_EXPRESSION_FAMILY: Self = Self(93);
266    pub const SQL_FEATURE_SUPPORTED_ORDER_BY_EXPRESSION_FAMILY: Self = Self(94);
267    pub const SQL_FEATURE_UNION_INTERSECT_EXCEPT: Self = Self(95);
268    pub const SQL_FEATURE_UNSUPPORTED_FUNCTION_NAMESPACE: Self = Self(96);
269    pub const SQL_FEATURE_UPDATE: Self = Self(97);
270    pub const SQL_FEATURE_UPPER_FIELD_PREDICATE_UNSUPPORTED: Self = Self(98);
271    pub const SQL_FEATURE_WINDOW_FUNCTION: Self = Self(99);
272    pub const SQL_FEATURE_WITH: Self = Self(100);
273    pub const SQL_FEATURE_NUMERIC_SCALE_FUNCTION_ARGUMENTS: Self = Self(101);
274    pub const SQL_FEATURE_ORDER_BY_FIELD_NOT_ORDERABLE: Self = Self(102);
275
276    const SQL_FEATURE_DETAILS: [SqlFeatureCode; 65] = [
277        SqlFeatureCode::AggregateFilterClause,
278        SqlFeatureCode::AlterStatementBeyondAlterTable,
279        SqlFeatureCode::AlterTableAddColumnDuplicateDefault,
280        SqlFeatureCode::AlterTableAddColumnModifiers,
281        SqlFeatureCode::AlterTableAddStatementBeyondAddColumn,
282        SqlFeatureCode::AlterTableAlterColumnDropUnsupportedAction,
283        SqlFeatureCode::AlterTableAlterColumnModifiers,
284        SqlFeatureCode::AlterTableAlterColumnSetUnsupportedAction,
285        SqlFeatureCode::AlterTableAlterColumnUnsupportedAction,
286        SqlFeatureCode::AlterTableAlterStatementBeyondAlterColumn,
287        SqlFeatureCode::AlterTableDropColumnIfExistsSyntax,
288        SqlFeatureCode::AlterTableDropColumnModifiers,
289        SqlFeatureCode::AlterTableDropStatementBeyondDropColumn,
290        SqlFeatureCode::AlterTableRenameColumnMissingTo,
291        SqlFeatureCode::AlterTableRenameColumnModifiers,
292        SqlFeatureCode::AlterTableRenameStatementBeyondRenameColumn,
293        SqlFeatureCode::AlterTableUnsupportedOperation,
294        SqlFeatureCode::ColumnAlias,
295        SqlFeatureCode::CreateIndexIfNotExistsSyntax,
296        SqlFeatureCode::CreateIndexKeyOrderingModifiers,
297        SqlFeatureCode::CreateIndexModifiers,
298        SqlFeatureCode::CreateStatementBeyondCreateIndex,
299        SqlFeatureCode::DescribeModifier,
300        SqlFeatureCode::DdlSchemaVersionDuplicateExpectedClause,
301        SqlFeatureCode::DdlSchemaVersionDuplicateSetClause,
302        SqlFeatureCode::DropIndexModifiers,
303        SqlFeatureCode::DropIndexIfExistsSyntax,
304        SqlFeatureCode::DropStatementBeyondDropIndex,
305        SqlFeatureCode::ExpressionIndexUnsupportedFunction,
306        SqlFeatureCode::Having,
307        SqlFeatureCode::Insert,
308        SqlFeatureCode::Join,
309        SqlFeatureCode::LikePatternBeyondTrailingPrefix,
310        SqlFeatureCode::LowerFieldPredicateUnsupported,
311        SqlFeatureCode::MultiStatementSql,
312        SqlFeatureCode::NestedAggregateInput,
313        SqlFeatureCode::NestedProjectionFunctionInArithmetic,
314        SqlFeatureCode::OrderByUnsupportedForm,
315        SqlFeatureCode::Other,
316        SqlFeatureCode::ParameterBinding,
317        SqlFeatureCode::ParameterizedSchemaVersion,
318        SqlFeatureCode::PredicateStartsWithFirstArgument,
319        SqlFeatureCode::QuotedIdentifiers,
320        SqlFeatureCode::ReturningUnsupportedShape,
321        SqlFeatureCode::ScalarFunctionExpressionPosition,
322        SqlFeatureCode::ScaleTakingNumericFunctionExpressionPosition,
323        SqlFeatureCode::SearchedCaseGroupedOrderBy,
324        SqlFeatureCode::ShowColumnsModifiers,
325        SqlFeatureCode::ShowEntitiesModifiers,
326        SqlFeatureCode::ShowIndexesModifiers,
327        SqlFeatureCode::ShowMemoryModifiers,
328        SqlFeatureCode::ShowStoresModifiers,
329        SqlFeatureCode::ShowUnsupportedCommand,
330        SqlFeatureCode::SimpleCaseExpression,
331        SqlFeatureCode::StandaloneLiteralProjectionItem,
332        SqlFeatureCode::SupportedGroupedOrderByExpressionFamily,
333        SqlFeatureCode::SupportedOrderByExpressionFamily,
334        SqlFeatureCode::UnionIntersectExcept,
335        SqlFeatureCode::UnsupportedFunctionNamespace,
336        SqlFeatureCode::Update,
337        SqlFeatureCode::UpperFieldPredicateUnsupported,
338        SqlFeatureCode::WindowFunction,
339        SqlFeatureCode::With,
340        SqlFeatureCode::NumericScaleFunctionArguments,
341        SqlFeatureCode::OrderByFieldNotOrderable,
342    ];
343
344    pub const SQL_SURFACE_QUERY_REJECTS_INSERT: Self = Self(103);
345    pub const SQL_SURFACE_QUERY_REJECTS_UPDATE: Self = Self(104);
346    pub const SQL_SURFACE_QUERY_REJECTS_DELETE: Self = Self(105);
347    pub const SQL_SURFACE_UPDATE_REJECTS_SELECT: Self = Self(106);
348    pub const SQL_SURFACE_UPDATE_REJECTS_EXPLAIN: Self = Self(107);
349    pub const SQL_SURFACE_UPDATE_REJECTS_DESCRIBE: Self = Self(108);
350    pub const SQL_SURFACE_UPDATE_REJECTS_SHOW_INDEXES: Self = Self(109);
351    pub const SQL_SURFACE_UPDATE_REJECTS_SHOW_COLUMNS: Self = Self(110);
352    pub const SQL_SURFACE_UPDATE_REJECTS_SHOW_ENTITIES: Self = Self(111);
353    pub const SQL_SURFACE_UPDATE_REJECTS_SHOW_STORES: Self = Self(112);
354    pub const SQL_SURFACE_UPDATE_REJECTS_SHOW_MEMORY: Self = Self(113);
355
356    pub const SCHEMA_DDL_MISSING_EXPECTED_SCHEMA_VERSION: Self = Self(114);
357    pub const SCHEMA_DDL_MISSING_NEXT_SCHEMA_VERSION: Self = Self(115);
358    pub const SCHEMA_DDL_STALE_EXPECTED_SCHEMA_VERSION: Self = Self(116);
359    pub const SCHEMA_DDL_INVALID_EXPECTED_SCHEMA_VERSION: Self = Self(117);
360    pub const SCHEMA_DDL_INVALID_NEXT_SCHEMA_VERSION: Self = Self(118);
361    pub const SCHEMA_DDL_ACCEPTED_SCHEMA_CHANGE_WITHOUT_VERSION_BUMP: Self = Self(119);
362    pub const SCHEMA_DDL_EMPTY_VERSION_BUMP: Self = Self(120);
363    pub const SCHEMA_DDL_VERSION_GAP: Self = Self(121);
364    pub const SCHEMA_DDL_VERSION_ROLLBACK: Self = Self(122);
365    pub const SCHEMA_DDL_FINGERPRINT_METHOD_MISMATCH: Self = Self(123);
366    pub const SCHEMA_DDL_UNSUPPORTED_TRANSITION_CLASS: Self = Self(124);
367    pub const SCHEMA_DDL_PHYSICAL_RUNNER_MISSING: Self = Self(125);
368    pub const SCHEMA_DDL_VALIDATION_FAILED: Self = Self(126);
369    pub const SCHEMA_DDL_PUBLICATION_RACE_LOST: Self = Self(127);
370    pub const SCHEMA_DDL_INVALID_ADD_COLUMN_DEFAULT: Self = Self(128);
371    pub const SCHEMA_DDL_INVALID_ALTER_COLUMN_DEFAULT: Self = Self(129);
372    pub const SCHEMA_DDL_GENERATED_INDEX_DROP_REJECTED: Self = Self(130);
373    pub const SCHEMA_DDL_REQUIRED_DROP_DEFAULT_UNSUPPORTED: Self = Self(131);
374    pub const SCHEMA_DDL_GENERATED_FIELD_DEFAULT_CHANGE_REJECTED: Self = Self(132);
375    pub const SCHEMA_DDL_GENERATED_FIELD_NULLABILITY_CHANGE_REJECTED: Self = Self(133);
376    pub const SCHEMA_DDL_SET_NOT_NULL_VALIDATION_FAILED: Self = Self(134);
377    pub const QUERY_SQL_WRITE_BOUNDARY: Self = Self(135);
378    pub const SQL_WRITE_PRIMARY_KEY_LITERAL_SHAPE: Self = Self(136);
379    pub const SQL_WRITE_PRIMARY_KEY_LITERAL_INCOMPATIBLE: Self = Self(137);
380    pub const SQL_WRITE_MISSING_PRIMARY_KEY: Self = Self(138);
381    pub const SQL_WRITE_MISSING_REQUIRED_FIELDS: Self = Self(139);
382    pub const SQL_WRITE_EXPLICIT_MANAGED_FIELD: Self = Self(140);
383    pub const SQL_WRITE_EXPLICIT_GENERATED_FIELD: Self = Self(141);
384    pub const SQL_WRITE_INSERT_SELECT_REQUIRES_SCALAR: Self = Self(142);
385    pub const SQL_WRITE_INSERT_SELECT_AGGREGATE_PROJECTION: Self = Self(143);
386    pub const SQL_WRITE_INSERT_SELECT_WIDTH_MISMATCH: Self = Self(144);
387    pub const SQL_WRITE_UPDATE_PRIMARY_KEY_MUTATION: Self = Self(145);
388    pub const SQL_WRITE_INVALID_FIELD_LITERAL: Self = Self(146);
389    pub const SQL_WRITE_UNKNOWN_RETURNING_FIELD: Self = Self(147);
390    pub const SQL_WRITE_DUPLICATE_RETURNING_FIELD: Self = Self(148);
391    pub const SQL_WRITE_UPDATE_MISSING_WHERE_PREDICATE: Self = Self(149);
392    pub const SQL_WRITE_ORDER_BY_UNSUPPORTED_SHAPE: Self = Self(150);
393    pub const SQL_WRITE_RETURNING_RESPONSE_TOO_LARGE: Self = Self(183);
394    pub const QUERY_UNSUPPORTED_PROJECTION: Self = Self(151);
395    pub const QUERY_PROJECTION_NUMERIC_LITERAL_REQUIRED: Self = Self(152);
396    pub const QUERY_PROJECTION_NUMERIC_SCALE_ARGUMENTS: Self = Self(153);
397    pub const QUERY_PROJECTION_NESTED_FIELD_PATH_PREVIEW: Self = Self(154);
398    pub const QUERY_PROJECTION_CASE_CONDITION_BOOLEAN_REQUIRED: Self = Self(155);
399    pub const QUERY_PROJECTION_NUMERIC_INPUT_REQUIRED: Self = Self(156);
400    pub const QUERY_PROJECTION_TEXT_OR_BLOB_INPUT_REQUIRED: Self = Self(157);
401    pub const QUERY_PROJECTION_TEXT_INPUT_REQUIRED: Self = Self(158);
402    pub const QUERY_PROJECTION_TEXT_OR_NULL_ARGUMENT_REQUIRED: Self = Self(159);
403    pub const QUERY_PROJECTION_INTEGER_OR_NULL_ARGUMENT_REQUIRED: Self = Self(160);
404    pub const QUERY_PROJECTION_UNARY_OPERAND_INCOMPATIBLE: Self = Self(161);
405    pub const QUERY_PROJECTION_BINARY_OPERANDS_INCOMPATIBLE: Self = Self(162);
406    pub const QUERY_RESULT_SHAPE_MISMATCH: Self = Self(163);
407    pub const QUERY_RESULT_EXPECTED_ROWS: Self = Self(164);
408    pub const QUERY_RESULT_EXPECTED_GROUPED: Self = Self(165);
409    pub const SQL_LOWERING_ENTITY_MISMATCH: Self = Self(166);
410    pub const SQL_LOWERING_SELECT_PROJECTION_SHAPE: Self = Self(167);
411    pub const SQL_LOWERING_SELECT_DISTINCT: Self = Self(168);
412    pub const SQL_LOWERING_DISTINCT_ORDER_BY_PROJECTION: Self = Self(169);
413    pub const SQL_LOWERING_GLOBAL_AGGREGATE_PROJECTION: Self = Self(170);
414    pub const SQL_LOWERING_GLOBAL_AGGREGATE_GROUP_BY: Self = Self(171);
415    pub const SQL_LOWERING_SELECT_GROUP_BY_SHAPE: Self = Self(172);
416    pub const SQL_LOWERING_GROUPED_PROJECTION_EXPLICIT_LIST_REQUIRED: Self = Self(173);
417    pub const SQL_LOWERING_GROUPED_PROJECTION_AGGREGATE_REQUIRED: Self = Self(174);
418    pub const SQL_LOWERING_GROUPED_PROJECTION_NON_GROUP_FIELD: Self = Self(175);
419    pub const SQL_LOWERING_GROUPED_PROJECTION_SCALAR_AFTER_AGGREGATE: Self = Self(176);
420    pub const SQL_LOWERING_HAVING_REQUIRES_GROUP_BY: Self = Self(177);
421    pub const SQL_LOWERING_SELECT_HAVING_SHAPE: Self = Self(178);
422    pub const SQL_LOWERING_AGGREGATE_INPUT_EXPRESSIONS: Self = Self(179);
423    pub const SQL_LOWERING_WHERE_EXPRESSION_SHAPE: Self = Self(180);
424    pub const SQL_LOWERING_PARAMETER_PLACEMENT: Self = Self(181);
425    pub const SQL_LOWERING_SQL_DDL_EXECUTION_UNSUPPORTED: Self = Self(182);
426
427    /// Build an error code from its raw public wire value.
428    #[must_use]
429    pub const fn from_raw(raw: u16) -> Self {
430        Self(raw)
431    }
432
433    /// Return the raw public wire value.
434    #[must_use]
435    pub const fn raw(self) -> u16 {
436        self.0
437    }
438
439    /// Collapse a rich diagnostic into one public leaf code.
440    #[must_use]
441    pub const fn from_parts(code: DiagnosticCode, detail: Option<DiagnosticDetail>) -> Self {
442        match detail {
443            Some(DiagnosticDetail::QueryKind { kind }) => Self::from_query_kind(kind),
444            Some(DiagnosticDetail::RuntimeKind { kind }) => Self::from_runtime_kind(kind),
445            Some(DiagnosticDetail::RuntimeBoundary { boundary }) => {
446                Self::from_runtime_boundary(boundary)
447            }
448            Some(DiagnosticDetail::SchemaDdlAdmission { reason }) => Self::from_schema_ddl(reason),
449            Some(DiagnosticDetail::UnsupportedSqlFeature { feature }) => {
450                Self::from_sql_feature(feature)
451            }
452            Some(DiagnosticDetail::SqlSurfaceMismatch { mismatch }) => {
453                Self::from_sql_surface_mismatch(mismatch)
454            }
455            Some(DiagnosticDetail::SqlWriteBoundary { boundary }) => {
456                Self::from_sql_write_boundary(boundary)
457            }
458            Some(DiagnosticDetail::QueryProjection { reason }) => {
459                Self::from_query_projection(reason)
460            }
461            Some(DiagnosticDetail::QueryResultShape { reason }) => {
462                Self::from_query_result_shape(reason)
463            }
464            Some(DiagnosticDetail::SqlLowering { reason }) => Self::from_sql_lowering(reason),
465            None => code.error_code(),
466        }
467    }
468
469    /// Return the broad diagnostic reason represented by this public code.
470    #[must_use]
471    pub const fn diagnostic_code(self) -> DiagnosticCode {
472        match self.raw() {
473            1 => DiagnosticCode::QueryValidate,
474            2 => DiagnosticCode::QueryIntent,
475            3 => DiagnosticCode::QueryPlan,
476            4 => DiagnosticCode::QueryAccessRequirement,
477            5 => DiagnosticCode::QueryUnorderedPagination,
478            6 => DiagnosticCode::QueryInvalidContinuationCursor,
479            7 => DiagnosticCode::QueryNotFound,
480            8 => DiagnosticCode::QueryNotUnique,
481            9 => DiagnosticCode::QueryNumericOverflow,
482            10 => DiagnosticCode::QueryNumericNotRepresentable,
483            11 => DiagnosticCode::QueryUnknownAggregateTargetField,
484            151..=162 => DiagnosticCode::QueryUnsupportedProjection,
485            163..=165 => DiagnosticCode::QueryResultShapeMismatch,
486            12 | 38..=102 | 166..=182 => DiagnosticCode::QueryUnsupportedSqlFeature,
487            13 | 103..=113 => DiagnosticCode::QuerySqlSurfaceMismatch,
488            14 | 114..=134 => DiagnosticCode::SchemaDdlAdmission,
489            135..=150 | 183 => DiagnosticCode::QuerySqlWriteBoundary,
490            15 => DiagnosticCode::StoreNotFound,
491            16 => DiagnosticCode::StoreCorruption,
492            17 => DiagnosticCode::StoreInvariantViolation,
493            18 => DiagnosticCode::RuntimeCorruption,
494            19 => DiagnosticCode::RuntimeIncompatiblePersistedFormat,
495            20 => DiagnosticCode::RuntimeInvariantViolation,
496            21 => DiagnosticCode::RuntimeConflict,
497            22 => DiagnosticCode::RuntimeNotFound,
498            23 | 25..=37 => DiagnosticCode::RuntimeUnsupported,
499            _ => DiagnosticCode::RuntimeInternal,
500        }
501    }
502
503    /// Return the diagnostic class represented by this public code.
504    #[must_use]
505    pub const fn class(self) -> ErrorClass {
506        self.diagnostic_code().class()
507    }
508
509    /// Reconstruct rich diagnostic detail for host-side rendering, when known.
510    #[must_use]
511    pub const fn diagnostic_detail(self) -> Option<DiagnosticDetail> {
512        match self.raw() {
513            1..=8 => Self::query_kind_detail(self.raw()),
514            18..=24 => Self::runtime_kind_detail(self.raw()),
515            25..=37 => Self::runtime_boundary_detail(self.raw()),
516            38..=102 => Self::sql_feature_detail(self.raw()),
517            103..=113 => Self::sql_surface_detail(self.raw()),
518            114..=134 => Self::schema_ddl_detail(self.raw()),
519            136..=150 | 183 => Self::sql_write_boundary_detail(self.raw()),
520            152..=162 => Self::query_projection_detail(self.raw()),
521            164..=165 => Self::query_result_shape_detail(self.raw()),
522            166..=182 => Self::sql_lowering_detail(self.raw()),
523            _ => None,
524        }
525    }
526
527    /// Reconstruct a rich diagnostic payload for host-side rendering.
528    #[must_use]
529    pub const fn diagnostic(self, origin: ErrorOrigin) -> Diagnostic {
530        Diagnostic::new(self.diagnostic_code(), origin, self.diagnostic_detail())
531    }
532
533    const fn from_query_kind(kind: QueryErrorKind) -> Self {
534        match kind {
535            QueryErrorKind::Validate => Self::QUERY_VALIDATE,
536            QueryErrorKind::Intent => Self::QUERY_INTENT,
537            QueryErrorKind::Plan => Self::QUERY_PLAN,
538            QueryErrorKind::AccessRequirement => Self::QUERY_ACCESS_REQUIREMENT,
539            QueryErrorKind::UnorderedPagination => Self::QUERY_UNORDERED_PAGINATION,
540            QueryErrorKind::InvalidContinuationCursor => Self::QUERY_INVALID_CONTINUATION_CURSOR,
541            QueryErrorKind::NotFound => Self::QUERY_NOT_FOUND,
542            QueryErrorKind::NotUnique => Self::QUERY_NOT_UNIQUE,
543        }
544    }
545
546    const fn from_runtime_kind(kind: RuntimeErrorKind) -> Self {
547        match kind {
548            RuntimeErrorKind::Corruption => Self::RUNTIME_CORRUPTION,
549            RuntimeErrorKind::IncompatiblePersistedFormat => {
550                Self::RUNTIME_INCOMPATIBLE_PERSISTED_FORMAT
551            }
552            RuntimeErrorKind::InvariantViolation => Self::RUNTIME_INVARIANT_VIOLATION,
553            RuntimeErrorKind::Conflict => Self::RUNTIME_CONFLICT,
554            RuntimeErrorKind::NotFound => Self::RUNTIME_NOT_FOUND,
555            RuntimeErrorKind::Unsupported => Self::RUNTIME_UNSUPPORTED,
556            RuntimeErrorKind::Internal => Self::RUNTIME_INTERNAL,
557        }
558    }
559
560    const fn from_runtime_boundary(boundary: RuntimeBoundaryCode) -> Self {
561        Self(Self::RUNTIME_BOUNDARY_SQL_SURFACE_CONTROLLER_REQUIRED.raw() + boundary as u16)
562    }
563
564    const fn from_sql_feature(feature: SqlFeatureCode) -> Self {
565        Self(Self::SQL_FEATURE_AGGREGATE_FILTER_CLAUSE.raw() + feature as u16)
566    }
567
568    const fn from_sql_surface_mismatch(mismatch: SqlSurfaceMismatchCode) -> Self {
569        Self(Self::SQL_SURFACE_QUERY_REJECTS_INSERT.raw() + mismatch as u16)
570    }
571
572    const fn from_schema_ddl(reason: SchemaDdlAdmissionCode) -> Self {
573        Self(Self::SCHEMA_DDL_MISSING_EXPECTED_SCHEMA_VERSION.raw() + reason as u16)
574    }
575
576    const fn from_sql_write_boundary(boundary: SqlWriteBoundaryCode) -> Self {
577        match boundary {
578            SqlWriteBoundaryCode::ReturningResponseTooLarge => {
579                Self::SQL_WRITE_RETURNING_RESPONSE_TOO_LARGE
580            }
581            _ => Self(Self::SQL_WRITE_PRIMARY_KEY_LITERAL_SHAPE.raw() + boundary as u16),
582        }
583    }
584
585    const fn from_query_projection(reason: QueryProjectionCode) -> Self {
586        Self(Self::QUERY_PROJECTION_NUMERIC_LITERAL_REQUIRED.raw() + reason as u16)
587    }
588
589    const fn from_query_result_shape(reason: QueryResultShapeCode) -> Self {
590        Self(Self::QUERY_RESULT_EXPECTED_ROWS.raw() + reason as u16)
591    }
592
593    const fn from_sql_lowering(reason: SqlLoweringCode) -> Self {
594        Self(Self::SQL_LOWERING_ENTITY_MISMATCH.raw() + reason as u16)
595    }
596
597    const fn query_kind_detail(raw: u16) -> Option<DiagnosticDetail> {
598        match raw {
599            1 => Some(DiagnosticDetail::QueryKind {
600                kind: QueryErrorKind::Validate,
601            }),
602            2 => Some(DiagnosticDetail::QueryKind {
603                kind: QueryErrorKind::Intent,
604            }),
605            3 => Some(DiagnosticDetail::QueryKind {
606                kind: QueryErrorKind::Plan,
607            }),
608            4 => Some(DiagnosticDetail::QueryKind {
609                kind: QueryErrorKind::AccessRequirement,
610            }),
611            5 => Some(DiagnosticDetail::QueryKind {
612                kind: QueryErrorKind::UnorderedPagination,
613            }),
614            6 => Some(DiagnosticDetail::QueryKind {
615                kind: QueryErrorKind::InvalidContinuationCursor,
616            }),
617            7 => Some(DiagnosticDetail::QueryKind {
618                kind: QueryErrorKind::NotFound,
619            }),
620            8 => Some(DiagnosticDetail::QueryKind {
621                kind: QueryErrorKind::NotUnique,
622            }),
623            _ => None,
624        }
625    }
626
627    const fn runtime_kind_detail(raw: u16) -> Option<DiagnosticDetail> {
628        match raw {
629            18 => Some(DiagnosticDetail::RuntimeKind {
630                kind: RuntimeErrorKind::Corruption,
631            }),
632            19 => Some(DiagnosticDetail::RuntimeKind {
633                kind: RuntimeErrorKind::IncompatiblePersistedFormat,
634            }),
635            20 => Some(DiagnosticDetail::RuntimeKind {
636                kind: RuntimeErrorKind::InvariantViolation,
637            }),
638            21 => Some(DiagnosticDetail::RuntimeKind {
639                kind: RuntimeErrorKind::Conflict,
640            }),
641            22 => Some(DiagnosticDetail::RuntimeKind {
642                kind: RuntimeErrorKind::NotFound,
643            }),
644            23 => Some(DiagnosticDetail::RuntimeKind {
645                kind: RuntimeErrorKind::Unsupported,
646            }),
647            24 => Some(DiagnosticDetail::RuntimeKind {
648                kind: RuntimeErrorKind::Internal,
649            }),
650            _ => None,
651        }
652    }
653
654    const fn runtime_boundary_detail(raw: u16) -> Option<DiagnosticDetail> {
655        match raw {
656            25 => Some(DiagnosticDetail::RuntimeBoundary {
657                boundary: RuntimeBoundaryCode::SqlSurfaceControllerRequired,
658            }),
659            26 => Some(DiagnosticDetail::RuntimeBoundary {
660                boundary: RuntimeBoundaryCode::SchemaSurfaceControllerRequired,
661            }),
662            27 => Some(DiagnosticDetail::RuntimeBoundary {
663                boundary: RuntimeBoundaryCode::SqlQueryNoConfiguredEntities,
664            }),
665            28 => Some(DiagnosticDetail::RuntimeBoundary {
666                boundary: RuntimeBoundaryCode::SqlQueryEntityNotConfigured,
667            }),
668            29 => Some(DiagnosticDetail::RuntimeBoundary {
669                boundary: RuntimeBoundaryCode::SqlDdlTargetRequired,
670            }),
671            30 => Some(DiagnosticDetail::RuntimeBoundary {
672                boundary: RuntimeBoundaryCode::SqlDdlEntityNotConfigured,
673            }),
674            31 => Some(DiagnosticDetail::RuntimeBoundary {
675                boundary: RuntimeBoundaryCode::QueryResponseRowsRequired,
676            }),
677            32 => Some(DiagnosticDetail::RuntimeBoundary {
678                boundary: RuntimeBoundaryCode::QueryResponseGroupedRowsRequired,
679            }),
680            33 => Some(DiagnosticDetail::RuntimeBoundary {
681                boundary: RuntimeBoundaryCode::MutationResultEntityRequired,
682            }),
683            34 => Some(DiagnosticDetail::RuntimeBoundary {
684                boundary: RuntimeBoundaryCode::MutationResultEntitiesRequired,
685            }),
686            35 => Some(DiagnosticDetail::RuntimeBoundary {
687                boundary: RuntimeBoundaryCode::MutationResultIdRequired,
688            }),
689            36 => Some(DiagnosticDetail::RuntimeBoundary {
690                boundary: RuntimeBoundaryCode::MutationResultIdsRequired,
691            }),
692            37 => Some(DiagnosticDetail::RuntimeBoundary {
693                boundary: RuntimeBoundaryCode::RowProjectionFieldNotConfigured,
694            }),
695            _ => None,
696        }
697    }
698
699    const fn sql_feature_detail(raw: u16) -> Option<DiagnosticDetail> {
700        let base = Self::SQL_FEATURE_AGGREGATE_FILTER_CLAUSE.raw();
701        if raw < base {
702            return None;
703        }
704
705        let offset = (raw - base) as usize;
706        if offset < Self::SQL_FEATURE_DETAILS.len() {
707            Some(DiagnosticDetail::UnsupportedSqlFeature {
708                feature: Self::SQL_FEATURE_DETAILS[offset],
709            })
710        } else {
711            None
712        }
713    }
714
715    const fn sql_surface_detail(raw: u16) -> Option<DiagnosticDetail> {
716        match raw {
717            103 => Some(DiagnosticDetail::SqlSurfaceMismatch {
718                mismatch: SqlSurfaceMismatchCode::QueryRejectsInsert,
719            }),
720            104 => Some(DiagnosticDetail::SqlSurfaceMismatch {
721                mismatch: SqlSurfaceMismatchCode::QueryRejectsUpdate,
722            }),
723            105 => Some(DiagnosticDetail::SqlSurfaceMismatch {
724                mismatch: SqlSurfaceMismatchCode::QueryRejectsDelete,
725            }),
726            106 => Some(DiagnosticDetail::SqlSurfaceMismatch {
727                mismatch: SqlSurfaceMismatchCode::UpdateRejectsSelect,
728            }),
729            107 => Some(DiagnosticDetail::SqlSurfaceMismatch {
730                mismatch: SqlSurfaceMismatchCode::UpdateRejectsExplain,
731            }),
732            108 => Some(DiagnosticDetail::SqlSurfaceMismatch {
733                mismatch: SqlSurfaceMismatchCode::UpdateRejectsDescribe,
734            }),
735            109 => Some(DiagnosticDetail::SqlSurfaceMismatch {
736                mismatch: SqlSurfaceMismatchCode::UpdateRejectsShowIndexes,
737            }),
738            110 => Some(DiagnosticDetail::SqlSurfaceMismatch {
739                mismatch: SqlSurfaceMismatchCode::UpdateRejectsShowColumns,
740            }),
741            111 => Some(DiagnosticDetail::SqlSurfaceMismatch {
742                mismatch: SqlSurfaceMismatchCode::UpdateRejectsShowEntities,
743            }),
744            112 => Some(DiagnosticDetail::SqlSurfaceMismatch {
745                mismatch: SqlSurfaceMismatchCode::UpdateRejectsShowStores,
746            }),
747            113 => Some(DiagnosticDetail::SqlSurfaceMismatch {
748                mismatch: SqlSurfaceMismatchCode::UpdateRejectsShowMemory,
749            }),
750            _ => None,
751        }
752    }
753
754    const fn schema_ddl_detail(raw: u16) -> Option<DiagnosticDetail> {
755        match raw {
756            114 => Some(DiagnosticDetail::SchemaDdlAdmission {
757                reason: SchemaDdlAdmissionCode::MissingExpectedSchemaVersion,
758            }),
759            115 => Some(DiagnosticDetail::SchemaDdlAdmission {
760                reason: SchemaDdlAdmissionCode::MissingNextSchemaVersion,
761            }),
762            116 => Some(DiagnosticDetail::SchemaDdlAdmission {
763                reason: SchemaDdlAdmissionCode::StaleExpectedSchemaVersion,
764            }),
765            117 => Some(DiagnosticDetail::SchemaDdlAdmission {
766                reason: SchemaDdlAdmissionCode::InvalidExpectedSchemaVersion,
767            }),
768            118 => Some(DiagnosticDetail::SchemaDdlAdmission {
769                reason: SchemaDdlAdmissionCode::InvalidNextSchemaVersion,
770            }),
771            119 => Some(DiagnosticDetail::SchemaDdlAdmission {
772                reason: SchemaDdlAdmissionCode::AcceptedSchemaChangeWithoutVersionBump,
773            }),
774            120 => Some(DiagnosticDetail::SchemaDdlAdmission {
775                reason: SchemaDdlAdmissionCode::EmptyVersionBump,
776            }),
777            121 => Some(DiagnosticDetail::SchemaDdlAdmission {
778                reason: SchemaDdlAdmissionCode::VersionGap,
779            }),
780            122 => Some(DiagnosticDetail::SchemaDdlAdmission {
781                reason: SchemaDdlAdmissionCode::VersionRollback,
782            }),
783            123 => Some(DiagnosticDetail::SchemaDdlAdmission {
784                reason: SchemaDdlAdmissionCode::FingerprintMethodMismatch,
785            }),
786            124 => Some(DiagnosticDetail::SchemaDdlAdmission {
787                reason: SchemaDdlAdmissionCode::UnsupportedTransitionClass,
788            }),
789            125 => Some(DiagnosticDetail::SchemaDdlAdmission {
790                reason: SchemaDdlAdmissionCode::PhysicalRunnerMissing,
791            }),
792            126 => Some(DiagnosticDetail::SchemaDdlAdmission {
793                reason: SchemaDdlAdmissionCode::ValidationFailed,
794            }),
795            127 => Some(DiagnosticDetail::SchemaDdlAdmission {
796                reason: SchemaDdlAdmissionCode::PublicationRaceLost,
797            }),
798            128 => Some(DiagnosticDetail::SchemaDdlAdmission {
799                reason: SchemaDdlAdmissionCode::InvalidAddColumnDefault,
800            }),
801            129 => Some(DiagnosticDetail::SchemaDdlAdmission {
802                reason: SchemaDdlAdmissionCode::InvalidAlterColumnDefault,
803            }),
804            130 => Some(DiagnosticDetail::SchemaDdlAdmission {
805                reason: SchemaDdlAdmissionCode::GeneratedIndexDropRejected,
806            }),
807            131 => Some(DiagnosticDetail::SchemaDdlAdmission {
808                reason: SchemaDdlAdmissionCode::RequiredDropDefaultUnsupported,
809            }),
810            132 => Some(DiagnosticDetail::SchemaDdlAdmission {
811                reason: SchemaDdlAdmissionCode::GeneratedFieldDefaultChangeRejected,
812            }),
813            133 => Some(DiagnosticDetail::SchemaDdlAdmission {
814                reason: SchemaDdlAdmissionCode::GeneratedFieldNullabilityChangeRejected,
815            }),
816            134 => Some(DiagnosticDetail::SchemaDdlAdmission {
817                reason: SchemaDdlAdmissionCode::SetNotNullValidationFailed,
818            }),
819            _ => None,
820        }
821    }
822
823    const fn sql_write_boundary_detail(raw: u16) -> Option<DiagnosticDetail> {
824        match raw {
825            136 => Some(DiagnosticDetail::SqlWriteBoundary {
826                boundary: SqlWriteBoundaryCode::PrimaryKeyLiteralShape,
827            }),
828            137 => Some(DiagnosticDetail::SqlWriteBoundary {
829                boundary: SqlWriteBoundaryCode::PrimaryKeyLiteralIncompatible,
830            }),
831            138 => Some(DiagnosticDetail::SqlWriteBoundary {
832                boundary: SqlWriteBoundaryCode::MissingPrimaryKey,
833            }),
834            139 => Some(DiagnosticDetail::SqlWriteBoundary {
835                boundary: SqlWriteBoundaryCode::MissingRequiredFields,
836            }),
837            140 => Some(DiagnosticDetail::SqlWriteBoundary {
838                boundary: SqlWriteBoundaryCode::ExplicitManagedField,
839            }),
840            141 => Some(DiagnosticDetail::SqlWriteBoundary {
841                boundary: SqlWriteBoundaryCode::ExplicitGeneratedField,
842            }),
843            142 => Some(DiagnosticDetail::SqlWriteBoundary {
844                boundary: SqlWriteBoundaryCode::InsertSelectRequiresScalar,
845            }),
846            143 => Some(DiagnosticDetail::SqlWriteBoundary {
847                boundary: SqlWriteBoundaryCode::InsertSelectAggregateProjection,
848            }),
849            144 => Some(DiagnosticDetail::SqlWriteBoundary {
850                boundary: SqlWriteBoundaryCode::InsertSelectWidthMismatch,
851            }),
852            145 => Some(DiagnosticDetail::SqlWriteBoundary {
853                boundary: SqlWriteBoundaryCode::UpdatePrimaryKeyMutation,
854            }),
855            146 => Some(DiagnosticDetail::SqlWriteBoundary {
856                boundary: SqlWriteBoundaryCode::InvalidFieldLiteral,
857            }),
858            147 => Some(DiagnosticDetail::SqlWriteBoundary {
859                boundary: SqlWriteBoundaryCode::UnknownReturningField,
860            }),
861            148 => Some(DiagnosticDetail::SqlWriteBoundary {
862                boundary: SqlWriteBoundaryCode::DuplicateReturningField,
863            }),
864            149 => Some(DiagnosticDetail::SqlWriteBoundary {
865                boundary: SqlWriteBoundaryCode::UpdateMissingWherePredicate,
866            }),
867            150 => Some(DiagnosticDetail::SqlWriteBoundary {
868                boundary: SqlWriteBoundaryCode::WriteOrderByUnsupportedShape,
869            }),
870            183 => Some(DiagnosticDetail::SqlWriteBoundary {
871                boundary: SqlWriteBoundaryCode::ReturningResponseTooLarge,
872            }),
873            _ => None,
874        }
875    }
876
877    const fn query_projection_detail(raw: u16) -> Option<DiagnosticDetail> {
878        match raw {
879            152 => Some(DiagnosticDetail::QueryProjection {
880                reason: QueryProjectionCode::NumericLiteralRequired,
881            }),
882            153 => Some(DiagnosticDetail::QueryProjection {
883                reason: QueryProjectionCode::NumericScaleArguments,
884            }),
885            154 => Some(DiagnosticDetail::QueryProjection {
886                reason: QueryProjectionCode::NestedFieldPathPreview,
887            }),
888            155 => Some(DiagnosticDetail::QueryProjection {
889                reason: QueryProjectionCode::CaseConditionBooleanRequired,
890            }),
891            156 => Some(DiagnosticDetail::QueryProjection {
892                reason: QueryProjectionCode::NumericInputRequired,
893            }),
894            157 => Some(DiagnosticDetail::QueryProjection {
895                reason: QueryProjectionCode::TextOrBlobInputRequired,
896            }),
897            158 => Some(DiagnosticDetail::QueryProjection {
898                reason: QueryProjectionCode::TextInputRequired,
899            }),
900            159 => Some(DiagnosticDetail::QueryProjection {
901                reason: QueryProjectionCode::TextOrNullArgumentRequired,
902            }),
903            160 => Some(DiagnosticDetail::QueryProjection {
904                reason: QueryProjectionCode::IntegerOrNullArgumentRequired,
905            }),
906            161 => Some(DiagnosticDetail::QueryProjection {
907                reason: QueryProjectionCode::UnaryOperandIncompatible,
908            }),
909            162 => Some(DiagnosticDetail::QueryProjection {
910                reason: QueryProjectionCode::BinaryOperandsIncompatible,
911            }),
912            _ => None,
913        }
914    }
915
916    const fn query_result_shape_detail(raw: u16) -> Option<DiagnosticDetail> {
917        match raw {
918            164 => Some(DiagnosticDetail::QueryResultShape {
919                reason: QueryResultShapeCode::ExpectedRows,
920            }),
921            165 => Some(DiagnosticDetail::QueryResultShape {
922                reason: QueryResultShapeCode::ExpectedGroupedRows,
923            }),
924            _ => None,
925        }
926    }
927
928    const fn sql_lowering_detail(raw: u16) -> Option<DiagnosticDetail> {
929        match raw {
930            166 => Some(DiagnosticDetail::SqlLowering {
931                reason: SqlLoweringCode::EntityMismatch,
932            }),
933            167 => Some(DiagnosticDetail::SqlLowering {
934                reason: SqlLoweringCode::SelectProjectionShape,
935            }),
936            168 => Some(DiagnosticDetail::SqlLowering {
937                reason: SqlLoweringCode::SelectDistinct,
938            }),
939            169 => Some(DiagnosticDetail::SqlLowering {
940                reason: SqlLoweringCode::DistinctOrderByProjection,
941            }),
942            170 => Some(DiagnosticDetail::SqlLowering {
943                reason: SqlLoweringCode::GlobalAggregateProjection,
944            }),
945            171 => Some(DiagnosticDetail::SqlLowering {
946                reason: SqlLoweringCode::GlobalAggregateGroupBy,
947            }),
948            172 => Some(DiagnosticDetail::SqlLowering {
949                reason: SqlLoweringCode::SelectGroupByShape,
950            }),
951            173 => Some(DiagnosticDetail::SqlLowering {
952                reason: SqlLoweringCode::GroupedProjectionExplicitListRequired,
953            }),
954            174 => Some(DiagnosticDetail::SqlLowering {
955                reason: SqlLoweringCode::GroupedProjectionAggregateRequired,
956            }),
957            175 => Some(DiagnosticDetail::SqlLowering {
958                reason: SqlLoweringCode::GroupedProjectionNonGroupField,
959            }),
960            176 => Some(DiagnosticDetail::SqlLowering {
961                reason: SqlLoweringCode::GroupedProjectionScalarAfterAggregate,
962            }),
963            177 => Some(DiagnosticDetail::SqlLowering {
964                reason: SqlLoweringCode::HavingRequiresGroupBy,
965            }),
966            178 => Some(DiagnosticDetail::SqlLowering {
967                reason: SqlLoweringCode::SelectHavingShape,
968            }),
969            179 => Some(DiagnosticDetail::SqlLowering {
970                reason: SqlLoweringCode::AggregateInputExpressions,
971            }),
972            180 => Some(DiagnosticDetail::SqlLowering {
973                reason: SqlLoweringCode::WhereExpressionShape,
974            }),
975            181 => Some(DiagnosticDetail::SqlLowering {
976                reason: SqlLoweringCode::ParameterPlacement,
977            }),
978            182 => Some(DiagnosticDetail::SqlLowering {
979                reason: SqlLoweringCode::SqlDdlExecutionUnsupported,
980            }),
981            _ => None,
982        }
983    }
984}
985
986impl fmt::Debug for ErrorCode {
987    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
988        fmt_compact_code(f, self.raw())
989    }
990}
991
992///
993/// ErrorClass
994///
995/// Broad diagnostic class used for recovery decisions.
996///
997
998#[repr(u16)]
999#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1000pub enum ErrorClass {
1001    Query,
1002    Corruption,
1003    IncompatiblePersistedFormat,
1004    NotFound,
1005    Internal,
1006    Conflict,
1007    Unsupported,
1008    InvariantViolation,
1009}
1010
1011///
1012/// ErrorOrigin
1013///
1014/// Subsystem that owns the diagnostic.
1015///
1016
1017#[repr(u16)]
1018#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1019pub enum ErrorOrigin {
1020    Cursor,
1021    Executor,
1022    Identity,
1023    Index,
1024    Interface,
1025    Planner,
1026    Query,
1027    Recovery,
1028    Response,
1029    Runtime,
1030    Serialize,
1031    Store,
1032}
1033
1034///
1035/// QueryErrorKind
1036///
1037/// Public query error category.
1038///
1039
1040#[repr(u16)]
1041#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1042pub enum QueryErrorKind {
1043    Validate,
1044    Intent,
1045    Plan,
1046    AccessRequirement,
1047    UnorderedPagination,
1048    InvalidContinuationCursor,
1049    NotFound,
1050    NotUnique,
1051}
1052
1053///
1054/// QueryProjectionCode
1055///
1056/// Compact query projection admission/runtime identifier.
1057///
1058
1059#[repr(u16)]
1060#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1061pub enum QueryProjectionCode {
1062    NumericLiteralRequired,
1063    NumericScaleArguments,
1064    NestedFieldPathPreview,
1065    CaseConditionBooleanRequired,
1066    NumericInputRequired,
1067    TextOrBlobInputRequired,
1068    TextInputRequired,
1069    TextOrNullArgumentRequired,
1070    IntegerOrNullArgumentRequired,
1071    UnaryOperandIncompatible,
1072    BinaryOperandsIncompatible,
1073}
1074
1075///
1076/// QueryResultShapeCode
1077///
1078/// Compact query-result shape mismatch identifier.
1079///
1080
1081#[repr(u16)]
1082#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1083pub enum QueryResultShapeCode {
1084    ExpectedRows,
1085    ExpectedGroupedRows,
1086}
1087
1088///
1089/// RuntimeErrorKind
1090///
1091/// Public runtime error category.
1092///
1093
1094#[repr(u16)]
1095#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1096pub enum RuntimeErrorKind {
1097    Corruption,
1098    IncompatiblePersistedFormat,
1099    InvariantViolation,
1100    Conflict,
1101    NotFound,
1102    Unsupported,
1103    Internal,
1104}
1105
1106///
1107/// RuntimeBoundaryCode
1108///
1109/// Compact public-runtime boundary identifier.
1110///
1111
1112#[repr(u16)]
1113#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1114pub enum RuntimeBoundaryCode {
1115    SqlSurfaceControllerRequired,
1116    SchemaSurfaceControllerRequired,
1117    SqlQueryNoConfiguredEntities,
1118    SqlQueryEntityNotConfigured,
1119    SqlDdlTargetRequired,
1120    SqlDdlEntityNotConfigured,
1121    QueryResponseRowsRequired,
1122    QueryResponseGroupedRowsRequired,
1123    MutationResultEntityRequired,
1124    MutationResultEntitiesRequired,
1125    MutationResultIdRequired,
1126    MutationResultIdsRequired,
1127    RowProjectionFieldNotConfigured,
1128}
1129
1130///
1131/// SqlFeatureCode
1132///
1133/// Compact SQL feature identifier used by unsupported-feature diagnostics.
1134///
1135
1136#[repr(u16)]
1137#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1138pub enum SqlFeatureCode {
1139    AggregateFilterClause,
1140    AlterStatementBeyondAlterTable,
1141    AlterTableAddColumnDuplicateDefault,
1142    AlterTableAddColumnModifiers,
1143    AlterTableAddStatementBeyondAddColumn,
1144    AlterTableAlterColumnDropUnsupportedAction,
1145    AlterTableAlterColumnModifiers,
1146    AlterTableAlterColumnSetUnsupportedAction,
1147    AlterTableAlterColumnUnsupportedAction,
1148    AlterTableAlterStatementBeyondAlterColumn,
1149    AlterTableDropColumnIfExistsSyntax,
1150    AlterTableDropColumnModifiers,
1151    AlterTableDropStatementBeyondDropColumn,
1152    AlterTableRenameColumnMissingTo,
1153    AlterTableRenameColumnModifiers,
1154    AlterTableRenameStatementBeyondRenameColumn,
1155    AlterTableUnsupportedOperation,
1156    ColumnAlias,
1157    CreateIndexIfNotExistsSyntax,
1158    CreateIndexKeyOrderingModifiers,
1159    CreateIndexModifiers,
1160    CreateStatementBeyondCreateIndex,
1161    DescribeModifier,
1162    DdlSchemaVersionDuplicateExpectedClause,
1163    DdlSchemaVersionDuplicateSetClause,
1164    DropIndexModifiers,
1165    DropIndexIfExistsSyntax,
1166    DropStatementBeyondDropIndex,
1167    ExpressionIndexUnsupportedFunction,
1168    Having,
1169    Insert,
1170    Join,
1171    LikePatternBeyondTrailingPrefix,
1172    LowerFieldPredicateUnsupported,
1173    MultiStatementSql,
1174    NestedAggregateInput,
1175    NestedProjectionFunctionInArithmetic,
1176    OrderByUnsupportedForm,
1177    Other,
1178    ParameterBinding,
1179    ParameterizedSchemaVersion,
1180    PredicateStartsWithFirstArgument,
1181    QuotedIdentifiers,
1182    ReturningUnsupportedShape,
1183    ScalarFunctionExpressionPosition,
1184    ScaleTakingNumericFunctionExpressionPosition,
1185    SearchedCaseGroupedOrderBy,
1186    ShowColumnsModifiers,
1187    ShowEntitiesModifiers,
1188    ShowIndexesModifiers,
1189    ShowMemoryModifiers,
1190    ShowStoresModifiers,
1191    ShowUnsupportedCommand,
1192    SimpleCaseExpression,
1193    StandaloneLiteralProjectionItem,
1194    SupportedGroupedOrderByExpressionFamily,
1195    SupportedOrderByExpressionFamily,
1196    UnionIntersectExcept,
1197    UnsupportedFunctionNamespace,
1198    Update,
1199    UpperFieldPredicateUnsupported,
1200    WindowFunction,
1201    With,
1202    NumericScaleFunctionArguments,
1203    OrderByFieldNotOrderable,
1204}
1205
1206///
1207/// SqlLoweringCode
1208///
1209/// Compact SQL lowering rejection identifier used after parsing succeeds but
1210/// before a statement becomes canonical query intent.
1211///
1212
1213#[repr(u16)]
1214#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1215pub enum SqlLoweringCode {
1216    EntityMismatch,
1217    SelectProjectionShape,
1218    SelectDistinct,
1219    DistinctOrderByProjection,
1220    GlobalAggregateProjection,
1221    GlobalAggregateGroupBy,
1222    SelectGroupByShape,
1223    GroupedProjectionExplicitListRequired,
1224    GroupedProjectionAggregateRequired,
1225    GroupedProjectionNonGroupField,
1226    GroupedProjectionScalarAfterAggregate,
1227    HavingRequiresGroupBy,
1228    SelectHavingShape,
1229    AggregateInputExpressions,
1230    WhereExpressionShape,
1231    ParameterPlacement,
1232    SqlDdlExecutionUnsupported,
1233}
1234
1235///
1236/// SqlSurfaceMismatchCode
1237///
1238/// Compact SQL endpoint surface mismatch identifier.
1239///
1240
1241#[repr(u16)]
1242#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1243pub enum SqlSurfaceMismatchCode {
1244    QueryRejectsInsert,
1245    QueryRejectsUpdate,
1246    QueryRejectsDelete,
1247    UpdateRejectsSelect,
1248    UpdateRejectsExplain,
1249    UpdateRejectsDescribe,
1250    UpdateRejectsShowIndexes,
1251    UpdateRejectsShowColumns,
1252    UpdateRejectsShowEntities,
1253    UpdateRejectsShowStores,
1254    UpdateRejectsShowMemory,
1255}
1256
1257///
1258/// SqlWriteBoundaryCode
1259///
1260/// Compact SQL write fail-closed boundary identifier.
1261///
1262
1263#[repr(u16)]
1264#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1265pub enum SqlWriteBoundaryCode {
1266    PrimaryKeyLiteralShape,
1267    PrimaryKeyLiteralIncompatible,
1268    MissingPrimaryKey,
1269    MissingRequiredFields,
1270    ExplicitManagedField,
1271    ExplicitGeneratedField,
1272    InsertSelectRequiresScalar,
1273    InsertSelectAggregateProjection,
1274    InsertSelectWidthMismatch,
1275    UpdatePrimaryKeyMutation,
1276    InvalidFieldLiteral,
1277    UnknownReturningField,
1278    DuplicateReturningField,
1279    UpdateMissingWherePredicate,
1280    WriteOrderByUnsupportedShape,
1281    ReturningResponseTooLarge,
1282}
1283
1284///
1285/// SchemaDdlAdmissionCode
1286///
1287/// Compact SQL DDL admission rejection reason.
1288///
1289
1290#[repr(u16)]
1291#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1292pub enum SchemaDdlAdmissionCode {
1293    MissingExpectedSchemaVersion,
1294    MissingNextSchemaVersion,
1295    StaleExpectedSchemaVersion,
1296    InvalidExpectedSchemaVersion,
1297    InvalidNextSchemaVersion,
1298    AcceptedSchemaChangeWithoutVersionBump,
1299    EmptyVersionBump,
1300    VersionGap,
1301    VersionRollback,
1302    FingerprintMethodMismatch,
1303    UnsupportedTransitionClass,
1304    PhysicalRunnerMissing,
1305    ValidationFailed,
1306    PublicationRaceLost,
1307    InvalidAddColumnDefault,
1308    InvalidAlterColumnDefault,
1309    GeneratedIndexDropRejected,
1310    RequiredDropDefaultUnsupported,
1311    GeneratedFieldDefaultChangeRejected,
1312    GeneratedFieldNullabilityChangeRejected,
1313    SetNotNullValidationFailed,
1314}
1315
1316///
1317/// DiagnosticDetail
1318///
1319/// Small structured diagnostic payload for callers and CLI rendering.
1320///
1321
1322#[derive(Clone, Copy, Eq, PartialEq)]
1323pub enum DiagnosticDetail {
1324    QueryKind { kind: QueryErrorKind },
1325    RuntimeKind { kind: RuntimeErrorKind },
1326    RuntimeBoundary { boundary: RuntimeBoundaryCode },
1327    SchemaDdlAdmission { reason: SchemaDdlAdmissionCode },
1328    UnsupportedSqlFeature { feature: SqlFeatureCode },
1329    SqlSurfaceMismatch { mismatch: SqlSurfaceMismatchCode },
1330    SqlWriteBoundary { boundary: SqlWriteBoundaryCode },
1331    QueryProjection { reason: QueryProjectionCode },
1332    QueryResultShape { reason: QueryResultShapeCode },
1333    SqlLowering { reason: SqlLoweringCode },
1334}
1335
1336///
1337/// Diagnostic
1338///
1339/// Compact public diagnostic payload.
1340///
1341
1342#[derive(Clone, Eq, PartialEq)]
1343pub struct Diagnostic {
1344    code: DiagnosticCode,
1345    origin: ErrorOrigin,
1346    detail: Option<DiagnosticDetail>,
1347}
1348
1349impl Diagnostic {
1350    /// Build a compact diagnostic from a code and optional structured detail.
1351    #[must_use]
1352    pub const fn new(
1353        code: DiagnosticCode,
1354        origin: ErrorOrigin,
1355        detail: Option<DiagnosticDetail>,
1356    ) -> Self {
1357        Self {
1358            code,
1359            origin,
1360            detail,
1361        }
1362    }
1363
1364    /// Build a compact diagnostic using the code's default origin.
1365    #[must_use]
1366    pub const fn from_code(code: DiagnosticCode) -> Self {
1367        Self::new(code, code.origin(), None)
1368    }
1369
1370    /// Return the stable diagnostic code.
1371    #[must_use]
1372    pub const fn code(&self) -> DiagnosticCode {
1373        self.code
1374    }
1375
1376    /// Return the diagnostic class.
1377    #[must_use]
1378    pub const fn class(&self) -> ErrorClass {
1379        self.code.class()
1380    }
1381
1382    /// Return the subsystem origin.
1383    #[must_use]
1384    pub const fn origin(&self) -> ErrorOrigin {
1385        self.origin
1386    }
1387
1388    /// Return structured diagnostic detail, when available.
1389    #[must_use]
1390    pub const fn detail(&self) -> Option<&DiagnosticDetail> {
1391        self.detail.as_ref()
1392    }
1393
1394    /// Return the numeric public wire code for this diagnostic.
1395    #[must_use]
1396    pub const fn error_code(&self) -> ErrorCode {
1397        ErrorCode::from_parts(self.code, self.detail)
1398    }
1399}
1400
1401impl fmt::Debug for DiagnosticCode {
1402    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1403        fmt_compact_code(f, self.error_code().raw())
1404    }
1405}
1406
1407impl fmt::Debug for ErrorClass {
1408    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1409        fmt_compact_code(f, *self as u16)
1410    }
1411}
1412
1413impl fmt::Debug for ErrorOrigin {
1414    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1415        fmt_compact_code(f, *self as u16)
1416    }
1417}
1418
1419impl fmt::Debug for QueryErrorKind {
1420    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1421        fmt_compact_code(f, *self as u16)
1422    }
1423}
1424
1425impl fmt::Debug for QueryProjectionCode {
1426    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1427        fmt_compact_code(f, *self as u16)
1428    }
1429}
1430
1431impl fmt::Debug for QueryResultShapeCode {
1432    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1433        fmt_compact_code(f, *self as u16)
1434    }
1435}
1436
1437impl fmt::Debug for RuntimeErrorKind {
1438    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1439        fmt_compact_code(f, *self as u16)
1440    }
1441}
1442
1443impl fmt::Debug for RuntimeBoundaryCode {
1444    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1445        fmt_compact_code(f, *self as u16)
1446    }
1447}
1448
1449impl fmt::Debug for SqlFeatureCode {
1450    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1451        fmt_compact_code(f, *self as u16)
1452    }
1453}
1454
1455impl fmt::Debug for SqlLoweringCode {
1456    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1457        fmt_compact_code(f, *self as u16)
1458    }
1459}
1460
1461impl fmt::Debug for SqlSurfaceMismatchCode {
1462    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1463        fmt_compact_code(f, *self as u16)
1464    }
1465}
1466
1467impl fmt::Debug for SqlWriteBoundaryCode {
1468    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1469        fmt_compact_code(f, *self as u16)
1470    }
1471}
1472
1473impl fmt::Debug for SchemaDdlAdmissionCode {
1474    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1475        fmt_compact_code(f, *self as u16)
1476    }
1477}
1478
1479impl fmt::Debug for DiagnosticDetail {
1480    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1481        fmt_compact_code(
1482            f,
1483            ErrorCode::from_parts(DiagnosticCode::RuntimeInternal, Some(*self)).raw(),
1484        )
1485    }
1486}
1487
1488impl fmt::Debug for Diagnostic {
1489    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1490        write!(f, "{}@{}", self.error_code().raw(), self.origin as u16)
1491    }
1492}
1493
1494fn fmt_compact_code(f: &mut fmt::Formatter<'_>, raw: u16) -> fmt::Result {
1495    write!(f, "{raw}")
1496}
1497
1498#[cfg(test)]
1499mod tests {
1500    use super::{
1501        Diagnostic, DiagnosticCode, DiagnosticDetail, ErrorClass, ErrorCode, ErrorOrigin,
1502        QueryProjectionCode, SqlFeatureCode, SqlLoweringCode, SqlWriteBoundaryCode,
1503    };
1504
1505    const ORDERED_ERROR_CODES: [ErrorCode; 183] = [
1506        ErrorCode::QUERY_VALIDATE,
1507        ErrorCode::QUERY_INTENT,
1508        ErrorCode::QUERY_PLAN,
1509        ErrorCode::QUERY_ACCESS_REQUIREMENT,
1510        ErrorCode::QUERY_UNORDERED_PAGINATION,
1511        ErrorCode::QUERY_INVALID_CONTINUATION_CURSOR,
1512        ErrorCode::QUERY_NOT_FOUND,
1513        ErrorCode::QUERY_NOT_UNIQUE,
1514        ErrorCode::QUERY_NUMERIC_OVERFLOW,
1515        ErrorCode::QUERY_NUMERIC_NOT_REPRESENTABLE,
1516        ErrorCode::QUERY_UNKNOWN_AGGREGATE_TARGET_FIELD,
1517        ErrorCode::QUERY_UNSUPPORTED_SQL_FEATURE,
1518        ErrorCode::QUERY_SQL_SURFACE_MISMATCH,
1519        ErrorCode::SCHEMA_DDL_ADMISSION,
1520        ErrorCode::STORE_NOT_FOUND,
1521        ErrorCode::STORE_CORRUPTION,
1522        ErrorCode::STORE_INVARIANT_VIOLATION,
1523        ErrorCode::RUNTIME_CORRUPTION,
1524        ErrorCode::RUNTIME_INCOMPATIBLE_PERSISTED_FORMAT,
1525        ErrorCode::RUNTIME_INVARIANT_VIOLATION,
1526        ErrorCode::RUNTIME_CONFLICT,
1527        ErrorCode::RUNTIME_NOT_FOUND,
1528        ErrorCode::RUNTIME_UNSUPPORTED,
1529        ErrorCode::RUNTIME_INTERNAL,
1530        ErrorCode::RUNTIME_BOUNDARY_SQL_SURFACE_CONTROLLER_REQUIRED,
1531        ErrorCode::RUNTIME_BOUNDARY_SCHEMA_SURFACE_CONTROLLER_REQUIRED,
1532        ErrorCode::RUNTIME_BOUNDARY_SQL_QUERY_NO_CONFIGURED_ENTITIES,
1533        ErrorCode::RUNTIME_BOUNDARY_SQL_QUERY_ENTITY_NOT_CONFIGURED,
1534        ErrorCode::RUNTIME_BOUNDARY_SQL_DDL_TARGET_REQUIRED,
1535        ErrorCode::RUNTIME_BOUNDARY_SQL_DDL_ENTITY_NOT_CONFIGURED,
1536        ErrorCode::RUNTIME_BOUNDARY_QUERY_RESPONSE_ROWS_REQUIRED,
1537        ErrorCode::RUNTIME_BOUNDARY_QUERY_RESPONSE_GROUPED_ROWS_REQUIRED,
1538        ErrorCode::RUNTIME_BOUNDARY_MUTATION_RESULT_ENTITY_REQUIRED,
1539        ErrorCode::RUNTIME_BOUNDARY_MUTATION_RESULT_ENTITIES_REQUIRED,
1540        ErrorCode::RUNTIME_BOUNDARY_MUTATION_RESULT_ID_REQUIRED,
1541        ErrorCode::RUNTIME_BOUNDARY_MUTATION_RESULT_IDS_REQUIRED,
1542        ErrorCode::RUNTIME_BOUNDARY_ROW_PROJECTION_FIELD_NOT_CONFIGURED,
1543        ErrorCode::SQL_FEATURE_AGGREGATE_FILTER_CLAUSE,
1544        ErrorCode::SQL_FEATURE_ALTER_STATEMENT_BEYOND_ALTER_TABLE,
1545        ErrorCode::SQL_FEATURE_ALTER_TABLE_ADD_COLUMN_DUPLICATE_DEFAULT,
1546        ErrorCode::SQL_FEATURE_ALTER_TABLE_ADD_COLUMN_MODIFIERS,
1547        ErrorCode::SQL_FEATURE_ALTER_TABLE_ADD_STATEMENT_BEYOND_ADD_COLUMN,
1548        ErrorCode::SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_DROP_UNSUPPORTED_ACTION,
1549        ErrorCode::SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_MODIFIERS,
1550        ErrorCode::SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_SET_UNSUPPORTED_ACTION,
1551        ErrorCode::SQL_FEATURE_ALTER_TABLE_ALTER_COLUMN_UNSUPPORTED_ACTION,
1552        ErrorCode::SQL_FEATURE_ALTER_TABLE_ALTER_STATEMENT_BEYOND_ALTER_COLUMN,
1553        ErrorCode::SQL_FEATURE_ALTER_TABLE_DROP_COLUMN_IF_EXISTS_SYNTAX,
1554        ErrorCode::SQL_FEATURE_ALTER_TABLE_DROP_COLUMN_MODIFIERS,
1555        ErrorCode::SQL_FEATURE_ALTER_TABLE_DROP_STATEMENT_BEYOND_DROP_COLUMN,
1556        ErrorCode::SQL_FEATURE_ALTER_TABLE_RENAME_COLUMN_MISSING_TO,
1557        ErrorCode::SQL_FEATURE_ALTER_TABLE_RENAME_COLUMN_MODIFIERS,
1558        ErrorCode::SQL_FEATURE_ALTER_TABLE_RENAME_STATEMENT_BEYOND_RENAME_COLUMN,
1559        ErrorCode::SQL_FEATURE_ALTER_TABLE_UNSUPPORTED_OPERATION,
1560        ErrorCode::SQL_FEATURE_COLUMN_ALIAS,
1561        ErrorCode::SQL_FEATURE_CREATE_INDEX_IF_NOT_EXISTS_SYNTAX,
1562        ErrorCode::SQL_FEATURE_CREATE_INDEX_KEY_ORDERING_MODIFIERS,
1563        ErrorCode::SQL_FEATURE_CREATE_INDEX_MODIFIERS,
1564        ErrorCode::SQL_FEATURE_CREATE_STATEMENT_BEYOND_CREATE_INDEX,
1565        ErrorCode::SQL_FEATURE_DESCRIBE_MODIFIER,
1566        ErrorCode::SQL_FEATURE_DDL_SCHEMA_VERSION_DUPLICATE_EXPECTED_CLAUSE,
1567        ErrorCode::SQL_FEATURE_DDL_SCHEMA_VERSION_DUPLICATE_SET_CLAUSE,
1568        ErrorCode::SQL_FEATURE_DROP_INDEX_MODIFIERS,
1569        ErrorCode::SQL_FEATURE_DROP_INDEX_IF_EXISTS_SYNTAX,
1570        ErrorCode::SQL_FEATURE_DROP_STATEMENT_BEYOND_DROP_INDEX,
1571        ErrorCode::SQL_FEATURE_EXPRESSION_INDEX_UNSUPPORTED_FUNCTION,
1572        ErrorCode::SQL_FEATURE_HAVING,
1573        ErrorCode::SQL_FEATURE_INSERT,
1574        ErrorCode::SQL_FEATURE_JOIN,
1575        ErrorCode::SQL_FEATURE_LIKE_PATTERN_BEYOND_TRAILING_PREFIX,
1576        ErrorCode::SQL_FEATURE_LOWER_FIELD_PREDICATE_UNSUPPORTED,
1577        ErrorCode::SQL_FEATURE_MULTI_STATEMENT_SQL,
1578        ErrorCode::SQL_FEATURE_NESTED_AGGREGATE_INPUT,
1579        ErrorCode::SQL_FEATURE_NESTED_PROJECTION_FUNCTION_IN_ARITHMETIC,
1580        ErrorCode::SQL_FEATURE_ORDER_BY_UNSUPPORTED_FORM,
1581        ErrorCode::SQL_FEATURE_OTHER,
1582        ErrorCode::SQL_FEATURE_PARAMETER_BINDING,
1583        ErrorCode::SQL_FEATURE_PARAMETERIZED_SCHEMA_VERSION,
1584        ErrorCode::SQL_FEATURE_PREDICATE_STARTS_WITH_FIRST_ARGUMENT,
1585        ErrorCode::SQL_FEATURE_QUOTED_IDENTIFIERS,
1586        ErrorCode::SQL_FEATURE_RETURNING_UNSUPPORTED_SHAPE,
1587        ErrorCode::SQL_FEATURE_SCALAR_FUNCTION_EXPRESSION_POSITION,
1588        ErrorCode::SQL_FEATURE_SCALE_TAKING_NUMERIC_FUNCTION_EXPRESSION_POSITION,
1589        ErrorCode::SQL_FEATURE_SEARCHED_CASE_GROUPED_ORDER_BY,
1590        ErrorCode::SQL_FEATURE_SHOW_COLUMNS_MODIFIERS,
1591        ErrorCode::SQL_FEATURE_SHOW_ENTITIES_MODIFIERS,
1592        ErrorCode::SQL_FEATURE_SHOW_INDEXES_MODIFIERS,
1593        ErrorCode::SQL_FEATURE_SHOW_MEMORY_MODIFIERS,
1594        ErrorCode::SQL_FEATURE_SHOW_STORES_MODIFIERS,
1595        ErrorCode::SQL_FEATURE_SHOW_UNSUPPORTED_COMMAND,
1596        ErrorCode::SQL_FEATURE_SIMPLE_CASE_EXPRESSION,
1597        ErrorCode::SQL_FEATURE_STANDALONE_LITERAL_PROJECTION_ITEM,
1598        ErrorCode::SQL_FEATURE_SUPPORTED_GROUPED_ORDER_BY_EXPRESSION_FAMILY,
1599        ErrorCode::SQL_FEATURE_SUPPORTED_ORDER_BY_EXPRESSION_FAMILY,
1600        ErrorCode::SQL_FEATURE_UNION_INTERSECT_EXCEPT,
1601        ErrorCode::SQL_FEATURE_UNSUPPORTED_FUNCTION_NAMESPACE,
1602        ErrorCode::SQL_FEATURE_UPDATE,
1603        ErrorCode::SQL_FEATURE_UPPER_FIELD_PREDICATE_UNSUPPORTED,
1604        ErrorCode::SQL_FEATURE_WINDOW_FUNCTION,
1605        ErrorCode::SQL_FEATURE_WITH,
1606        ErrorCode::SQL_FEATURE_NUMERIC_SCALE_FUNCTION_ARGUMENTS,
1607        ErrorCode::SQL_FEATURE_ORDER_BY_FIELD_NOT_ORDERABLE,
1608        ErrorCode::SQL_SURFACE_QUERY_REJECTS_INSERT,
1609        ErrorCode::SQL_SURFACE_QUERY_REJECTS_UPDATE,
1610        ErrorCode::SQL_SURFACE_QUERY_REJECTS_DELETE,
1611        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SELECT,
1612        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_EXPLAIN,
1613        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_DESCRIBE,
1614        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SHOW_INDEXES,
1615        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SHOW_COLUMNS,
1616        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SHOW_ENTITIES,
1617        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SHOW_STORES,
1618        ErrorCode::SQL_SURFACE_UPDATE_REJECTS_SHOW_MEMORY,
1619        ErrorCode::SCHEMA_DDL_MISSING_EXPECTED_SCHEMA_VERSION,
1620        ErrorCode::SCHEMA_DDL_MISSING_NEXT_SCHEMA_VERSION,
1621        ErrorCode::SCHEMA_DDL_STALE_EXPECTED_SCHEMA_VERSION,
1622        ErrorCode::SCHEMA_DDL_INVALID_EXPECTED_SCHEMA_VERSION,
1623        ErrorCode::SCHEMA_DDL_INVALID_NEXT_SCHEMA_VERSION,
1624        ErrorCode::SCHEMA_DDL_ACCEPTED_SCHEMA_CHANGE_WITHOUT_VERSION_BUMP,
1625        ErrorCode::SCHEMA_DDL_EMPTY_VERSION_BUMP,
1626        ErrorCode::SCHEMA_DDL_VERSION_GAP,
1627        ErrorCode::SCHEMA_DDL_VERSION_ROLLBACK,
1628        ErrorCode::SCHEMA_DDL_FINGERPRINT_METHOD_MISMATCH,
1629        ErrorCode::SCHEMA_DDL_UNSUPPORTED_TRANSITION_CLASS,
1630        ErrorCode::SCHEMA_DDL_PHYSICAL_RUNNER_MISSING,
1631        ErrorCode::SCHEMA_DDL_VALIDATION_FAILED,
1632        ErrorCode::SCHEMA_DDL_PUBLICATION_RACE_LOST,
1633        ErrorCode::SCHEMA_DDL_INVALID_ADD_COLUMN_DEFAULT,
1634        ErrorCode::SCHEMA_DDL_INVALID_ALTER_COLUMN_DEFAULT,
1635        ErrorCode::SCHEMA_DDL_GENERATED_INDEX_DROP_REJECTED,
1636        ErrorCode::SCHEMA_DDL_REQUIRED_DROP_DEFAULT_UNSUPPORTED,
1637        ErrorCode::SCHEMA_DDL_GENERATED_FIELD_DEFAULT_CHANGE_REJECTED,
1638        ErrorCode::SCHEMA_DDL_GENERATED_FIELD_NULLABILITY_CHANGE_REJECTED,
1639        ErrorCode::SCHEMA_DDL_SET_NOT_NULL_VALIDATION_FAILED,
1640        ErrorCode::QUERY_SQL_WRITE_BOUNDARY,
1641        ErrorCode::SQL_WRITE_PRIMARY_KEY_LITERAL_SHAPE,
1642        ErrorCode::SQL_WRITE_PRIMARY_KEY_LITERAL_INCOMPATIBLE,
1643        ErrorCode::SQL_WRITE_MISSING_PRIMARY_KEY,
1644        ErrorCode::SQL_WRITE_MISSING_REQUIRED_FIELDS,
1645        ErrorCode::SQL_WRITE_EXPLICIT_MANAGED_FIELD,
1646        ErrorCode::SQL_WRITE_EXPLICIT_GENERATED_FIELD,
1647        ErrorCode::SQL_WRITE_INSERT_SELECT_REQUIRES_SCALAR,
1648        ErrorCode::SQL_WRITE_INSERT_SELECT_AGGREGATE_PROJECTION,
1649        ErrorCode::SQL_WRITE_INSERT_SELECT_WIDTH_MISMATCH,
1650        ErrorCode::SQL_WRITE_UPDATE_PRIMARY_KEY_MUTATION,
1651        ErrorCode::SQL_WRITE_INVALID_FIELD_LITERAL,
1652        ErrorCode::SQL_WRITE_UNKNOWN_RETURNING_FIELD,
1653        ErrorCode::SQL_WRITE_DUPLICATE_RETURNING_FIELD,
1654        ErrorCode::SQL_WRITE_UPDATE_MISSING_WHERE_PREDICATE,
1655        ErrorCode::SQL_WRITE_ORDER_BY_UNSUPPORTED_SHAPE,
1656        ErrorCode::QUERY_UNSUPPORTED_PROJECTION,
1657        ErrorCode::QUERY_PROJECTION_NUMERIC_LITERAL_REQUIRED,
1658        ErrorCode::QUERY_PROJECTION_NUMERIC_SCALE_ARGUMENTS,
1659        ErrorCode::QUERY_PROJECTION_NESTED_FIELD_PATH_PREVIEW,
1660        ErrorCode::QUERY_PROJECTION_CASE_CONDITION_BOOLEAN_REQUIRED,
1661        ErrorCode::QUERY_PROJECTION_NUMERIC_INPUT_REQUIRED,
1662        ErrorCode::QUERY_PROJECTION_TEXT_OR_BLOB_INPUT_REQUIRED,
1663        ErrorCode::QUERY_PROJECTION_TEXT_INPUT_REQUIRED,
1664        ErrorCode::QUERY_PROJECTION_TEXT_OR_NULL_ARGUMENT_REQUIRED,
1665        ErrorCode::QUERY_PROJECTION_INTEGER_OR_NULL_ARGUMENT_REQUIRED,
1666        ErrorCode::QUERY_PROJECTION_UNARY_OPERAND_INCOMPATIBLE,
1667        ErrorCode::QUERY_PROJECTION_BINARY_OPERANDS_INCOMPATIBLE,
1668        ErrorCode::QUERY_RESULT_SHAPE_MISMATCH,
1669        ErrorCode::QUERY_RESULT_EXPECTED_ROWS,
1670        ErrorCode::QUERY_RESULT_EXPECTED_GROUPED,
1671        ErrorCode::SQL_LOWERING_ENTITY_MISMATCH,
1672        ErrorCode::SQL_LOWERING_SELECT_PROJECTION_SHAPE,
1673        ErrorCode::SQL_LOWERING_SELECT_DISTINCT,
1674        ErrorCode::SQL_LOWERING_DISTINCT_ORDER_BY_PROJECTION,
1675        ErrorCode::SQL_LOWERING_GLOBAL_AGGREGATE_PROJECTION,
1676        ErrorCode::SQL_LOWERING_GLOBAL_AGGREGATE_GROUP_BY,
1677        ErrorCode::SQL_LOWERING_SELECT_GROUP_BY_SHAPE,
1678        ErrorCode::SQL_LOWERING_GROUPED_PROJECTION_EXPLICIT_LIST_REQUIRED,
1679        ErrorCode::SQL_LOWERING_GROUPED_PROJECTION_AGGREGATE_REQUIRED,
1680        ErrorCode::SQL_LOWERING_GROUPED_PROJECTION_NON_GROUP_FIELD,
1681        ErrorCode::SQL_LOWERING_GROUPED_PROJECTION_SCALAR_AFTER_AGGREGATE,
1682        ErrorCode::SQL_LOWERING_HAVING_REQUIRES_GROUP_BY,
1683        ErrorCode::SQL_LOWERING_SELECT_HAVING_SHAPE,
1684        ErrorCode::SQL_LOWERING_AGGREGATE_INPUT_EXPRESSIONS,
1685        ErrorCode::SQL_LOWERING_WHERE_EXPRESSION_SHAPE,
1686        ErrorCode::SQL_LOWERING_PARAMETER_PLACEMENT,
1687        ErrorCode::SQL_LOWERING_SQL_DDL_EXECUTION_UNSUPPORTED,
1688        ErrorCode::SQL_WRITE_RETURNING_RESPONSE_TOO_LARGE,
1689    ];
1690
1691    #[test]
1692    fn diagnostic_from_code_uses_default_origin() {
1693        let diagnostic = Diagnostic::from_code(DiagnosticCode::QueryPlan);
1694
1695        assert_eq!(diagnostic.code(), DiagnosticCode::QueryPlan);
1696        assert_eq!(diagnostic.origin(), ErrorOrigin::Query);
1697    }
1698
1699    #[test]
1700    fn diagnostic_code_reports_broad_class() {
1701        assert_eq!(
1702            DiagnosticCode::QueryUnsupportedSqlFeature.class(),
1703            ErrorClass::Unsupported
1704        );
1705        assert_eq!(
1706            DiagnosticCode::QuerySqlSurfaceMismatch.class(),
1707            ErrorClass::Unsupported
1708        );
1709        assert_eq!(DiagnosticCode::QueryPlan.class(), ErrorClass::Query);
1710        assert_eq!(
1711            DiagnosticCode::StoreCorruption.class(),
1712            ErrorClass::Corruption
1713        );
1714    }
1715
1716    #[test]
1717    fn public_error_codes_are_sequential() {
1718        for (index, code) in ORDERED_ERROR_CODES.iter().enumerate() {
1719            let expected = u16::try_from(index + 1).expect("test error-code index fits u16");
1720            assert_eq!(code.raw(), expected);
1721        }
1722    }
1723
1724    #[test]
1725    fn public_error_codes_reconstruct_shifted_details() {
1726        assert_eq!(
1727            ErrorCode::QUERY_UNKNOWN_AGGREGATE_TARGET_FIELD.diagnostic_code(),
1728            DiagnosticCode::QueryUnknownAggregateTargetField
1729        );
1730        assert_eq!(
1731            ErrorCode::SQL_FEATURE_JOIN.diagnostic_detail(),
1732            Some(DiagnosticDetail::UnsupportedSqlFeature {
1733                feature: SqlFeatureCode::Join,
1734            })
1735        );
1736        assert_eq!(
1737            ErrorCode::QUERY_PROJECTION_NUMERIC_LITERAL_REQUIRED.diagnostic_detail(),
1738            Some(DiagnosticDetail::QueryProjection {
1739                reason: QueryProjectionCode::NumericLiteralRequired,
1740            })
1741        );
1742        assert_eq!(
1743            ErrorCode::SQL_LOWERING_DISTINCT_ORDER_BY_PROJECTION.diagnostic_detail(),
1744            Some(DiagnosticDetail::SqlLowering {
1745                reason: SqlLoweringCode::DistinctOrderByProjection,
1746            })
1747        );
1748        assert_eq!(
1749            ErrorCode::SQL_WRITE_RETURNING_RESPONSE_TOO_LARGE.diagnostic_detail(),
1750            Some(DiagnosticDetail::SqlWriteBoundary {
1751                boundary: SqlWriteBoundaryCode::ReturningResponseTooLarge,
1752            })
1753        );
1754    }
1755}