fix(query): preserve Oracle star projection editability
This commit is contained in:
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"]);
|
||||
});
|
||||
});
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user