@@ -52,9 +52,28 @@ extension MainContentCoordinator {
5252 try await driver. beginTransaction ( )
5353
5454 for (stmtIndex, sql) in statements. enumerated ( ) {
55- guard !Task. isCancelled else { break }
55+ guard !Task. isCancelled else {
56+ try ? await driver. rollbackTransaction ( )
57+ await MainActor . run { [ weak self] in
58+ guard let self else { return }
59+ if let idx = tabManager. tabs. firstIndex ( where: { $0. id == tabId } ) {
60+ tabManager. tabs [ idx] . isExecuting = false
61+ }
62+ currentQueryTask = nil
63+ toolbarState. setExecuting ( false )
64+ }
65+ return
66+ }
5667 guard capturedGeneration == queryGeneration else {
5768 try ? await driver. rollbackTransaction ( )
69+ await MainActor . run { [ weak self] in
70+ guard let self else { return }
71+ if let idx = tabManager. tabs. firstIndex ( where: { $0. id == tabId } ) {
72+ tabManager. tabs [ idx] . isExecuting = false
73+ }
74+ currentQueryTask = nil
75+ toolbarState. setExecuting ( false )
76+ }
5877 return
5978 }
6079
@@ -123,7 +142,19 @@ extension MainContentCoordinator {
123142 try ? await driver. rollbackTransaction ( )
124143 }
125144
126- guard capturedGeneration == queryGeneration else { return }
145+ // Always reset isExecuting even if generation is stale —
146+ // skipping this leaves the tab permanently stuck in "executing" state.
147+ if capturedGeneration != queryGeneration {
148+ await MainActor . run { [ weak self] in
149+ guard let self else { return }
150+ if let idx = tabManager. tabs. firstIndex ( where: { $0. id == tabId } ) {
151+ tabManager. tabs [ idx] . isExecuting = false
152+ }
153+ currentQueryTask = nil
154+ toolbarState. setExecuting ( false )
155+ }
156+ return
157+ }
127158
128159 let failedStmtIndex = executedCount + 1
129160 let contextMsg = " Statement \( failedStmtIndex) / \( totalCount) failed: "
@@ -189,7 +220,13 @@ extension MainContentCoordinator {
189220 toolbarState. setExecuting ( false )
190221 toolbarState. lastQueryDuration = cumulativeTime
191222
192- guard capturedGeneration == queryGeneration else { return }
223+ // Always reset isExecuting even if generation is stale
224+ if capturedGeneration != queryGeneration {
225+ if let idx = tabManager. tabs. firstIndex ( where: { $0. id == tabId } ) {
226+ tabManager. tabs [ idx] . isExecuting = false
227+ }
228+ return
229+ }
193230 guard let idx = tabManager. tabs. firstIndex ( where: { $0. id == tabId } ) else {
194231 return
195232 }
0 commit comments