From 9621f277bf85fd8438adb1fbc47c137393e5dc2a Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 24 Jun 2026 15:26:21 +0800 Subject: [PATCH] fix(clickhouse): fix sorted query sql --- apps/desktop/src/lib/tableSelectSql.ts | 2 +- crates/dbx-core/src/query_result_sql.rs | 18 ++++++++++++++++++ crates/dbx-core/src/sql_dialect/identifiers.rs | 1 + crates/dbx-core/src/sql_dialect/tests.rs | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/lib/tableSelectSql.ts b/apps/desktop/src/lib/tableSelectSql.ts index d624db2b88..e4878078bc 100644 --- a/apps/desktop/src/lib/tableSelectSql.ts +++ b/apps/desktop/src/lib/tableSelectSql.ts @@ -22,7 +22,7 @@ export function quoteTableIdentifier(databaseType: DatabaseType | undefined, nam // JDBC connections use the driver-reported identifier quote string // (DatabaseMetaData.getIdentifierQuoteString()) — pass through unquoted. if (databaseType === "jdbc") return name; - if (databaseType === "mysql" || databaseType === "hive" || databaseType === "databend" || databaseType === "tdengine" || databaseType === "access") return `\`${name.replace(/`/g, "``")}\``; + if (databaseType === "mysql" || databaseType === "clickhouse" || databaseType === "hive" || databaseType === "databend" || databaseType === "tdengine" || databaseType === "access") return `\`${name.replace(/`/g, "``")}\``; if (databaseType === "informix" && /^[A-Za-z_][A-Za-z0-9_$]*$/.test(name)) return name; if (databaseType === "neo4j") return quoteCypherIdentifier(name); if (databaseType === "sqlserver") return `[${name.replace(/\]/g, "]]")}]`; diff --git a/crates/dbx-core/src/query_result_sql.rs b/crates/dbx-core/src/query_result_sql.rs index fa2c35d9fe..91075e705f 100644 --- a/crates/dbx-core/src/query_result_sql.rs +++ b/crates/dbx-core/src/query_result_sql.rs @@ -240,6 +240,7 @@ pub fn build_sorted_query_sql(options: SortedQuerySqlOptions) -> QuerySqlBuildRe let aliases = build_derived_column_aliases(&options.result_columns); let use_derived_column_aliases = options.database_type != Some(DatabaseType::Mysql) + && options.database_type != Some(DatabaseType::ClickHouse) && options.database_type != Some(DatabaseType::Sqlite) && options.database_type != Some(DatabaseType::DuckDb); let sort_alias = if use_derived_column_aliases { @@ -1169,6 +1170,23 @@ mod tests { assert_eq!(result.sql.unwrap(), "SELECT * FROM (SELECT * FROM admin LIMIT 100) t ORDER BY `login_name` ASC;"); } + #[test] + fn builds_clickhouse_sorted_query_without_alias_list() { + let result = build_sorted_query_sql(SortedQuerySqlOptions { + original_sql: "SELECT id, part_day, hid FROM events LIMIT 100".to_string(), + database_type: Some(DatabaseType::ClickHouse), + result_columns: vec!["id".to_string(), "part_day".to_string(), "hid".to_string()], + column_index: 0, + column: "id".to_string(), + direction: QuerySortDirection::Desc, + }); + + assert_eq!( + result.sql.unwrap(), + "SELECT * FROM (SELECT id, part_day, hid FROM events LIMIT 100) t ORDER BY `id` DESC;" + ); + } + #[test] fn strips_sqlserver_order_by_for_sorted_query() { let result = build_sorted_query_sql(SortedQuerySqlOptions { diff --git a/crates/dbx-core/src/sql_dialect/identifiers.rs b/crates/dbx-core/src/sql_dialect/identifiers.rs index a715dc2a7f..9eeeb95805 100644 --- a/crates/dbx-core/src/sql_dialect/identifiers.rs +++ b/crates/dbx-core/src/sql_dialect/identifiers.rs @@ -75,6 +75,7 @@ pub fn quote_table_identifier(database_type: Option, name: &str) - Some(DatabaseType::Jdbc) => name.to_string(), Some( DatabaseType::Mysql + | DatabaseType::ClickHouse | DatabaseType::Goldendb | DatabaseType::StarRocks | DatabaseType::ManticoreSearch diff --git a/crates/dbx-core/src/sql_dialect/tests.rs b/crates/dbx-core/src/sql_dialect/tests.rs index 0f2e689c0f..48bd49fa5f 100644 --- a/crates/dbx-core/src/sql_dialect/tests.rs +++ b/crates/dbx-core/src/sql_dialect/tests.rs @@ -15,6 +15,7 @@ fn transfer_identifier_policy_preserves_legacy_output() { #[test] fn quotes_identifiers_by_database_type() { assert_eq!(quote_table_identifier(Some(DatabaseType::Mysql), "user`name"), "`user``name`"); + assert_eq!(quote_table_identifier(Some(DatabaseType::ClickHouse), "user`name"), "`user``name`"); assert_eq!(quote_table_identifier(Some(DatabaseType::Goldendb), "user`name"), "`user``name`"); assert_eq!(quote_table_identifier(Some(DatabaseType::StarRocks), "user`name"), "`user``name`"); assert_eq!(quote_table_identifier(Some(DatabaseType::SqlServer), "user]name"), "[user]]name]");