From a87e4be02993556b73e0c331dcb2797a626ce674 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 24 Jun 2026 19:54:19 +0800 Subject: [PATCH] fix(transfer): format SQL Server bit booleans --- crates/dbx-core/src/transfer.rs | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/crates/dbx-core/src/transfer.rs b/crates/dbx-core/src/transfer.rs index a64e4e1fa..636b9cbd2 100644 --- a/crates/dbx-core/src/transfer.rs +++ b/crates/dbx-core/src/transfer.rs @@ -647,6 +647,13 @@ pub fn escape_value_typed(val: &serde_json::Value, db_type: &DatabaseType, colum } } } + DatabaseType::SqlServer => { + if *b { + "1".to_string() + } else { + "0".to_string() + } + } _ => { if *b { "TRUE".to_string() @@ -4240,6 +4247,37 @@ mod tests { assert_eq!(sql, "INSERT INTO [dbo].[customers] ([name], [note]) VALUES\n(N'Tiếng Việt', N'O''Brien')"); } + #[test] + fn sqlserver_insert_formats_bit_booleans_as_numeric_literals() { + let sql = generate_insert_typed( + &[String::from("enabled"), String::from("deleted")], + &[Some(String::from("bit")), Some(String::from("BIT"))], + &[vec![json!(true), json!(false)]], + "flags", + "dbo", + &DatabaseType::SqlServer, + ); + + assert_eq!(sql, "INSERT INTO [dbo].[flags] ([enabled], [deleted]) VALUES\n(1, 0)"); + } + + #[test] + fn sqlserver_upsert_formats_bit_booleans_as_numeric_literals() { + let sql = generate_upsert_typed( + &[String::from("id"), String::from("enabled")], + &[Some(String::from("int")), Some(String::from("bit"))], + &[vec![json!(1), json!(true)]], + "flags", + "dbo", + &DatabaseType::SqlServer, + &[String::from("id")], + ); + + assert!(sql.contains("USING (VALUES\n(1, 1)\n)")); + assert!(!sql.contains("TRUE")); + assert!(!sql.contains("FALSE")); + } + #[test] fn postgres_insert_preserves_json_escape_sequences() { let sql = generate_insert_typed(