Index: src/attach.c ================================================================== --- src/attach.c +++ src/attach.c @@ -91,14 +91,10 @@ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", db->aLimit[SQLITE_LIMIT_ATTACHED] ); goto attach_error; } - if( !db->autoCommit ){ - zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction"); - goto attach_error; - } for(i=0; inDb; i++){ char *z = db->aDb[i].zDbSName; assert( z && zName ); if( sqlite3StrICmp(z, zName)==0 ){ zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); @@ -286,15 +282,10 @@ } if( i<2 ){ sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); goto detach_error; } - if( !db->autoCommit ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "cannot DETACH database within transaction"); - goto detach_error; - } if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){ sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); goto detach_error; } Index: test/attach2.test ================================================================== --- test/attach2.test +++ test/attach2.test @@ -372,26 +372,21 @@ } } {} do_test attach2-6.2 { catchsql { ATTACH 'test3.db' as aux2; + DETACH aux2; } -} {1 {cannot ATTACH database within transaction}} +} {0 {}} # EVIDENCE-OF: R-59740-55581 This statement will fail if SQLite is in # the middle of a transaction. # do_test attach2-6.3 { catchsql { DETACH aux; } -} {1 {cannot DETACH database within transaction}} -do_test attach2-6.4 { - execsql { - COMMIT; - DETACH aux; - } -} {} +} {0 {}} db close finish_test Index: test/savepoint.test ================================================================== --- test/savepoint.test +++ test/savepoint.test @@ -613,27 +613,32 @@ # savepoints and ATTACH statements. # # First make sure it is not possible to attach or detach a database while # a savepoint is open (it is not possible if any transaction is open). +# +# UPDATE 2017-07-26: It is not possible to ATTACH and DETACH within a +# a transaction. # do_test savepoint-10.1.1 { catchsql { SAVEPOINT one; ATTACH 'test2.db' AS aux; + DETACH aux; } -} {1 {cannot ATTACH database within transaction}} +} {0 {}} do_test savepoint-10.1.2 { execsql { RELEASE one; ATTACH 'test2.db' AS aux; } catchsql { SAVEPOINT one; DETACH aux; + ATTACH 'test2.db' AS aux; } -} {1 {cannot DETACH database within transaction}} +} {0 {}} do_test savepoint-10.1.3 { execsql { RELEASE one; DETACH aux; }