Maps an [`EvalError`] to the appropriate SQLSTATE. Historically every `EvalError` fell through to `INTERNAL_ERROR` (`XX000`), but the overwhelming majority are user-facing data exceptions (class 22) or other well-defined conditions, not internal errors. This match is deliberately exhaustive — with no wildcard — so that adding a new `EvalError` variant is a compile error until it is assigned a cod
(err: &EvalError)
| 334 | /// never silently regress to `XX000`. Codes are chosen to match PostgreSQL |
| 335 | /// where an equivalent error exists. |
| 336 | fn eval_error_code(err: &EvalError) -> SqlState { |
| 337 | match err { |
| 338 | // Division and mathematical domain errors. |
| 339 | EvalError::DivisionByZero => SqlState::DIVISION_BY_ZERO, |
| 340 | EvalError::NegSqrt | EvalError::ComplexOutOfRange(_) => { |
| 341 | SqlState::INVALID_ARGUMENT_FOR_POWER_FUNCTION |
| 342 | } |
| 343 | EvalError::InfinityOutOfDomain(_) |
| 344 | | EvalError::NegativeOutOfDomain(_) |
| 345 | | EvalError::ZeroOutOfDomain(_) |
| 346 | | EvalError::OutOfDomain(..) |
| 347 | | EvalError::Undefined(_) => SqlState::INVALID_PARAMETER_VALUE, |
| 348 | |
| 349 | // Out-of-range numeric, integer, and float values. |
| 350 | EvalError::FloatOverflow |
| 351 | | EvalError::FloatUnderflow |
| 352 | | EvalError::NumericFieldOverflow |
| 353 | | EvalError::Float32OutOfRange(_) |
| 354 | | EvalError::Float64OutOfRange(_) |
| 355 | | EvalError::Int16OutOfRange(_) |
| 356 | | EvalError::Int32OutOfRange(_) |
| 357 | | EvalError::Int64OutOfRange(_) |
| 358 | | EvalError::UInt16OutOfRange(_) |
| 359 | | EvalError::UInt32OutOfRange(_) |
| 360 | | EvalError::UInt64OutOfRange(_) |
| 361 | | EvalError::OidOutOfRange(_) |
| 362 | | EvalError::MzTimestampOutOfRange(_) |
| 363 | | EvalError::MzTimestampStepOverflow |
| 364 | | EvalError::CharOutOfRange => SqlState::NUMERIC_VALUE_OUT_OF_RANGE, |
| 365 | |
| 366 | // Out-of-range datetime and interval values. |
| 367 | EvalError::DateOutOfRange |
| 368 | | EvalError::TimestampOutOfRange |
| 369 | | EvalError::TimestampCannotBeNan |
| 370 | | EvalError::DateBinOutOfRange(_) |
| 371 | | EvalError::DateDiffOverflow { .. } => SqlState::DATETIME_FIELD_OVERFLOW, |
| 372 | EvalError::IntervalOutOfRange(_) => SqlState::INTERVAL_FIELD_OVERFLOW, |
| 373 | |
| 374 | // Parse/cast failures, plus other malformed textual/encoded input. |
| 375 | EvalError::Parse(e) => parse_error_code(e), |
| 376 | EvalError::ParseHex(_) |
| 377 | | EvalError::InvalidBase64Equals |
| 378 | | EvalError::InvalidBase64Symbol(_) |
| 379 | | EvalError::InvalidBase64EndSequence => SqlState::INVALID_TEXT_REPRESENTATION, |
| 380 | EvalError::InvalidByteSequence { .. } => SqlState::CHARACTER_NOT_IN_REPERTOIRE, |
| 381 | EvalError::CharacterNotValidForEncoding(_) | EvalError::CharacterTooLargeForEncoding(_) => { |
| 382 | SqlState::PROGRAM_LIMIT_EXCEEDED |
| 383 | } |
| 384 | |
| 385 | // Invalid argument values. |
| 386 | EvalError::InvalidTimezone(_) |
| 387 | | EvalError::InvalidTimezoneInterval |
| 388 | | EvalError::InvalidTimezoneConversion |
| 389 | | EvalError::InvalidIanaTimezoneId(_) |
| 390 | | EvalError::InvalidLayer { .. } |
| 391 | | EvalError::InvalidEncodingName(_) |
| 392 | | EvalError::InvalidHashAlgorithm(_) |
| 393 | | EvalError::InvalidDatePart(_) |
no test coverage detected