(&self)
| 771 | } |
| 772 | |
| 773 | pub fn code(&self) -> SqlState { |
| 774 | // We define this up here to make sure `AdapterError::` and `OptimizerError::` act the same way. |
| 775 | const RECURSION_LIMIT_ERROR_CODE: SqlState = SqlState::INTERNAL_ERROR; |
| 776 | |
| 777 | // TODO(benesch): we should only use `SqlState::INTERNAL_ERROR` for |
| 778 | // those errors that are truly internal errors. At the moment we have |
| 779 | // a various classes of uncategorized errors that use this error code |
| 780 | // inappropriately. |
| 781 | match self { |
| 782 | // DATA_EXCEPTION to match what Postgres returns for degenerate |
| 783 | // range bounds |
| 784 | AdapterError::AbsurdSubscribeBounds { .. } => SqlState::DATA_EXCEPTION, |
| 785 | AdapterError::AmbiguousSystemColumnReference => SqlState::FEATURE_NOT_SUPPORTED, |
| 786 | AdapterError::Catalog(e) => match &e.kind { |
| 787 | mz_catalog::memory::error::ErrorKind::VarError(e) => match e { |
| 788 | VarError::ConstrainedParameter { .. } => SqlState::INVALID_PARAMETER_VALUE, |
| 789 | VarError::FixedValueParameter { .. } => SqlState::INVALID_PARAMETER_VALUE, |
| 790 | VarError::InvalidParameterType { .. } => SqlState::INVALID_PARAMETER_VALUE, |
| 791 | VarError::InvalidParameterValue { .. } => SqlState::INVALID_PARAMETER_VALUE, |
| 792 | VarError::ReadOnlyParameter(_) => SqlState::CANT_CHANGE_RUNTIME_PARAM, |
| 793 | VarError::UnknownParameter(_) => SqlState::UNDEFINED_OBJECT, |
| 794 | VarError::RequiresUnsafeMode { .. } => SqlState::CANT_CHANGE_RUNTIME_PARAM, |
| 795 | VarError::RequiresFeatureFlag { .. } => SqlState::CANT_CHANGE_RUNTIME_PARAM, |
| 796 | }, |
| 797 | _ => SqlState::INTERNAL_ERROR, |
| 798 | }, |
| 799 | AdapterError::ChangedPlan(_) => SqlState::FEATURE_NOT_SUPPORTED, |
| 800 | AdapterError::DuplicateCursor(_) => SqlState::DUPLICATE_CURSOR, |
| 801 | // Evaluation errors are almost all user-facing data exceptions, not |
| 802 | // internal errors. `eval_error_code` matches every variant |
| 803 | // exhaustively so the catch-all `INTERNAL_ERROR` no longer applies |
| 804 | // to errors that are really the user's fault. See SQL-326. |
| 805 | AdapterError::Eval(e) => eval_error_code(e), |
| 806 | AdapterError::Explain(_) => SqlState::INTERNAL_ERROR, |
| 807 | AdapterError::IdExhaustionError => SqlState::INTERNAL_ERROR, |
| 808 | AdapterError::Internal(_) => SqlState::INTERNAL_ERROR, |
| 809 | AdapterError::IntrospectionDisabled { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 810 | AdapterError::InvalidLogDependency { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 811 | AdapterError::InvalidClusterReplicaAz { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 812 | AdapterError::InvalidSetIsolationLevel => SqlState::ACTIVE_SQL_TRANSACTION, |
| 813 | AdapterError::InvalidSetCluster => SqlState::ACTIVE_SQL_TRANSACTION, |
| 814 | AdapterError::InvalidStorageClusterSize { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 815 | AdapterError::SourceOrSinkSizeRequired { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 816 | AdapterError::InvalidTableMutationSelection { .. } => { |
| 817 | SqlState::INVALID_TRANSACTION_STATE |
| 818 | } |
| 819 | AdapterError::ConstraintViolation(NotNullViolation(_)) => SqlState::NOT_NULL_VIOLATION, |
| 820 | AdapterError::CopyFormatError(_) => SqlState::BAD_COPY_FILE_FORMAT, |
| 821 | AdapterError::ConcurrentClusterDrop => SqlState::INVALID_TRANSACTION_STATE, |
| 822 | AdapterError::ConcurrentDependencyDrop { .. } => SqlState::UNDEFINED_OBJECT, |
| 823 | AdapterError::ConcurrentDependencyMutation { .. } => { |
| 824 | SqlState::T_R_SERIALIZATION_FAILURE |
| 825 | } |
| 826 | AdapterError::CollectionUnreadable { .. } => SqlState::NO_DATA_FOUND, |
| 827 | AdapterError::NoClusterReplicasAvailable { .. } => SqlState::FEATURE_NOT_SUPPORTED, |
| 828 | AdapterError::OperationProhibitsTransaction(_) => SqlState::ACTIVE_SQL_TRANSACTION, |
| 829 | AdapterError::OperationRequiresTransaction(_) => SqlState::NO_ACTIVE_SQL_TRANSACTION, |
| 830 | AdapterError::ParseError(_) => SqlState::SYNTAX_ERROR, |
no test coverage detected