Skip to main content

diesel/
result.rs

1//! Errors, type aliases, and functions related to working with `Result`.
2
3use std::error::Error as StdError;
4use std::ffi::NulError;
5use std::fmt::{self, Display};
6
7#[derive(#[automatically_derived]
#[allow(clippy::enum_variant_names)]
impl ::core::fmt::Debug for Error {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Error::InvalidCString(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InvalidCString", &__self_0),
            Error::DatabaseError(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "DatabaseError", __self_0, &__self_1),
            Error::NotFound =>
                ::core::fmt::Formatter::write_str(f, "NotFound"),
            Error::QueryBuilderError(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "QueryBuilderError", &__self_0),
            Error::DeserializationError(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DeserializationError", &__self_0),
            Error::SerializationError(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "SerializationError", &__self_0),
            Error::RollbackErrorOnCommit {
                rollback_error: __self_0, commit_error: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "RollbackErrorOnCommit", "rollback_error", __self_0,
                    "commit_error", &__self_1),
            Error::RollbackTransaction =>
                ::core::fmt::Formatter::write_str(f, "RollbackTransaction"),
            Error::AlreadyInTransaction =>
                ::core::fmt::Formatter::write_str(f, "AlreadyInTransaction"),
            Error::NotInTransaction =>
                ::core::fmt::Formatter::write_str(f, "NotInTransaction"),
            Error::BrokenTransactionManager =>
                ::core::fmt::Formatter::write_str(f,
                    "BrokenTransactionManager"),
            Error::IntegerConversion(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "IntegerConversion", &__self_0),
        }
    }
}Debug)]
8#[allow(clippy::enum_variant_names)]
9/// Represents all the ways that a query can fail.
10///
11/// This type is not intended to be exhaustively matched, and new variants may
12/// be added in the future without a major version bump.
13#[non_exhaustive]
14pub enum Error {
15    /// The query contained a nul byte.
16    ///
17    /// This should never occur in normal usage.
18    InvalidCString(NulError),
19
20    /// The database returned an error.
21    ///
22    /// While Diesel prevents almost all sources of runtime errors at compile
23    /// time, it does not attempt to prevent 100% of them. Typically this error
24    /// will occur from insert or update statements due to a constraint
25    /// violation.
26    DatabaseError(
27        DatabaseErrorKind,
28        Box<dyn DatabaseErrorInformation + Send + Sync>,
29    ),
30
31    /// No rows were returned by a query expected to return at least one row.
32    ///
33    /// This variant is only returned by [`get_result`] and [`first`]. [`load`]
34    /// does not treat 0 rows as an error. If you would like to allow either 0
35    /// or 1 rows, call [`optional`] on the result.
36    ///
37    /// [`get_result`]: crate::query_dsl::RunQueryDsl::get_result()
38    /// [`first`]: crate::query_dsl::RunQueryDsl::first()
39    /// [`load`]: crate::query_dsl::RunQueryDsl::load()
40    /// [`optional`]: OptionalExtension::optional
41    NotFound,
42
43    /// The query could not be constructed
44    ///
45    /// An example of when this error could occur is if you are attempting to
46    /// construct an update statement with no changes (e.g. all fields on the
47    /// struct are `None`).
48    QueryBuilderError(Box<dyn StdError + Send + Sync>),
49
50    /// An error occurred deserializing the data being sent to the database.
51    ///
52    /// Typically this error means that the stated type of the query is
53    /// incorrect. An example of when this error might occur in normal usage is
54    /// attempting to deserialize an infinite date into chrono.
55    DeserializationError(Box<dyn StdError + Send + Sync>),
56
57    /// An error occurred serializing the data being sent to the database.
58    ///
59    /// An example of when this error would be returned is if you attempted to
60    /// serialize a `chrono::NaiveDate` earlier than the earliest date supported
61    /// by PostgreSQL.
62    SerializationError(Box<dyn StdError + Send + Sync>),
63
64    /// An error occurred when attempting rollback of a transaction subsequently to a failed
65    /// commit attempt.
66    ///
67    /// When a commit attempt fails and Diesel believes that it can attempt a rollback to return
68    /// the connection back in a usable state (out of that transaction), it attempts it then
69    /// returns the original error.
70    ///
71    /// If that fails, you get this.
72    RollbackErrorOnCommit {
73        /// The error that was encountered when attempting the rollback
74        rollback_error: Box<Error>,
75        /// The error that was encountered during the failed commit attempt
76        commit_error: Box<Error>,
77    },
78
79    /// Roll back the current transaction.
80    ///
81    /// You can return this variant inside of a transaction when you want to
82    /// roll it back, but have no actual error to return. Diesel will never
83    /// return this variant unless you gave it to us, and it can be safely
84    /// ignored in error handling.
85    RollbackTransaction,
86
87    /// Attempted to perform an operation that cannot be done inside a transaction
88    /// when a transaction was already open.
89    AlreadyInTransaction,
90
91    /// Attempted to perform an operation that can only be done inside a transaction
92    /// when no transaction was open
93    NotInTransaction,
94
95    /// Transaction manager broken, likely due to a broken connection. No other operations are possible.
96    BrokenTransactionManager,
97
98    /// Internal integer conversion failed
99    IntegerConversion(core::num::TryFromIntError),
100}
101
102#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DatabaseErrorKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                DatabaseErrorKind::UniqueViolation => "UniqueViolation",
                DatabaseErrorKind::ForeignKeyViolation =>
                    "ForeignKeyViolation",
                DatabaseErrorKind::UnableToSendCommand =>
                    "UnableToSendCommand",
                DatabaseErrorKind::SerializationFailure =>
                    "SerializationFailure",
                DatabaseErrorKind::ReadOnlyTransaction =>
                    "ReadOnlyTransaction",
                DatabaseErrorKind::RestrictViolation => "RestrictViolation",
                DatabaseErrorKind::NotNullViolation => "NotNullViolation",
                DatabaseErrorKind::CheckViolation => "CheckViolation",
                DatabaseErrorKind::ExclusionViolation => "ExclusionViolation",
                DatabaseErrorKind::ClosedConnection => "ClosedConnection",
                DatabaseErrorKind::Unknown => "Unknown",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DatabaseErrorKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DatabaseErrorKind {
    #[inline]
    fn eq(&self, other: &DatabaseErrorKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DatabaseErrorKind { }
#[automatically_derived]
impl ::core::clone::Clone for DatabaseErrorKind {
    #[inline]
    fn clone(&self) -> DatabaseErrorKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DatabaseErrorKind { }Copy)]
103/// The kind of database error that occurred.
104///
105/// This is not meant to exhaustively cover all possible errors, but is used to
106/// identify errors which are commonly recovered from programmatically. This enum
107/// is not intended to be exhaustively matched, and new variants may be added in
108/// the future without a major version bump.
109#[non_exhaustive]
110pub enum DatabaseErrorKind {
111    /// A unique constraint was violated.
112    UniqueViolation = 0,
113
114    /// A foreign key constraint was violated.
115    ForeignKeyViolation = 1,
116
117    /// The query could not be sent to the database due to a protocol violation.
118    ///
119    /// An example of a case where this would occur is if you attempted to send
120    /// a query with more than 65000 bind parameters using PostgreSQL.
121    UnableToSendCommand = 2,
122
123    /// A serializable transaction failed to commit due to a read/write
124    /// dependency on a concurrent transaction.
125    ///
126    /// Corresponds to SQLSTATE code 40001
127    ///
128    /// This error is only detected for PostgreSQL, as we do not yet support
129    /// transaction isolation levels for other backends.
130    SerializationFailure = 3,
131
132    /// The command could not be completed because the transaction was read
133    /// only.
134    ///
135    /// This error will also be returned for `SELECT` statements which attempted
136    /// to lock the rows.
137    ReadOnlyTransaction = 4,
138
139    /// A restrict constraint was violated.
140    RestrictViolation = 9,
141
142    /// A not null constraint was violated.
143    NotNullViolation = 5,
144
145    /// A check constraint was violated.
146    CheckViolation = 6,
147
148    /// An exclusion constraint was violated.
149    ExclusionViolation = 10,
150
151    /// The connection to the server was unexpectedly closed.
152    ///
153    /// This error is only detected for PostgreSQL and is emitted on a best-effort basis
154    /// and may be missed.
155    ClosedConnection = 7,
156
157    #[doc(hidden)]
158    Unknown = 8, // Match against _ instead, more variants may be added in the future
159}
160
161/// Information about an error that was returned by the database.
162pub trait DatabaseErrorInformation {
163    /// The primary human-readable error message. Typically one line.
164    fn message(&self) -> &str;
165
166    /// An optional secondary error message providing more details about the
167    /// problem, if it was provided by the database. Might span multiple lines.
168    fn details(&self) -> Option<&str>;
169
170    /// An optional suggestion of what to do about the problem, if one was
171    /// provided by the database.
172    fn hint(&self) -> Option<&str>;
173
174    /// The name of the table the error was associated with, if the error was
175    /// associated with a specific table and the backend supports retrieving
176    /// that information.
177    ///
178    /// Currently this method will return `None` for all backends other than
179    /// PostgreSQL.
180    fn table_name(&self) -> Option<&str>;
181
182    /// The name of the column the error was associated with, if the error was
183    /// associated with a specific column and the backend supports retrieving
184    /// that information.
185    ///
186    /// Currently this method will return `None` for all backends other than
187    /// PostgreSQL.
188    fn column_name(&self) -> Option<&str>;
189
190    /// The constraint that was violated if this error is a constraint violation
191    /// and the backend supports retrieving that information.
192    ///
193    /// Currently this method will return `None` for all backends other than
194    /// PostgreSQL.
195    fn constraint_name(&self) -> Option<&str>;
196
197    /// An optional integer indicating an error cursor position as an index into
198    /// the original statement string.
199    fn statement_position(&self) -> Option<i32>;
200}
201
202impl fmt::Debug for dyn DatabaseErrorInformation + Send + Sync {
203    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
204        fmt::Debug::fmt(&self.message(), f)
205    }
206}
207
208impl DatabaseErrorInformation for String {
209    fn message(&self) -> &str {
210        self
211    }
212    fn details(&self) -> Option<&str> {
213        None
214    }
215    fn hint(&self) -> Option<&str> {
216        None
217    }
218    fn table_name(&self) -> Option<&str> {
219        None
220    }
221    fn column_name(&self) -> Option<&str> {
222        None
223    }
224    fn constraint_name(&self) -> Option<&str> {
225        None
226    }
227    fn statement_position(&self) -> Option<i32> {
228        None
229    }
230}
231
232/// Errors which can occur during [`Connection::establish`]
233///
234/// [`Connection::establish`]: crate::connection::Connection::establish
235#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ConnectionError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ConnectionError::InvalidCString(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InvalidCString", &__self_0),
            ConnectionError::BadConnection(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "BadConnection", &__self_0),
            ConnectionError::InvalidConnectionUrl(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InvalidConnectionUrl", &__self_0),
            ConnectionError::CouldntSetupConfiguration(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CouldntSetupConfiguration", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ConnectionError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ConnectionError {
    #[inline]
    fn eq(&self, other: &ConnectionError) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ConnectionError::InvalidCString(__self_0),
                    ConnectionError::InvalidCString(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ConnectionError::BadConnection(__self_0),
                    ConnectionError::BadConnection(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ConnectionError::InvalidConnectionUrl(__self_0),
                    ConnectionError::InvalidConnectionUrl(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ConnectionError::CouldntSetupConfiguration(__self_0),
                    ConnectionError::CouldntSetupConfiguration(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq)]
236#[non_exhaustive]
237pub enum ConnectionError {
238    /// The connection URL contained a `NUL` byte.
239    InvalidCString(NulError),
240    /// The database returned an error.
241    BadConnection(String),
242    /// The connection URL could not be parsed.
243    InvalidConnectionUrl(String),
244    /// Diesel could not configure the database connection.
245    ///
246    /// Diesel may try to automatically set session specific configuration
247    /// values, such as UTF8 encoding, or enabling the `||` operator on MySQL.
248    /// This variant is returned if an error occurred executing the query to set
249    /// those options. Diesel will never affect global configuration.
250    CouldntSetupConfiguration(Error),
251}
252
253/// A specialized result type for queries.
254///
255/// This type is exported by `diesel::prelude`, and is generally used by any
256/// code which is interacting with Diesel. This type exists to avoid writing out
257/// `diesel::result::Error`, and is otherwise a direct mapping to `Result`.
258pub type QueryResult<T> = Result<T, Error>;
259
260/// A specialized result type for establishing connections.
261///
262/// This type exists to avoid writing out `diesel::result::ConnectionError`, and
263/// is otherwise a direct mapping to `Result`.
264pub type ConnectionResult<T> = Result<T, ConnectionError>;
265
266/// See the [method documentation](OptionalExtension::optional).
267pub trait OptionalExtension<T> {
268    /// Converts a `QueryResult<T>` into a `QueryResult<Option<T>>`.
269    ///
270    /// By default, Diesel treats 0 rows being returned from a query that is expected to return 1
271    /// row as an error (e.g. the return value of [`get_result`] or [`first`]). This method will
272    /// handle that error, and give you back an `Option<T>` instead.
273    ///
274    /// [`get_result`]: crate::query_dsl::RunQueryDsl::get_result()
275    /// [`first`]: crate::query_dsl::RunQueryDsl::first()
276    ///
277    /// # Example
278    ///
279    /// ```rust
280    /// use diesel::{NotFound, OptionalExtension, QueryResult};
281    ///
282    /// let result: QueryResult<i32> = Ok(1);
283    /// assert_eq!(Ok(Some(1)), result.optional());
284    ///
285    /// let result: QueryResult<i32> = Err(NotFound);
286    /// assert_eq!(Ok(None), result.optional());
287    /// ```
288    fn optional(self) -> Result<Option<T>, Error>;
289}
290
291impl<T> OptionalExtension<T> for QueryResult<T> {
292    fn optional(self) -> Result<Option<T>, Error> {
293        match self {
294            Ok(value) => Ok(Some(value)),
295            Err(Error::NotFound) => Ok(None),
296            Err(e) => Err(e),
297        }
298    }
299}
300
301/// See the [method documentation](OptionalEmptyChangesetExtension::optional_empty_changeset).
302pub trait OptionalEmptyChangesetExtension<T> {
303    /// By default, Diesel treats an empty update as a `QueryBuilderError`. This method will
304    /// convert that error into `None`.
305    ///
306    /// # Example
307    ///
308    /// ```rust
309    /// use diesel::{
310    ///     result::EmptyChangeset, result::Error::QueryBuilderError, OptionalEmptyChangesetExtension,
311    ///     QueryResult,
312    /// };
313    /// let result: QueryResult<i32> = Err(QueryBuilderError(Box::new(EmptyChangeset)));
314    /// assert_eq!(Ok(None), result.optional_empty_changeset());
315    /// ```
316    fn optional_empty_changeset(self) -> Result<Option<T>, Error>;
317}
318
319impl<T> OptionalEmptyChangesetExtension<T> for QueryResult<T> {
320    fn optional_empty_changeset(self) -> Result<Option<T>, Error> {
321        match self {
322            Ok(value) => Ok(Some(value)),
323            Err(Error::QueryBuilderError(e)) if e.is::<EmptyChangeset>() => Ok(None),
324            Err(e) => Err(e),
325        }
326    }
327}
328
329impl From<NulError> for ConnectionError {
330    fn from(e: NulError) -> Self {
331        ConnectionError::InvalidCString(e)
332    }
333}
334
335impl From<NulError> for Error {
336    fn from(e: NulError) -> Self {
337        Error::InvalidCString(e)
338    }
339}
340
341impl Display for Error {
342    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
343        match *self {
344            Error::InvalidCString(ref nul_err) => f.write_fmt(format_args!("{0}", nul_err))write!(f, "{nul_err}"),
345            Error::DatabaseError(_, ref e) => f.write_fmt(format_args!("{0}", e.message()))write!(f, "{}", e.message()),
346            Error::NotFound => f.write_str("Record not found"),
347            Error::QueryBuilderError(ref e) => e.fmt(f),
348            Error::DeserializationError(ref e) => e.fmt(f),
349            Error::SerializationError(ref e) => e.fmt(f),
350            Error::RollbackErrorOnCommit {
351                ref rollback_error,
352                ref commit_error,
353            } => {
354                f.write_fmt(format_args!("Transaction rollback failed: {0} (rollback attempted because of failure to commit: {1})",
        rollback_error, commit_error))write!(
355                    f,
356                    "Transaction rollback failed: {rollback_error} \
357                        (rollback attempted because of failure to commit: {commit_error})",
358                )?;
359                Ok(())
360            }
361            Error::RollbackTransaction => {
362                f.write_fmt(format_args!("You have asked diesel to rollback the transaction"))write!(f, "You have asked diesel to rollback the transaction")
363            }
364            Error::BrokenTransactionManager => f.write_fmt(format_args!("The transaction manager is broken"))write!(f, "The transaction manager is broken"),
365            Error::AlreadyInTransaction => f.write_fmt(format_args!("Cannot perform this operation while a transaction is open"))write!(
366                f,
367                "Cannot perform this operation while a transaction is open",
368            ),
369            Error::NotInTransaction => {
370                f.write_fmt(format_args!("Cannot perform this operation outside of a transaction"))write!(f, "Cannot perform this operation outside of a transaction",)
371            }
372            Error::IntegerConversion(ref e) => {
373                f.write_fmt(format_args!("Internal integer conversion error: {0}", e))write!(f, "Internal integer conversion error: {e}")
374            }
375        }
376    }
377}
378
379impl StdError for Error {
380    fn cause(&self) -> Option<&dyn StdError> {
381        match *self {
382            Error::InvalidCString(ref e) => Some(e),
383            Error::QueryBuilderError(ref e) => Some(&**e),
384            Error::DeserializationError(ref e) => Some(&**e),
385            Error::SerializationError(ref e) => Some(&**e),
386            Error::IntegerConversion(ref e) => Some(e),
387            _ => None,
388        }
389    }
390}
391
392impl Display for ConnectionError {
393    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
394        match *self {
395            ConnectionError::InvalidCString(ref nul_err) => nul_err.fmt(f),
396            ConnectionError::BadConnection(ref s) => f.write_fmt(format_args!("{0}", s))write!(f, "{s}"),
397            ConnectionError::InvalidConnectionUrl(ref s) => f.write_fmt(format_args!("{0}", s))write!(f, "{s}"),
398            ConnectionError::CouldntSetupConfiguration(ref e) => e.fmt(f),
399        }
400    }
401}
402
403impl StdError for ConnectionError {
404    fn cause(&self) -> Option<&dyn StdError> {
405        match *self {
406            ConnectionError::InvalidCString(ref e) => Some(e),
407            ConnectionError::CouldntSetupConfiguration(ref e) => Some(e),
408            _ => None,
409        }
410    }
411}
412
413impl PartialEq for Error {
414    fn eq(&self, other: &Error) -> bool {
415        match (self, other) {
416            (Error::InvalidCString(a), Error::InvalidCString(b)) => a == b,
417            (Error::DatabaseError(_, a), Error::DatabaseError(_, b)) => a.message() == b.message(),
418            (&Error::NotFound, &Error::NotFound) => true,
419            (&Error::RollbackTransaction, &Error::RollbackTransaction) => true,
420            (&Error::AlreadyInTransaction, &Error::AlreadyInTransaction) => true,
421            _ => false,
422        }
423    }
424}
425
426#[cfg(test)]
427#[allow(warnings)]
428fn error_impls_send() {
429    let err: Error = unimplemented!();
430    let x: &dyn Send = &err;
431}
432
433/// An unexpected `NULL` was encountered during deserialization
434#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnexpectedNullError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "UnexpectedNullError")
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnexpectedNullError { }
#[automatically_derived]
impl ::core::clone::Clone for UnexpectedNullError {
    #[inline]
    fn clone(&self) -> UnexpectedNullError { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnexpectedNullError { }Copy)]
435pub struct UnexpectedNullError;
436
437impl fmt::Display for UnexpectedNullError {
438    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
439        f.write_fmt(format_args!("Unexpected null for non-null column"))write!(f, "Unexpected null for non-null column")
440    }
441}
442
443impl StdError for UnexpectedNullError {}
444
445/// Expected more fields then present in the current row while deserializing results
446#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnexpectedEndOfRow {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "UnexpectedEndOfRow")
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnexpectedEndOfRow { }
#[automatically_derived]
impl ::core::clone::Clone for UnexpectedEndOfRow {
    #[inline]
    fn clone(&self) -> UnexpectedEndOfRow { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnexpectedEndOfRow { }Copy)]
447pub struct UnexpectedEndOfRow;
448
449impl fmt::Display for UnexpectedEndOfRow {
450    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
451        f.write_fmt(format_args!("Unexpected end of row"))write!(f, "Unexpected end of row")
452    }
453}
454
455impl StdError for UnexpectedEndOfRow {}
456
457/// Expected when an update has no changes to save.
458///
459/// When using `optional_empty_changeset`, this error is turned into `None`.
460#[derive(#[automatically_derived]
impl ::core::fmt::Debug for EmptyChangeset {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "EmptyChangeset")
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EmptyChangeset { }
#[automatically_derived]
impl ::core::clone::Clone for EmptyChangeset {
    #[inline]
    fn clone(&self) -> EmptyChangeset { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for EmptyChangeset { }Copy)]
