From 75652b10fecc3c6e8e2b48bf4a4746ce57fe1a2b Mon Sep 17 00:00:00 2001 From: vrustx <279631638@qq.com> Date: Wed, 15 Jul 2026 21:24:38 +0800 Subject: [PATCH] fix(sql): preserve ClickHouse lambda arrows --- .../src/lib/__tests__/sql/sqlFormatter.spec.ts | 17 +++++++++++++++++ apps/desktop/src/lib/sql/sqlFormatter.ts | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/lib/__tests__/sql/sqlFormatter.spec.ts b/apps/desktop/src/lib/__tests__/sql/sqlFormatter.spec.ts index 3d0181684..35e159a64 100644 --- a/apps/desktop/src/lib/__tests__/sql/sqlFormatter.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/sqlFormatter.spec.ts @@ -14,6 +14,23 @@ describe("sqlFormatter", () => { } }); + it("preserves ClickHouse lambda arrows when formatting issue #3573 SQL", async () => { + const sql = ` + WITH industry_code_donghua_id_RYCzfD AS (SELECT id + FROM cd.industry_code_donghua + WHERE cd.industry_code_donghua.code IN ('INB0709', 'INB0004')) + SELECT id,ent_short,arrayMap(x->dictGet(cd.industry_donghua_dict,'name',x),prefer_industry) as prefer_industry_name,org_type,company_id,arrayCount(\`investment.be_company_id\` -> 1, \`investment.be_company_id\`) as be_company_count + FROM search_donghua.investor + WHERE arrayExists(x -> x IN industry_code_donghua_id_RYCzfD, prefer_industry) + ORDER BY be_company_count DESC,id ASC + LIMIT 0,10 + `; + + const formatted = await formatSqlText(sql, sqlFormatDialectForDbType("clickhouse")); + + expect(formatted).toContain("x -> dictGet"); + expect(formatted).not.toContain("- >"); + }); it("preserves DBX brace placeholders in generic and MySQL SQL", async () => { const sql = "SELECT ${x} AS shell_value, #{x} AS mybatis_value, '${date}' AS quoted_value"; diff --git a/apps/desktop/src/lib/sql/sqlFormatter.ts b/apps/desktop/src/lib/sql/sqlFormatter.ts index 1980de3cd..db6ec32af 100644 --- a/apps/desktop/src/lib/sql/sqlFormatter.ts +++ b/apps/desktop/src/lib/sql/sqlFormatter.ts @@ -1,6 +1,6 @@ import { DEFAULT_SQL_FORMATTER_SETTINGS, sqlFormatterOptions, type SqlFormatterSettings } from "@/lib/sql/sqlFormatterConfig"; -export type SqlFormatDialect = "mysql" | "postgres" | "sqlite" | "sqlserver" | "generic"; +export type SqlFormatDialect = "mysql" | "postgres" | "sqlite" | "sqlserver" | "clickhouse" | "generic"; export const MAX_SQL_FORMAT_CHARS = 1_000_000; @@ -34,6 +34,8 @@ export function sqlFormatDialectForDbType(dbType: string | null | undefined): Sq return "sqlite"; case "sqlserver": return "sqlserver"; + case "clickhouse": + return "clickhouse"; default: return "generic"; } @@ -49,6 +51,8 @@ function formatterLanguage(dialect: SqlFormatDialect) { return "sqlite"; case "sqlserver": return "transactsql"; + case "clickhouse": + return "clickhouse"; default: return "sql"; }