fix(postgres): affected rows for WITH-wrapped DML and CTE completion

This commit is contained in:
Melody Ruch authored and GitHub committed 2026-08-27 22:25:09 +08:00
1 parent 9290391985
commit b198dd1327
3 files changed
+185 -17

No files matched your search

@@ -1021,6 +1021,57 @@ describe("sqlCompletion scoped context classification", () => {
expect(context.referencedTables).toEqual(expect.arrayContaining([expect.objectContaining({ name: "recent_orders", columns: ["id", "total"] }), expect.objectContaining({ name: "recent_orders", alias: "ro" })]));
});
it("scopes CTE bodies out of the outer query's referenced tables", () => {
const sql = "WITH cte AS (SELECT id, name FROM orders) SELECT id, na FROM cte";
const cursor = sql.indexOf(" FROM cte");
const context = getSqlCompletionContext(sql, cursor);
expect(context.referencedTables.map((table) => table.name)).toEqual(["cte"]);
});
it("suggests bare CTE column names instead of forcing a cte. qualifier (issue #7396)", () => {
const sql = "WITH cte AS (SELECT id, name FROM orders) SELECT id, na FROM cte";
const cursor = sql.indexOf(" FROM cte");
const items = buildSqlCompletionItems(sql, cursor, {
tables: [],
columnsByTable: new Map([
[
"orders",
[
{ name: "id", table: "orders", dataType: "int" },
{ name: "name", table: "orders", dataType: "text" },
],
],
[
"cte",
[
{ name: "id", table: "cte" },
{ name: "name", table: "cte" },
],
],
]),
});
expect(items).toEqual(expect.arrayContaining([expect.objectContaining({ label: "name", type: "column" })]));
expect(items.filter((item) => item.type === "column").map((item) => item.label)).not.toContain("orders.name");
});
it("keeps the CTE body's own tables while completing inside that body", () => {
const sql = "WITH cte AS (SELECT id, na FROM orders) SELECT * FROM cte";
const cursor = sql.indexOf(" FROM orders");
const context = getSqlCompletionContext(sql, cursor);
expect(context.referencedTables.map((table) => table.name)).toEqual(expect.arrayContaining(["orders", "cte"]));
});
it("keeps the underlying table when a CTE body projects an unresolved star", () => {
const sql = "WITH cte AS (SELECT * FROM orders) SELECT na FROM cte";
const cursor = sql.indexOf(" FROM cte");
const context = getSqlCompletionContext(sql, cursor);
expect(context.referencedTables.map((table) => table.name)).toEqual(expect.arrayContaining(["orders", "cte"]));
});
it("extracts subquery aliases and projected columns", () => {
const sql = "SELECT * FROM (SELECT id, name AS user_name FROM users) sq WHERE sq.";
const context = getSqlCompletionContext(sql, sql.length);