461pub struct EmptyChangeset;
462
463impl fmt::Display for EmptyChangeset {
464    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
465        f.write_fmt(format_args!("There are no changes to save. This query cannot be built"))write!(
466            f,
467            "There are no changes to save. This query cannot be built"
468        )
469    }
470}
471
472impl StdError for EmptyChangeset {}
473
474/// Expected when you try to execute an empty query
475#[derive(#[automatically_derived]
impl ::core::fmt::Debug for EmptyQuery {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "EmptyQuery")
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EmptyQuery { }
#[automatically_derived]
impl ::core::clone::Clone for EmptyQuery {
    #[inline]
    fn clone(&self) -> EmptyQuery { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for EmptyQuery { }Copy)]
476pub struct EmptyQuery;
477
478impl fmt::Display for EmptyQuery {
479    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
480        f.write_fmt(format_args!("Detected an empty query. These are not supported by your database system"))write!(
481            f,
482            "Detected an empty query. These are not supported by your database system"
483        )
484    }
485}
486
487impl StdError for EmptyQuery {}
488
489/// An error occurred while deserializing a field
490#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DeserializeFieldError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "DeserializeFieldError", "field_name", &self.field_name, "error",
            &&self.error)
    }
}Debug)]
491#[non_exhaustive]
492pub struct DeserializeFieldError {
493    /// The name of the field that failed to deserialize
494    pub field_name: Option<String>,
495    /// The error that occurred while deserializing the field
496    pub error: Box<dyn StdError + Send + Sync>,
497}
498
499impl DeserializeFieldError {
500    #[cold]
501    pub(crate) fn new<'a, F, DB>(field: F, error: Box<dyn std::error::Error + Send + Sync>) -> Self
502    where
503        DB: crate::backend::Backend,
504        F: crate::row::Field<'a, DB>,
505    {
506        DeserializeFieldError {
507            field_name: field.field_name().map(|s| s.to_string()),
508            error,
509        }
510    }
511}
512
513impl StdError for DeserializeFieldError {
514    fn source(&self) -> Option<&(dyn StdError + 'static)> {
515        Some(&*self.error)
516    }
517}
518
519impl fmt::Display for DeserializeFieldError {
520    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
521        if let Some(ref field_name) = self.field_name {
522            f.write_fmt(format_args!("Error deserializing field \'{0}\': {1}", field_name,
        self.error))write!(
523                f,
524                "Error deserializing field '{}': {}",
525                field_name, self.error
526            )
527        } else {
528            f.write_fmt(format_args!("Error deserializing field: {0}", self.error))write!(f, "Error deserializing field: {}", self.error)
529        }
530    }
531}