From 4aa36cb893d5d195ee4c61904f7b2db6ef9eb513 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Tue, 4 Aug 2026 23:17:35 +0800 Subject: [PATCH] fix(sql): preserve leading tenant routing hints Closes #5332 --- .../src/lib/__tests__/sql/sqlStatementRanges.spec.ts | 9 +++++++++ apps/desktop/src/lib/sql/sqlStatementRanges.ts | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/lib/__tests__/sql/sqlStatementRanges.spec.ts b/apps/desktop/src/lib/__tests__/sql/sqlStatementRanges.spec.ts index c71564df2..5d450479b 100644 --- a/apps/desktop/src/lib/__tests__/sql/sqlStatementRanges.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/sqlStatementRanges.spec.ts @@ -1095,6 +1095,15 @@ describe("buildExecutionCandidates", () => { expect(candidates[0].sql).toBe(hintedSql); }); + it("preserves leading tenant routing hints in current statement candidates", () => { + const hintedSql = "/*@global:true*/\nSELECT * FROM tenant_table"; + const sql = `SELECT 1;\n${hintedSql};`; + const candidates = buildExecutionCandidates(sql, indexOf(sql, "tenant_table"), "mysql"); + + expect(candidates[0].sql).toBe(hintedSql); + expect(splitSqlStatementRanges("/*@global:true*/", "mysql")).toEqual([]); + }); + it("uses the cursor statement for the first candidate when there is no selection", () => { const sql = "SELECT *\nFROM users\nWHERE active = 1"; const candidates = buildExecutionCandidates(sql, indexOf(sql, "users")); diff --git a/apps/desktop/src/lib/sql/sqlStatementRanges.ts b/apps/desktop/src/lib/sql/sqlStatementRanges.ts index 10d045ad6..a1ecb8751 100644 --- a/apps/desktop/src/lib/sql/sqlStatementRanges.ts +++ b/apps/desktop/src/lib/sql/sqlStatementRanges.ts @@ -444,7 +444,8 @@ export function splitSqlStatementRanges(sql: string, databaseType?: DatabaseType } // Block comments consume until the closing */. if (ch === "/" && next === "*") { - if (statementStart === -1 && pendingHintStart === -1 && sql[i + 2] === "+") pendingHintStart = i; + const hintMarker = sql[i + 2]; + if (statementStart === -1 && pendingHintStart === -1 && (hintMarker === "+" || hintMarker === "@")) pendingHintStart = i; const close = sql.indexOf("*/", i + 2); i = close === -1 ? len : close + 2; continue;