From 0e4eed4e29addbbfa70a959423a9306291aed159 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Sat, 21 Dec 2013 00:58:33 -0500 Subject: [PATCH] fix sqlite rollback-transaction in case of auto-rollback error Merge to release branch. An invalid (needs-rollback?) transaction may correspond to a closed underlying transaction. In that case, don't issue ROLLBACK command. (cherry picked from commit 06aa4770f13a739b31f5ae5c0e1434da05282598) --- racket/collects/db/private/sqlite3/connection.rkt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/racket/collects/db/private/sqlite3/connection.rkt b/racket/collects/db/private/sqlite3/connection.rkt index aba207df4b..bb3fd8efea 100644 --- a/racket/collects/db/private/sqlite3/connection.rkt +++ b/racket/collects/db/private/sqlite3/connection.rkt @@ -302,10 +302,15 @@ (internal-query1 fsym "COMMIT TRANSACTION")])) ((rollback) (cond [savepoint + ;; FIXME: if nested tx is invalid, enclosing tx might be invalid too + ;; (eg, IOERR). Add way to communicate back enclosing tx validity. (internal-query1 fsym (format "ROLLBACK TO SAVEPOINT ~a" savepoint)) (internal-query1 fsym (format "RELEASE SAVEPOINT ~a" savepoint))] + [(read-tx-status) + (internal-query1 fsym "ROLLBACK TRANSACTION")] [else - (internal-query1 fsym "ROLLBACK TRANSACTION")]) + ;; underlying tx already closed due to auto-rollback error + (void)]) ;; remove 'invalid status, if necessary (set-tx-status! fsym (read-tx-status)))) (void))