fix(editor): keep order/group column suggestions active

This commit is contained in:
t8y2 2026-06-26 00:25:19 +08:00
parent 3a9cf0336a
commit 6ecec64588
2 changed files with 46 additions and 0 deletions

View File

@ -1716,6 +1716,7 @@ function isInColumnContext(beforeCursor: string): boolean {
if (!beforeCursor) return false;
if (isInSelectListContext(beforeCursor)) return true;
if (isInOrderOrGroupByContext(beforeCursor)) return true;
// Strip string literals
const cleaned = beforeCursor.replace(/'[^']*'/g, "''").replace(/"[^"]*"/g, "''");
@ -2747,6 +2748,7 @@ function isFollowedByJoin(beforeToken: string): boolean {
}
function isInTableListContext(beforeToken: string): boolean {
if (isInOrderOrGroupByContext(beforeToken)) return false;
return /,\s*$/.test(beforeToken) && /\b(?:from|join|update|into)\b/i.test(beforeToken);
}

View File

@ -1890,6 +1890,50 @@ test("suggests columns after multiple select-list expressions", () => {
assert.ok(!items.some((item) => item.type === "function" && item.label.startsWith("proc_")));
});
test("suggests columns after multiple group by expressions", () => {
const sql = "select project_name, count(*) from ypmng_archive group by project_name, review";
const cursor = sql.length;
const items = buildSqlCompletionItems(sql, cursor, {
tables: [{ name: "ypmng_archive", type: "table" }],
objects: [{ name: "proc_get_ypfmm_pd_score_list_with_template_doc_id", schema: "y_jnpf", type: "procedure" }],
columnsByTable: new Map([
[
"ypmng_archive",
[
{ name: "doc_id", table: "ypmng_archive", dataType: "bigint" },
{ name: "project_name", table: "ypmng_archive", dataType: "varchar" },
{ name: "review_accountant", table: "ypmng_archive", dataType: "varchar" },
],
],
]),
});
assert.ok(items.some((item) => item.label === "review_accountant" && item.type === "column"));
assert.ok(!items.some((item) => item.type === "function" && item.label.startsWith("proc_")));
});
test("suggests columns after multiple order by expressions", () => {
const sql = "select project_name, review_accountant, doc_id from ypmng_archive order by project_name, review";
const cursor = sql.length;
const items = buildSqlCompletionItems(sql, cursor, {
tables: [{ name: "ypmng_archive", type: "table" }],
objects: [{ name: "proc_get_ypfmm_pd_score_list_with_template_doc_id", schema: "y_jnpf", type: "procedure" }],
columnsByTable: new Map([
[
"ypmng_archive",
[
{ name: "doc_id", table: "ypmng_archive", dataType: "bigint" },
{ name: "project_name", table: "ypmng_archive", dataType: "varchar" },
{ name: "review_accountant", table: "ypmng_archive", dataType: "varchar" },
],
],
]),
});
assert.ok(items.some((item) => item.label === "review_accountant" && item.type === "column"));
assert.ok(!items.some((item) => item.type === "function" && item.label.startsWith("proc_")));
});
// --- Type-aware comparison hints ---
test("suggests NULL and IS NULL after comparison operator", () => {