diff --git a/src/functions.rs b/src/functions.rs index caa2720..85e27d0 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -114,6 +114,15 @@ fn set_result<'a>(ctx: *mut sqlite3_context, result: &ToSqlOutput<'a>) { } unsafe fn report_error(ctx: *mut sqlite3_context, err: &Error) { + // Extended constraint error codes were added in SQLite 3.7.16. We don't have an explicit + // feature check for that, and this doesn't really warrant one. We'll use the extended code + // if we're on the bundled version (since it's at least 3.17.0) and the normal constraint + // error code if not. + #[cfg(feature = "bundled")] + fn constraint_error_code() -> i32 { ffi::SQLITE_CONSTRAINT_FUNCTION } + #[cfg(not(feature = "bundled"))] + fn constraint_error_code() -> i32 { ffi::SQLITE_CONSTRAINT } + match *err { Error::SqliteFailure(ref err, ref s) => { ffi::sqlite3_result_error_code(ctx, err.extended_code); @@ -122,7 +131,7 @@ unsafe fn report_error(ctx: *mut sqlite3_context, err: &Error) { } } _ => { - ffi::sqlite3_result_error_code(ctx, ffi::SQLITE_CONSTRAINT_FUNCTION); + ffi::sqlite3_result_error_code(ctx, constraint_error_code()); if let Ok(cstr) = str_to_cstring(err.description()) { ffi::sqlite3_result_error(ctx, cstr.as_ptr(), -1); } diff --git a/src/lib.rs b/src/lib.rs index a25777a..9e52e0c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1169,6 +1169,15 @@ mod test { #[test] fn test_notnull_constraint_error() { + // extended error codes for constraints were added in SQLite 3.7.16; if we're + // running on our bundled version, we know the extended error code exists. + #[cfg(feature = "bundled")] + fn check_extended_code(extended_code: c_int) { + assert_eq!(extended_code, ffi::SQLITE_CONSTRAINT_NOTNULL); + } + #[cfg(not(feature = "bundled"))] + fn check_extended_code(_extended_code: c_int) {} + let db = checked_memory_handle(); db.execute_batch("CREATE TABLE foo(x NOT NULL)").unwrap(); @@ -1178,12 +1187,7 @@ mod test { match result.unwrap_err() { Error::SqliteFailure(err, _) => { assert_eq!(err.code, ErrorCode::ConstraintViolation); - - // extended error codes for constraints were added in SQLite 3.7.16; if we're - // running on a version at least that new, check for the extended code - if version_number() >= 3007016 { - assert_eq!(err.extended_code, ffi::SQLITE_CONSTRAINT_NOTNULL) - } + check_extended_code(err.extended_code); } err => panic!("Unexpected error {}", err), }