From 715d834c325da73ce9dd6bbdc769bd125302e044 Mon Sep 17 00:00:00 2001 From: thanhthai3010 Date: Tue, 15 Sep 2026 13:42:46 +0700 Subject: [PATCH] fix(cassandra): skip table alias completions for CQL --- .../sql/sqlCompletion.context.spec.ts | 24 +++++++++++++++++++ apps/desktop/src/lib/sql/sqlCompletion.ts | 13 +++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/lib/__tests__/sql/sqlCompletion.context.spec.ts b/apps/desktop/src/lib/__tests__/sql/sqlCompletion.context.spec.ts index bfa82d5802..7ea3f52c67 100644 --- a/apps/desktop/src/lib/__tests__/sql/sqlCompletion.context.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/sqlCompletion.context.spec.ts @@ -581,6 +581,30 @@ describe("sqlCompletion table aliases", () => { expect(table?.apply).toBe("order_items oi"); }); + it("never adds generated aliases to Cassandra table completions", () => { + const sql = "SELECT * FROM ord"; + const items = buildSqlCompletionItems(sql, sql.length, { + tables: [{ name: "order_items", type: "table" }], + columnsByTable: new Map(), + databaseType: "cassandra", + autoAliasTables: true, + }); + + const table = items.find((item) => item.label === "order_items" && item.type === "table"); + expect(table?.apply).toBe("order_items"); + }); + + it("does not suggest table aliases for Cassandra", () => { + const sql = "SELECT * FROM order_items "; + const items = buildSqlCompletionItems(sql, sql.length, { + tables: [{ name: "order_items", type: "table" }], + columnsByTable: new Map(), + databaseType: "cassandra", + }); + + expect(items.some((item) => item.type === "snippet" && item.detail === "alias for order_items")).toBe(false); + }); + it("keeps plain table completions when generated aliases are disabled", () => { const sql = "SELECT * FROM ord"; const items = buildSqlCompletionItems(sql, sql.length, { diff --git a/apps/desktop/src/lib/sql/sqlCompletion.ts b/apps/desktop/src/lib/sql/sqlCompletion.ts index 100f254d19..d2436c0582 100644 --- a/apps/desktop/src/lib/sql/sqlCompletion.ts +++ b/apps/desktop/src/lib/sql/sqlCompletion.ts @@ -1622,13 +1622,14 @@ class SqlCompletionProvider { } const emptyTableNameCompletion = !context.prefix && (context.suggestTables || context.exclusiveTableSuggestions); - if (!pendingJoinKeyword && !emptyTableNameCompletion && !context.tableAliasAfterCursor && context.referencedTables.length > 0 && !context.suggestColumns && !context.insertTable) { + if (!pendingJoinKeyword && !emptyTableNameCompletion && !context.tableAliasAfterCursor && context.referencedTables.length > 0 && !context.suggestColumns && !context.insertTable && supportsTableAliases(this.databaseType)) { this.items.push(...buildAliasItems(context, this.databaseType, this.input.keywordCase)); } if (!context.exclusiveColumnSuggestions && context.suggestTables) { - this.items.push(...buildForeignKeyRelatedTableItems(context, completionTables, this.input.foreignKeysByTable, this.dialect, !!this.input.autoAliasTables && context.autoAliasTableCompletions, this.databaseType, this.input.keywordCase, this.input.currentSchema)); - this.items.push(...buildTableItems(context, completionTables, this.dialect, !!this.input.autoAliasTables && context.autoAliasTableCompletions, context.referencedTables, this.databaseType, this.input.currentSchema, this.input.keywordCase)); + const autoAliasTables = !!this.input.autoAliasTables && context.autoAliasTableCompletions && supportsTableAliases(this.databaseType); + this.items.push(...buildForeignKeyRelatedTableItems(context, completionTables, this.input.foreignKeysByTable, this.dialect, autoAliasTables, this.databaseType, this.input.keywordCase, this.input.currentSchema)); + this.items.push(...buildTableItems(context, completionTables, this.dialect, autoAliasTables, context.referencedTables, this.databaseType, this.input.currentSchema, this.input.keywordCase)); if (this.databaseType === "clickhouse") { this.items.push(...buildClickHouseFunctionItems(context.prefix, context.openingParenAfterCursor, "table")); } @@ -5239,6 +5240,12 @@ function isOracleLikeDatabase(databaseType?: DatabaseType): boolean { return databaseType === "oracle" || databaseType === "oceanbase-oracle"; } +// CQL has no table alias syntax, so Cassandra must never receive `table AS alias` +// or standalone alias suggestions. +function supportsTableAliases(databaseType?: DatabaseType): boolean { + return databaseType !== "cassandra"; +} + function buildJoinModifierKeywordItems(prefix: string, keywordCase?: SqlKeywordCase): SqlCompletionItem[] { if (!prefix) return []; return JOIN_MODIFIER_KEYWORD_PHRASES.filter((keyword) => matchesPrefix(keyword, prefix)).map((keyword) => {