From d3a97164aafadbf86528dfad026c5c6123e5999b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E5=87=A1?= <113765024+xiaou61@users.noreply.github.com> Date: Fri, 28 Aug 2026 12:36:37 +0800 Subject: [PATCH] fix(sql): preserve empty raw placeholders --- .../editor/__tests__/SqlParameterDialog.spec.ts | 2 +- apps/desktop/src/lib/__tests__/sql/sqlParameters.spec.ts | 8 +++++++- apps/desktop/src/lib/sql/sqlParameters.ts | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/components/editor/__tests__/SqlParameterDialog.spec.ts b/apps/desktop/src/components/editor/__tests__/SqlParameterDialog.spec.ts index 21c9257ebc..5cbb46e9a3 100644 --- a/apps/desktop/src/components/editor/__tests__/SqlParameterDialog.spec.ts +++ b/apps/desktop/src/components/editor/__tests__/SqlParameterDialog.spec.ts @@ -36,7 +36,7 @@ const MIXED_VALUES: Record = { empty_value: { kind: "boolean", value: "" }, }; const RAW_VALUES = Object.fromEntries(Object.entries(MIXED_VALUES).map(([key, input]) => [key, { ...input, kind: "raw" as const }])); -const RAW_SQL = "SELECT alpha beta, 42, NULL, current_date, NULL, alpha beta"; +const RAW_SQL = "SELECT alpha beta, 42, NULL, current_date, ${empty_value}, alpha beta"; const mountedApps: App[] = []; diff --git a/apps/desktop/src/lib/__tests__/sql/sqlParameters.spec.ts b/apps/desktop/src/lib/__tests__/sql/sqlParameters.spec.ts index 265ad7a98e..e590b89505 100644 --- a/apps/desktop/src/lib/__tests__/sql/sqlParameters.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/sqlParameters.spec.ts @@ -674,6 +674,12 @@ describe("Oracle and Dameng trigger pseudo-records", () => { }); describe("substituteSqlParameters", () => { + it("preserves empty raw placeholders", () => { + const sql = "select ${raw_value}, '${raw_value}', 'prefix ${raw_value} suffix'"; + + expect(substituteSqlParameters(sql, { raw_value: { kind: "raw", value: " " } })).toBe(sql); + }); + it("substitutes dotted names by their complete key", () => { const sql = "select ${params.id}, #{params.profile.name}, 'prefix${params.label}'"; expect( @@ -908,7 +914,7 @@ describe("substituteSqlParameters", () => { empty_raw: { kind: "raw", value: " " }, empty_string: { kind: "string", value: "" }, }), - ).toBe("select NULL, NULL, NULL, ''"); + ).toBe("select NULL, NULL, '${empty_raw}', ''"); }); it("replaces placeholders embedded in ordinary SQL string values", () => { diff --git a/apps/desktop/src/lib/sql/sqlParameters.ts b/apps/desktop/src/lib/sql/sqlParameters.ts index 1ca1e782f8..2b3749a23b 100644 --- a/apps/desktop/src/lib/sql/sqlParameters.ts +++ b/apps/desktop/src/lib/sql/sqlParameters.ts @@ -221,6 +221,13 @@ export function substituteSqlParameters(sql: string, values: Record