From 3ed3aa41cbaf3594c33f62b006cb7cbf8c275021 Mon Sep 17 00:00:00 2001 From: zipg Date: Fri, 31 Jul 2026 02:05:36 +0800 Subject: [PATCH] fix(jdbc): avoid duplicate managed driver imports --- crates/dbx-core/src/jdbc.rs | 46 +++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/crates/dbx-core/src/jdbc.rs b/crates/dbx-core/src/jdbc.rs index 98a477bde..f2d21b403 100644 --- a/crates/dbx-core/src/jdbc.rs +++ b/crates/dbx-core/src/jdbc.rs @@ -117,10 +117,11 @@ pub fn import_jdbc_drivers(plugins_root: &Path, paths: &[String]) -> Result PathBuf { unreachable!() } +fn paths_refer_to_same_file(left: &Path, right: &Path) -> bool { + if left == right { + return true; + } + matches!((left.canonicalize(), right.canonicalize()), (Ok(left), Ok(right)) if left == right) +} + #[cfg(test)] mod tests { use super::*; @@ -991,6 +999,40 @@ mod tests { let _ = std::fs::remove_dir_all(root); } + #[test] + fn single_local_jar_already_in_drivers_dir_is_not_duplicated() { + let root = std::env::temp_dir().join(format!("dbx-jdbc-managed-jar-test-{}", uuid::Uuid::new_v4())); + let source = root.join("jdbc").join("drivers").join("standalone.jar"); + std::fs::create_dir_all(source.parent().unwrap()).unwrap(); + std::fs::write(&source, b"driver").unwrap(); + + let drivers = import_jdbc_drivers(&root, &[source.to_string_lossy().to_string()]).unwrap(); + + assert_eq!(drivers.len(), 1); + assert_eq!(drivers[0].name, "standalone.jar"); + assert!(!source.with_file_name("standalone-1.jar").exists()); + let _ = std::fs::remove_dir_all(root); + } + + #[test] + fn single_local_jar_with_existing_name_keeps_unique_import_behavior() { + let root = std::env::temp_dir().join(format!("dbx-jdbc-duplicate-name-test-{}", uuid::Uuid::new_v4())); + let installed = root.join("jdbc").join("drivers").join("standalone.jar"); + let source = root.join("source").join("standalone.jar"); + std::fs::create_dir_all(installed.parent().unwrap()).unwrap(); + std::fs::create_dir_all(source.parent().unwrap()).unwrap(); + std::fs::write(&installed, b"installed").unwrap(); + std::fs::write(&source, b"new").unwrap(); + + let drivers = import_jdbc_drivers(&root, &[source.to_string_lossy().to_string()]).unwrap(); + + assert_eq!(drivers.len(), 2); + assert!(drivers.iter().any(|driver| driver.name == "standalone.jar")); + assert!(drivers.iter().any(|driver| driver.name == "standalone-1.jar")); + assert_eq!(std::fs::read(root.join("jdbc/drivers/standalone-1.jar")).unwrap(), b"new"); + let _ = std::fs::remove_dir_all(root); + } + #[test] fn installs_prestosql_direct_driver_as_builtin_bundle() { let root = std::env::temp_dir().join(format!("dbx-prestosql-direct-driver-test-{}", uuid::Uuid::new_v4()));