From 3d34f318e6b37dd06b7fab4346abfae3a3664e89 Mon Sep 17 00:00:00 2001 From: Eve <92513238+Eve-z1@users.noreply.github.com> Date: Wed, 9 Sep 2026 16:05:28 +0800 Subject: [PATCH] fix(completion): show derived table columns --- .../src/components/editor/QueryEditor.vue | 7 +++++++ .../queryEditorInlineColumnCompletion.spec.ts | 8 ++++++++ .../__tests__/sql/semantic/completion.spec.ts | 20 +++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 apps/desktop/src/lib/__tests__/editor/queryEditorInlineColumnCompletion.spec.ts diff --git a/apps/desktop/src/components/editor/QueryEditor.vue b/apps/desktop/src/components/editor/QueryEditor.vue index 002ae7cf44..8963e62ecb 100644 --- a/apps/desktop/src/components/editor/QueryEditor.vue +++ b/apps/desktop/src/components/editor/QueryEditor.vue @@ -4940,6 +4940,13 @@ function buildLocalSqlCompletionResult(completionContext: ReturnType ({ name, table: refTable.name, schema: refTable.schema })), + ); + continue; + } if (isVirtualCompletionTableReference(refTable)) continue; const cteDef = cteDefs.find((c) => c.name.toLowerCase() === refTable.name.toLowerCase()); if (cteDef) { diff --git a/apps/desktop/src/lib/__tests__/editor/queryEditorInlineColumnCompletion.spec.ts b/apps/desktop/src/lib/__tests__/editor/queryEditorInlineColumnCompletion.spec.ts new file mode 100644 index 0000000000..4fed688bde --- /dev/null +++ b/apps/desktop/src/lib/__tests__/editor/queryEditorInlineColumnCompletion.spec.ts @@ -0,0 +1,8 @@ +import { readFileSync } from "node:fs"; +import { expect, it } from "vitest"; + +const queryEditorSource = readFileSync(new URL("../../../components/editor/QueryEditor.vue", import.meta.url), "utf8"); + +it("maps inline projected columns into local completion results", () => { + expect(queryEditorSource).toMatch(/if \(refTable\.columns\?\.length\) \{[\s\S]*?columnsByTable\.set\([\s\S]*?refTable\.columns\.map/); +}); diff --git a/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts b/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts index 2bec0f86df..29978b8a15 100644 --- a/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts @@ -441,6 +441,26 @@ WHERE a.id = b.fk_kpi_set_score_id`, expect(items.filter((item) => item.type === "column").map((item) => item.label)).toEqual(["id", "user_name"]); }); + it("keeps projected aliases from a multiline derived table", () => { + const { items } = semanticCompletion( + `SELECT + t.DEPTNO, + t.| +FROM ( + SELECT + DEPTNO, + AVG(SAL) avg_sal, + RANK() OVER (ORDER BY AVG(SAL) DESC) AS rnk + FROM emp + GROUP BY DEPTNO +) AS t`, + {}, + { databaseType: "mysql", dialect: "mysql" }, + ); + + expect(items.filter((item) => item.type === "column").map((item) => item.label)).toEqual(["DEPTNO", "avg_sal", "rnk"]); + }); + it("expands alias star from only the qualified row source", () => { const columnsByTable = new Map([ ["users", ["id", "name"].map((name) => ({ name, table: "users" }))],