From c8752844d54f8bf50efe9a54b53c532e7ed44895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=95=B8=E5=AE=87?= Date: Sun, 16 Mar 2025 00:47:15 +0800 Subject: [PATCH 1/3] Fix MSSQL decoding large unsigned u32 & u16 Tracking in #14 --- sqlx-core/src/mssql/types/int.rs | 2 +- sqlx-core/src/mssql/types/uint.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sqlx-core/src/mssql/types/int.rs b/sqlx-core/src/mssql/types/int.rs index ae20995627..9e02c3cbac 100644 --- a/sqlx-core/src/mssql/types/int.rs +++ b/sqlx-core/src/mssql/types/int.rs @@ -172,7 +172,7 @@ fn decode_numeric(bytes: &[u8], _precision: u8, mut scale: u8) -> Result(i64_val: i64) -> Result +pub(super) fn convert_integer(i64_val: i64) -> Result where T: TryFrom, T::Error: std::error::Error + Send + Sync + 'static, diff --git a/sqlx-core/src/mssql/types/uint.rs b/sqlx-core/src/mssql/types/uint.rs index 858a0fb5ce..c84e911f6e 100644 --- a/sqlx-core/src/mssql/types/uint.rs +++ b/sqlx-core/src/mssql/types/uint.rs @@ -53,8 +53,8 @@ impl Encode<'_, Mssql> for u16 { impl Decode<'_, Mssql> for u16 { fn decode(value: MssqlValueRef<'_>) -> Result { - let v = >::decode(value)?; - Ok(u16::try_from(v)?) + let i64_val = >::decode(value)?; + super::int::convert_integer::(i64_val) } } @@ -80,8 +80,8 @@ impl Encode<'_, Mssql> for u32 { impl Decode<'_, Mssql> for u32 { fn decode(value: MssqlValueRef<'_>) -> Result { - let v = >::decode(value)?; - Ok(u32::try_from(v)?) + let i64_val = >::decode(value)?; + super::int::convert_integer::(i64_val) } } From 2598f9e8a4c7606f637bd00dd9d869cda3d3bf5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=95=B8=E5=AE=87?= Date: Sun, 16 Mar 2025 01:23:20 +0800 Subject: [PATCH 2/3] Fix encoding large u32 & u16 Doing try_from will fail here too with TryFromIntError. Tracking in #14 --- sqlx-core/src/mssql/types/uint.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/sqlx-core/src/mssql/types/uint.rs b/sqlx-core/src/mssql/types/uint.rs index c84e911f6e..14aa044ea4 100644 --- a/sqlx-core/src/mssql/types/uint.rs +++ b/sqlx-core/src/mssql/types/uint.rs @@ -43,10 +43,7 @@ impl Type for u16 { impl Encode<'_, Mssql> for u16 { fn encode_by_ref(&self, buf: &mut Vec) -> IsNull { - let v = i16::try_from(*self).unwrap_or_else(|_e| { - log::warn!("cannot encode {self} as a signed mssql smallint"); - i16::MAX - }); + let v = *self as i16; >::encode_by_ref(&v, buf) } } @@ -70,10 +67,7 @@ impl Type for u32 { impl Encode<'_, Mssql> for u32 { fn encode_by_ref(&self, buf: &mut Vec) -> IsNull { - let v = i32::try_from(*self).unwrap_or_else(|_e| { - log::warn!("cannot encode {self} as a signed mssql int"); - i32::MAX - }); + let v = *self as i32; >::encode_by_ref(&v, buf) } } @@ -97,10 +91,7 @@ impl Type for u64 { impl Encode<'_, Mssql> for u64 { fn encode_by_ref(&self, buf: &mut Vec) -> IsNull { - let v = i64::try_from(*self).unwrap_or_else(|_e| { - log::warn!("cannot encode {self} as a signed mssql bigint"); - i64::MAX - }); + let v = *self as i64; >::encode_by_ref(&v, buf) } } From 594694ac8a3b30f1ff7a0a6ce8a485b51d20fc38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=95=B8=E5=AE=87?= Date: Mon, 17 Mar 2025 01:41:53 +0800 Subject: [PATCH 3/3] Fix decoding signed integers --- sqlx-core/src/mssql/types/int.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sqlx-core/src/mssql/types/int.rs b/sqlx-core/src/mssql/types/int.rs index 9e02c3cbac..61077dbc5a 100644 --- a/sqlx-core/src/mssql/types/int.rs +++ b/sqlx-core/src/mssql/types/int.rs @@ -30,7 +30,7 @@ impl Encode<'_, Mssql> for i8 { impl Decode<'_, Mssql> for i8 { fn decode(value: MssqlValueRef<'_>) -> Result { let i64_val = >::decode(value)?; - convert_integer::(i64_val) + Ok(convert_integer::(i64_val)? as Self) } } @@ -58,7 +58,7 @@ impl Encode<'_, Mssql> for i16 { impl Decode<'_, Mssql> for i16 { fn decode(value: MssqlValueRef<'_>) -> Result { let i64_val = >::decode(value)?; - convert_integer::(i64_val) + Ok(convert_integer::(i64_val)? as Self) } } @@ -83,7 +83,7 @@ impl Encode<'_, Mssql> for i32 { impl Decode<'_, Mssql> for i32 { fn decode(value: MssqlValueRef<'_>) -> Result { let i64_val = >::decode(value)?; - convert_integer::(i64_val) + Ok(convert_integer::(i64_val)? as Self) } }