fix(query): preserve Oracle star projection editability

This commit is contained in:
Eve authored and GitHub committed 2026-09-14 20:00:41 +08:00
1 parent c63de19cbf
commit af424b782f
2 files changed
+20 -1

No files matched your search

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { analyzeEditableQueryEditability, resolveSourceColumnsByOrdinal } from "@/lib/sql/sqlAnalysis";
import { analyzeEditableQueryEditability, resolveSourceColumnsByOrdinal, sourceColumnsForResult, type EditableQueryInfo } from "@/lib/sql/sqlAnalysis";
/**
* An unqualified `*` is unambiguous when the query has exactly one source,
@@ -56,4 +56,20 @@ describe("single-source star projection column mapping", () => {
{ sourceKey: "orders:0", sourceColumn: "amount" },
]);
});
it("keeps a case-folded explicit column before an Oracle star aligned by ordinal", () => {
const analysis: EditableQueryInfo = {
schema: "APP",
tableName: "TABLE1",
tableAlias: "t1",
selectStar: false,
columns: [
{ sourceName: "ID", sourceNameQuoted: false, sourceQualifier: "t1", sourceKey: "t1:0", resultName: "id", expression: "t1.id" },
{ sourceName: "ID", sourceNameQuoted: false, sourceQualifier: "t1", sourceKey: "t1:0", resultName: "ID", expression: "t1.ID" },
{ sourceName: "NAME", sourceNameQuoted: false, sourceQualifier: "t1", sourceKey: "t1:0", resultName: "NAME", expression: "t1.NAME" },
],
};
expect(sourceColumnsForResult(analysis, ["ID", "ID", "NAME"], "t1:0", "oracle", ["ID"])).toEqual(["ID", "ID", "NAME"]);
});
});
+3
View File
@@ -862,6 +862,9 @@ export function allPrimaryKeysPresent(primaryKeys: string[], resultColumns: stri
}
function matchColumnsForResult(analysis: EditableQueryInfo, resultColumns: string[]): EditableQueryColumn[] | undefined {
// Preserve projection order before searching by label: folded duplicate names are not unique.
if (analysis.columns.length === resultColumns.length && analysis.columns.every((column, index) => column.resultName.toLowerCase() === resultColumns[index]!.toLowerCase())) return analysis.columns;
const matches: EditableQueryColumn[] = [];
let searchFrom = 0;
for (const resultColumn of resultColumns) {