From 34b37006bedbbb885d07a528b856952e91d0b552 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 17 Jun 2026 01:06:31 +0800 Subject: [PATCH] fix(jdbc): don't quote identifiers or use table aliases for JDBC --- crates/dbx-core/src/sql_dialect/capabilities.rs | 9 --------- crates/dbx-core/src/sql_dialect/identifiers.rs | 8 +++++--- crates/dbx-core/src/sql_dialect/table_select.rs | 4 +--- crates/dbx-core/src/sql_dialect/tests.rs | 2 +- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/crates/dbx-core/src/sql_dialect/capabilities.rs b/crates/dbx-core/src/sql_dialect/capabilities.rs index cb7b788af..80a682dde 100644 --- a/crates/dbx-core/src/sql_dialect/capabilities.rs +++ b/crates/dbx-core/src/sql_dialect/capabilities.rs @@ -48,12 +48,3 @@ pub(super) fn is_simple_informix_identifier(name: &str) -> bool { (first.is_ascii_alphabetic() || first == '_') && chars.all(|ch| ch.is_ascii_alphanumeric() || ch == '_' || ch == '$') } - -pub(super) fn is_simple_jdbc_identifier(name: &str) -> bool { - let mut chars = name.chars(); - let Some(first) = chars.next() else { - return false; - }; - (first.is_ascii_alphabetic() || first == '_') - && chars.all(|ch| ch.is_ascii_alphanumeric() || ch == '_' || ch == '$') -} diff --git a/crates/dbx-core/src/sql_dialect/identifiers.rs b/crates/dbx-core/src/sql_dialect/identifiers.rs index 0e998638b..e1f071438 100644 --- a/crates/dbx-core/src/sql_dialect/identifiers.rs +++ b/crates/dbx-core/src/sql_dialect/identifiers.rs @@ -1,6 +1,6 @@ use crate::models::connection::DatabaseType; -use super::capabilities::{is_schema_aware, is_simple_informix_identifier, is_simple_jdbc_identifier}; +use super::capabilities::{is_schema_aware, is_simple_informix_identifier}; pub fn qualified_table_name(database_type: Option, schema: Option<&str>, table_name: &str) -> String { if database_type == Some(DatabaseType::Iotdb) { @@ -30,8 +30,10 @@ pub fn qualified_table_name(database_type: Option, schema: Option< pub fn quote_table_identifier(database_type: Option, name: &str) -> String { match database_type { Some(DatabaseType::Iotdb) => name.to_string(), - Some(DatabaseType::Jdbc) if is_simple_jdbc_identifier(name) => name.to_string(), - Some(DatabaseType::Jdbc) => format!("`{}`", name.replace('`', "``")), + // JDBC connections use the driver-reported identifier quote string + // (DatabaseMetaData.getIdentifierQuoteString()) inside the JDBC agent, + // so the Rust layer passes identifiers through unquoted. + Some(DatabaseType::Jdbc) => name.to_string(), Some( DatabaseType::Mysql | DatabaseType::Goldendb diff --git a/crates/dbx-core/src/sql_dialect/table_select.rs b/crates/dbx-core/src/sql_dialect/table_select.rs index 191882266..ce09301b7 100644 --- a/crates/dbx-core/src/sql_dialect/table_select.rs +++ b/crates/dbx-core/src/sql_dialect/table_select.rs @@ -23,7 +23,7 @@ pub fn build_table_data_select_sql(options: TableDataSelectSqlOptions) -> String let where_clause = if predicate.is_empty() { String::new() } else { format!(" WHERE ({predicate})") }; let row_id_alias = if options.include_row_id && database_type == Some(DatabaseType::Oracle) { Some("t") } else { None }; - let default_order_alias = if database_type == Some(DatabaseType::Jdbc) { Some("dbx_t") } else { row_id_alias }; + let default_order_alias = if database_type == Some(DatabaseType::Jdbc) { None } else { row_id_alias }; let default_order_by = if database_type == Some(DatabaseType::InfluxDb) { // InfluxQL only allows sorting of timestamp column Some("time DESC".to_string()) @@ -58,8 +58,6 @@ pub fn build_table_data_select_sql(options: TableDataSelectSqlOptions) -> String }; let table_alias = if options.include_row_id && database_type.is_some_and(uses_fetch_first) { format!("{table} t") - } else if database_type == Some(DatabaseType::Jdbc) && default_order_by.is_some() { - format!("{table} dbx_t") } else { table }; diff --git a/crates/dbx-core/src/sql_dialect/tests.rs b/crates/dbx-core/src/sql_dialect/tests.rs index e1a48726a..2b7f4bc4a 100644 --- a/crates/dbx-core/src/sql_dialect/tests.rs +++ b/crates/dbx-core/src/sql_dialect/tests.rs @@ -21,7 +21,7 @@ fn quotes_identifiers_by_database_type() { assert_eq!(quote_table_identifier(Some(DatabaseType::Postgres), "user\"name"), "\"user\"\"name\""); assert_eq!(quote_table_identifier(Some(DatabaseType::Informix), "users_1"), "users_1"); assert_eq!(quote_table_identifier(Some(DatabaseType::Jdbc), "users_1"), "users_1"); - assert_eq!(quote_table_identifier(Some(DatabaseType::Jdbc), "user name"), "`user name`"); + assert_eq!(quote_table_identifier(Some(DatabaseType::Jdbc), "user name"), "user name"); assert_eq!(quote_table_identifier(Some(DatabaseType::Iotdb), "root.test.device2"), "root.test.device2"); }