From d33161bb719bdd37bff8120351e636e1b62bc5ca Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 22 Aug 2026 02:14:25 +0000 Subject: [PATCH] fix(databricks): use backticks for generated identifiers Closes #6915 --- .../__tests__/table/tableSelectSql.spec.ts | 6 +++++ apps/desktop/src/lib/table/tableSelectSql.ts | 1 + .../dbx-core/src/sql_dialect/identifiers.rs | 1 + .../dbx-core/src/sql_dialect/table_select.rs | 25 +++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/apps/desktop/src/lib/__tests__/table/tableSelectSql.spec.ts b/apps/desktop/src/lib/__tests__/table/tableSelectSql.spec.ts index 2a291ccbf0..2a4e30ebd9 100644 --- a/apps/desktop/src/lib/__tests__/table/tableSelectSql.spec.ts +++ b/apps/desktop/src/lib/__tests__/table/tableSelectSql.spec.ts @@ -68,6 +68,12 @@ describe("quoteTableIdentifier", () => { expect(quoteTableIdentifier("kyuubi", "order`items")).toBe("`order``items`"); }); + it("backtick-quotes Databricks identifiers", () => { + expect(quoteTableIdentifier("databricks", "order`items")).toBe("`order``items`"); + expect(quoteTableDataIdentifier("databricks", "order`items")).toBe("`order``items`"); + expect(qualifiedTableName({ databaseType: "databricks", schema: "sales", tableName: "ads_veeva_target_customer_df" })).toBe("`sales`.`ads_veeva_target_customer_df`"); + }); + it("uses BigQuery quoted identifiers and escape sequences", () => { expect(quoteTableIdentifier("bigquery", "order")).toBe("`order`"); expect(quoteTableIdentifier("bigquery", "a`b")).toBe("`a\\`b`"); diff --git a/apps/desktop/src/lib/table/tableSelectSql.ts b/apps/desktop/src/lib/table/tableSelectSql.ts index b21b98d62e..5c9ec50451 100644 --- a/apps/desktop/src/lib/table/tableSelectSql.ts +++ b/apps/desktop/src/lib/table/tableSelectSql.ts @@ -44,6 +44,7 @@ export function quoteTableIdentifier(databaseType: DatabaseType | undefined, nam databaseType === "kyuubi" || databaseType === "impala" || databaseType === "spark" || + databaseType === "databricks" || databaseType === "databend" || databaseType === "tdengine" || databaseType === "access" || diff --git a/crates/dbx-core/src/sql_dialect/identifiers.rs b/crates/dbx-core/src/sql_dialect/identifiers.rs index 02cab73c99..87062b39b3 100644 --- a/crates/dbx-core/src/sql_dialect/identifiers.rs +++ b/crates/dbx-core/src/sql_dialect/identifiers.rs @@ -132,6 +132,7 @@ pub fn quote_table_identifier(database_type: Option, name: &str) - | DatabaseType::Kyuubi | DatabaseType::Impala | DatabaseType::Spark + | DatabaseType::Databricks | DatabaseType::Databend | DatabaseType::Tdengine | DatabaseType::Access diff --git a/crates/dbx-core/src/sql_dialect/table_select.rs b/crates/dbx-core/src/sql_dialect/table_select.rs index 14804565ac..eb5cd52cf6 100644 --- a/crates/dbx-core/src/sql_dialect/table_select.rs +++ b/crates/dbx-core/src/sql_dialect/table_select.rs @@ -708,6 +708,31 @@ mod tests { } } + #[test] + fn databricks_table_select_uses_backtick_identifiers() { + assert_eq!( + build_table_data_select_sql(TableDataSelectSqlOptions { + database_type: Some(DatabaseType::Databricks), + schema: Some("sales".to_string()), + table_name: "ads_veeva_target_customer_df".to_string(), + limit: Some(100), + ..Default::default() + }), + "SELECT * FROM `sales`.`ads_veeva_target_customer_df` LIMIT 100;" + ); + assert_eq!( + build_table_data_select_sql(TableDataSelectSqlOptions { + database_type: Some(DatabaseType::Databricks), + identifier_quote: Some("\"".to_string()), + schema: Some("sales`west".to_string()), + table_name: "ads`target".to_string(), + limit: Some(100), + ..Default::default() + }), + "SELECT * FROM `sales``west`.`ads``target` LIMIT 100;" + ); + } + #[test] fn doris_external_catalog_prefixes_from_clause() { let sql =