1use std::fmt;
10
11#[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 #[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 #[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 #[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#[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 #[must_use]
429 pub const fn from_raw(raw: u16) -> Self {
430 Self(raw)
431 }
432
433 #[must_use]
435 pub const fn raw(self) -> u16 {
436 self.0
437 }
438
439 #[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 #[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 #[must_use]
505 pub const fn class(self) -> ErrorClass {
506 self.diagnostic_code().class()
507 }
508
509 #[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 #[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#[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#[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#[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#[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#[repr(u16)]
1082#[derive(Clone, Copy, Eq, Hash, PartialEq)]
1083pub enum QueryResultShapeCode {
1084 ExpectedRows,
1085 ExpectedGroupedRows,
1086}
1087
1088#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Clone, Eq, PartialEq)]
1343pub struct Diagnostic {
1344 code: DiagnosticCode,
1345 origin: ErrorOrigin,
1346 detail: Option<DiagnosticDetail>,
1347}
1348
1349impl Diagnostic {
1350 #[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 #[must_use]
1366 pub const fn from_code(code: DiagnosticCode) -> Self {
1367 Self::new(code, code.origin(), None)
1368 }
1369
1370 #[must_use]
1372 pub const fn code(&self) -> DiagnosticCode {
1373 self.code
1374 }
1375
1376 #[must_use]
1378 pub const fn class(&self) -> ErrorClass {
1379 self.code.class()
1380 }
1381
1382 #[must_use]
1384 pub const fn origin(&self) -> ErrorOrigin {
1385 self.origin
1386 }
1387
1388 #[must_use]
1390 pub const fn detail(&self) -> Option<&DiagnosticDetail> {
1391 self.detail.as_ref()
1392 }
1393
1394 #[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}