fix(oracle): enable deleting keyless query rows

This commit is contained in:
t8y2 committed 2026-07-14 01:10:12 +08:00
1 parent 8497e34b31
commit e74af3e85f
4 files changed
+142 -17

No files matched your search

@@ -49,6 +49,21 @@ describe("editable query hidden primary keys", () => {
).toBe('SELECT /*+ INDEX(t IDX_USERS_NAME) */ t.NAME, "ID" AS "__DBX_PK_0"\nFROM USERS t');
});
it("supports an Oracle ROWID expression for keyless base tables", () => {
expect(
buildQueryWithHiddenPrimaryKeys({
sql: "SELECT * FROM APP.USERS t WHERE t.ACTIVE = 1",
databaseType: "oracle",
primaryKeys: ["__DBX_ROWID"],
existingResultNames: ["ID", "NAME"],
sourceExpressions: { __DBX_ROWID: "ROWIDTOCHAR(ROWID)" },
}),
).toEqual({
sql: 'SELECT *, ROWIDTOCHAR(ROWID) AS "__DBX_PK_0" FROM APP.USERS t WHERE t.ACTIVE = 1',
projections: [{ sourceName: "__DBX_ROWID", alias: "__DBX_PK_0" }],
});
});
it("inserts hidden keys before a trailing line comment", () => {
expect(
buildQueryWithHiddenPrimaryKeys({
@@ -14,7 +14,7 @@ export interface HiddenPrimaryKeyQuery {
projections: HiddenPrimaryKeyProjection[];
}
export function buildQueryWithHiddenPrimaryKeys(options: { sql: string; databaseType: DatabaseType; primaryKeys: string[]; existingResultNames: string[] }): HiddenPrimaryKeyQuery | undefined {
export function buildQueryWithHiddenPrimaryKeys(options: { sql: string; databaseType: DatabaseType; primaryKeys: string[]; existingResultNames: string[]; sourceExpressions?: Record<string, string> }): HiddenPrimaryKeyQuery | undefined {
if (options.primaryKeys.length === 0) return undefined;
const dialect = sqlSemanticDialectFor({ databaseType: options.databaseType });
@@ -29,7 +29,7 @@ export function buildQueryWithHiddenPrimaryKeys(options: { sql: string; database
usedNames.add(alias.toLowerCase());
return { sourceName, alias };
});
const expressions = projections.map(({ sourceName, alias }) => `${dialect.quoteIdentifier(sourceName)} AS ${dialect.quoteIdentifier(alias)}`);
const expressions = projections.map(({ sourceName, alias }) => `${options.sourceExpressions?.[sourceName] ?? dialect.quoteIdentifier(sourceName)} AS ${dialect.quoteIdentifier(alias)}`);
const sql = appendSelectProjections(options.sql, expressions);
return sql ? { sql, projections } : undefined;
}