fix(oracle): skip metadata lookups for missing tables

This commit is contained in:
zipg
2026-07-20 13:50:12 +08:00
committed by GitHub
parent 083ffe7a35
commit 9cf2ec4194
3 changed files with 36 additions and 1 deletions
@@ -139,7 +139,7 @@ export async function loadTableMetadata(request: TableMetadataRequest): Promise<
scope,
async () => {
const columns = await api.getColumns(request.connectionId, request.database, request.schema ?? "", request.tableName, request.catalog);
const indexes = await api.listIndexes(request.connectionId, request.database, request.schema ?? "", request.tableName, request.catalog).catch((): IndexInfo[] => []);
const indexes = columns.length > 0 ? await api.listIndexes(request.connectionId, request.database, request.schema ?? "", request.tableName, request.catalog).catch((): IndexInfo[] => []) : [];
const primaryKeys = editableRowIdentifierColumns(request.databaseType as DatabaseType, columns, indexes, request.tableType);
return {
schema: request.schema || undefined,
@@ -173,6 +173,40 @@ describe("queryStore hidden primary key editing", () => {
expect(tab.queryEditabilityReason).toBeUndefined();
});
it("does not check Oracle ROWID eligibility when query metadata returns no columns", async () => {
getConnectionConfig.mockReturnValue({ id: "oracle-1", name: "Oracle", db_type: "oracle", database: "ORCL", query_timeout_secs: 30 });
getColumns.mockResolvedValue([]);
analyzeEditableQueryEditability.mockResolvedValue({
editable: true,
analysis: {
schema: undefined,
tableName: "aa",
selectStar: true,
columns: [],
},
});
executeMulti.mockResolvedValue([
{
columns: ["Error"],
rows: [["ORA-00942: table or view does not exist"]],
affected_rows: 0,
execution_time_ms: 1,
execution_error: true,
},
]);
const { useQueryStore } = await import("@/stores/queryStore");
const store = useQueryStore();
const tabId = store.createTab("oracle-1", "ORCL", "Query");
await store.executeTabSql(tabId, "SELECT * FROM aa");
expect(getColumns).toHaveBeenCalledWith("oracle-1", "ORCL", "", "AA", undefined);
expect(listIndexes).not.toHaveBeenCalled();
expect(listObjects).not.toHaveBeenCalled();
expect(executeMulti).toHaveBeenCalledWith("oracle-1", "ORCL", "SELECT * FROM aa", undefined, expect.any(String), expect.objectContaining({ timeoutSecs: 30 }));
});
it("keeps a keyless Oracle query editable when its WHERE clause reads another table", async () => {
getConnectionConfig.mockReturnValue({ id: "oracle-1", name: "Oracle", db_type: "oracle", database: "ORCL", query_timeout_secs: 30 });
getColumns.mockResolvedValue([
+1
View File
@@ -2449,6 +2449,7 @@ export const useQueryStore = defineStore("query", () => {
if (sources.length !== 1 || analysis.distinct) return unchanged;
const loaded = await loadEditableQuerySource(tab, analysis, sources[0]!, conn, databaseType, traceId, elapsed);
if (loaded.tableMeta.columns.length === 0) return unchanged;
if (loaded.tableMeta.tableType?.toUpperCase().includes("VIEW")) return unchanged;
const metadataAnalysis = expandStarProjectionColumnsForSource(bindColumnsForSource(databaseType, loaded.analysis, loaded.source, loaded.tableMeta.columns), loaded.source, loaded.tableMeta.columns);
const declaredPrimaryKeys = loaded.tableMeta.columns.filter((column) => column.is_primary_key).map((column) => column.name);