diff --git a/crates/dbx-core/src/db/sqlserver.rs b/crates/dbx-core/src/db/sqlserver.rs index dcad83e7b..cc13d133b 100644 --- a/crates/dbx-core/src/db/sqlserver.rs +++ b/crates/dbx-core/src/db/sqlserver.rs @@ -639,18 +639,6 @@ fn sqlserver_cell_to_json(cell: &ColumnData<'static>) -> serde_json::Value { return serde_json::Value::String(v.to_string()); } if let Ok(Some(v)) = as tiberius::FromSqlOwned>::from_sql_owned(cell.clone()) { - // Try to decode as UTF-16 LE (SQL Server NVARCHAR encoding) with lossy conversion - // This handles cases where sys.sql_modules.definition contains invalid UTF-8 sequences - if v.len() >= 2 && v.len() % 2 == 0 { - let utf16_units: Vec = - v.chunks_exact(2).map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])).collect(); - if let Ok(decoded) = String::from_utf16(&utf16_units) { - return serde_json::Value::String(decoded); - } - // Use lossy conversion as fallback for invalid UTF-16 sequences - let lossy_decoded = String::from_utf16_lossy(&utf16_units); - return serde_json::Value::String(lossy_decoded); - } return super::binary_value_to_json(&v); } serde_json::Value::Null @@ -2066,6 +2054,14 @@ mod tests { assert_eq!(sqlserver_cell_to_json(&cell), serde_json::json!("2026-05-13 09:08:07.123")); } + #[test] + fn sqlserver_binary_cells_are_json_hex_strings() { + let cell = + ColumnData::Binary(Some(std::borrow::Cow::Owned(vec![0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0x53]))); + + assert_eq!(sqlserver_cell_to_json(&cell), serde_json::json!("0x000000000001cf53")); + } + #[test] fn sqlserver_detects_geometry_result_columns() { assert!(is_sqlserver_spatial_column(&SqlServerDescribedColumn { diff --git a/crates/dbx-core/tests/live_postgres_transfer.rs b/crates/dbx-core/tests/live_postgres_transfer.rs index e5e5c248e..a75136178 100644 --- a/crates/dbx-core/tests/live_postgres_transfer.rs +++ b/crates/dbx-core/tests/live_postgres_transfer.rs @@ -45,6 +45,7 @@ fn postgres_test_config(id: &str, database: &str) -> ConnectionConfig { redis_sentinel_tls: false, redis_cluster_nodes: String::new(), redis_key_separator: dbx_core::models::connection::default_redis_key_separator(), + redis_scan_page_size: None, etcd_endpoints: String::new(), gbase_server: String::new(), informix_server: String::new(),