From 66bfc86c783dfe1c04194e342a5d44ffe222243a Mon Sep 17 00:00:00 2001 From: t8y2 Date: Sat, 26 Sep 2026 12:44:50 +0800 Subject: [PATCH] fix(query): avoid preflight probes for Oracle and PostgreSQL Refs: #9960 --- .../queryStore.multiStatementError.spec.ts | 31 +++++++++++++++++++ apps/desktop/src/stores/queryStore.ts | 6 +++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/stores/__tests__/queryStore.multiStatementError.spec.ts b/apps/desktop/src/stores/__tests__/queryStore.multiStatementError.spec.ts index 3acb62a453..c8f2129feb 100644 --- a/apps/desktop/src/stores/__tests__/queryStore.multiStatementError.spec.ts +++ b/apps/desktop/src/stores/__tests__/queryStore.multiStatementError.spec.ts @@ -340,6 +340,37 @@ describe("queryStore multi-statement errors", () => { }); }); + it.each(["oracle", "postgres"])("skips the redundant health probe before a %s batch execution", async (dbType) => { + const sql = Array.from({ length: 20 }, (_, index) => `INSERT INTO users (id) VALUES (${index + 1});`).join("\n"); + const blockedHealthProbe = deferred(); + mocks.ensureConnected.mockImplementation((_connectionId, options) => (options?.verifyHealth === false ? Promise.resolve() : blockedHealthProbe.promise)); + const connectionId = `${dbType}-1`; + mocks.getConnectionConfig.mockReturnValue({ + id: connectionId, + name: dbType, + db_type: dbType, + database: "app", + query_timeout_secs: 30, + }); + mocks.executeMulti.mockResolvedValue( + Array.from({ length: 20 }, (_, statementIndex) => ({ + columns: [], + rows: [], + affected_rows: 1, + execution_time_ms: 1, + statement_index: statementIndex, + })), + ); + const { useQueryStore } = await import("@/stores/queryStore"); + const store = useQueryStore(); + const tabId = store.createTab(connectionId, "app", "Query", "query", "public", sql); + + await store.executeTabSql(tabId, sql, { sourceOffset: 0 }); + + expect(mocks.ensureConnected).toHaveBeenCalledWith(connectionId, { verifyHealth: false }); + expect(mocks.executeMultiWithProgress).toHaveBeenCalledTimes(1); + }); + it("skips a failed statement and continues the original batch without replaying successful statements", async () => { const sqlError = structuredSqlError(); const sql = "INSERT INTO t VALUES (1);\nINSERT INTO t VALUES (1);\nINSERT INTO t VALUES (2);\nINSERT INTO t VALUES (3)"; diff --git a/apps/desktop/src/stores/queryStore.ts b/apps/desktop/src/stores/queryStore.ts index 2925747f4f..1da9a1ec56 100644 --- a/apps/desktop/src/stores/queryStore.ts +++ b/apps/desktop/src/stores/queryStore.ts @@ -6810,7 +6810,11 @@ export const useQueryStore = defineStore("query", () => { queryExecutionLog("info", "ensure-connected:skip", { traceId, elapsed: elapsed(), reason: "mongo-use-only" }); } else { queryExecutionLog("info", "ensure-connected:start", { traceId, elapsed: elapsed() }); - await connStore.ensureConnected(executionConnectionId); + if (conn?.db_type === "oracle" || conn?.db_type === "postgres") { + await connStore.ensureConnected(executionConnectionId, { verifyHealth: false }); + } else { + await connStore.ensureConnected(executionConnectionId); + } queryExecutionLog("info", "ensure-connected:done", { traceId, elapsed: elapsed() }); } conn = connStore.getConfig(executionConnectionId);