fix(query): keep Oracle NUM column results editable

This commit is contained in:
onenewcode authored and GitHub committed 2026-09-15 14:51:44 +08:00
1 parent 715d834c32
commit d79dc05cf5
5 files changed
+124 -9

No files matched your search

+47
View File
@@ -342,6 +342,53 @@ test("rejects ambiguous case-only result column mapping", () => {
assert.equal(sourceColumnsForResult(analysis, ["Id"]), undefined);
});
test("does not bind non-Oracle same-arity label mismatches by projection order", () => {
const analysis = analyzeEditableQuery("select id, amount as num from users");
assert.ok(analysis);
assert.equal(sourceColumnsForResult(analysis, ["id", "amount"]), undefined);
assert.equal(allEditableColumnsWriteable(analysis, ["id", "amount"]), false);
assert.equal(sourceColumnsForResult(analysis, ["id", "amount"], undefined, "mysql"), undefined);
assert.equal(allEditableColumnsWriteable(analysis, ["id", "amount"], undefined, "mysql"), false);
});
test("keeps Oracle queries with a NUM column or alias editable when result labels disagree", () => {
const byName = analyzeEditableQuery("select id, num from users");
assert.ok(byName);
assert.deepEqual(
byName.columns,
[
{ sourceName: "id", sourceNameQuoted: false, resultName: "id", expression: "id" },
{ sourceName: "num", sourceNameQuoted: false, resultName: "num", expression: "num" },
],
);
assert.deepEqual(sourceColumnsForResult(byName, ["ID", "NUM"], undefined, "oracle"), ["id", "num"]);
assert.equal(allEditableColumnsWriteable(byName, ["ID", "NUM"], undefined, "oracle"), true);
assert.deepEqual(sourceColumnsForResult(byName, ["ID", "ROWNUM"], undefined, "oracle"), ["id", undefined]);
assert.equal(sourceColumnsForResult(byName, ["ID", "ROWNUM"], undefined, "oracle")?.[1], undefined);
const byAlias = analyzeEditableQuery("select id, amount as num from users");
assert.ok(byAlias);
assert.deepEqual(sourceColumnsForResult(byAlias, ["ID", "AMOUNT"], undefined, "oracle"), ["id", "amount"]);
assert.equal(allEditableColumnsWriteable(byAlias, ["ID", "AMOUNT"], undefined, "oracle"), true);
assert.deepEqual(sourceColumnsForResult(byAlias, ["ID", "NUM", "ROWNUM"], undefined, "oracle"), ["id", "amount", undefined]);
assert.equal(allEditableColumnsWriteable(byAlias, ["ID", "NUM", "ROWNUM"], undefined, "oracle"), true);
assert.deepEqual(sourceColumnsForResult(byAlias, ["ID", "AMOUNT", "__dbx_row_num"], undefined, "oracle"), ["id", "amount", undefined]);
assert.deepEqual(sourceColumnsForResult(byAlias, ["ID", "AMOUNT", "dbx_rn"], undefined, "oracle"), ["id", "amount", undefined]);
assert.equal(allEditableColumnsWriteable(byAlias, ["ID", "AMOUNT", "__dbx_row_num"], undefined, "oracle"), true);
});
test("tolerates trailing pagination labels for non-Oracle engines", () => {
const analysis = analyzeEditableQuery("select id, amount as num from users");
assert.ok(analysis);
assert.deepEqual(sourceColumnsForResult(analysis, ["id", "num", "__dbx_row_num"], undefined, "mysql"), ["id", "amount", undefined]);
assert.equal(allEditableColumnsWriteable(analysis, ["id", "num", "__dbx_row_num"], undefined, "mysql"), true);
assert.deepEqual(sourceColumnsForResult(analysis, ["id", "num", "dbx_rn"], undefined, "mysql"), ["id", "amount", undefined]);
assert.equal(allEditableColumnsWriteable(analysis, ["id", "num", "dbx_rn"], undefined, "mysql"), true);
assert.deepEqual(sourceColumnsForResult(analysis, ["id", "num", "ROWNUM"], undefined, "mysql"), ["id", "amount", undefined]);
assert.equal(allEditableColumnsWriteable(analysis, ["id", "num", "ROWNUM"], undefined, "mysql"), true);
assert.deepEqual(sourceColumnsForResult(analysis, ["id", "num", "rownum"], undefined, "mysql"), ["id", "amount", undefined]);
});
test("maps ClickHouse simple query results when identifier columns are returned", () => {
const analysis = analyzeEditableQuery("SELECT id, name, score + 1 AS next_score FROM default.people");