Feature: Add exclusion violation error kind (#3918)

* feat: add exclusion violation error kind

* chore: add test for exclusion error kind
This commit is contained in:
Ole Martin Ruud 2025-07-05 01:52:58 +02:00 committed by GitHub
parent 9de593a0e5
commit a0c7769d85
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 32 additions and 0 deletions

View File

@ -197,6 +197,8 @@ pub enum ErrorKind {
NotNullViolation,
/// Check constraint violation.
CheckViolation,
/// Exclusion constraint violation.
ExclusionViolation,
/// An unmapped error.
Other,
}

View File

@ -214,6 +214,7 @@ impl DatabaseError for PgDatabaseError {
error_codes::FOREIGN_KEY_VIOLATION => ErrorKind::ForeignKeyViolation,
error_codes::NOT_NULL_VIOLATION => ErrorKind::NotNullViolation,
error_codes::CHECK_VIOLATION => ErrorKind::CheckViolation,
error_codes::EXCLUSION_VIOLATION => ErrorKind::ExclusionViolation,
_ => ErrorKind::Other,
}
}
@ -239,4 +240,6 @@ pub(crate) mod error_codes {
pub const NOT_NULL_VIOLATION: &str = "23502";
/// Caused when a check constraint is violated.
pub const CHECK_VIOLATION: &str = "23514";
/// Caused when a exclude constraint is violated.
pub const EXCLUSION_VIOLATION: &str = "23P01";
}

View File

@ -75,6 +75,28 @@ async fn it_fails_with_check_violation() -> anyhow::Result<()> {
Ok(())
}
#[sqlx_macros::test]
async fn it_fails_with_exclude_violation() -> anyhow::Result<()> {
let mut conn = new::<Postgres>().await?;
let mut tx = conn.begin().await?;
sqlx::query("INSERT INTO circles VALUES (circle('(0,0)'::point, 5.0));")
.execute(&mut *tx)
.await?;
let res: Result<_, sqlx::Error> =
sqlx::query("INSERT INTO circles VALUES (circle('(0,2.0)'::point, 2.0));")
.execute(&mut *tx)
.await;
let err = res.unwrap_err();
let err = err.into_database_error().unwrap();
assert_eq!(err.kind(), ErrorKind::ExclusionViolation);
Ok(())
}
#[sqlx_macros::test]
async fn it_fails_with_begin_failed() -> anyhow::Result<()> {
let mut conn = new::<Postgres>().await?;

View File

@ -63,3 +63,8 @@ CREATE SCHEMA IF NOT EXISTS foo;
CREATE TYPE foo."Foo" as ENUM ('Bar', 'Baz');
CREATE TABLE mytable(f HSTORE);
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);