diff --git a/manifest b/manifest index 941aad31d5..21e91551c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Try\sto\sidentify\sthe\splaces\sin\sWAL\scode\swhere\sthread-safety\sdepends\son\sthe\nunderlying\sarchitecture\ssupporting\satomic\sload\sand\sstore\sof\saligned\s32-bit\nvalues. -D 2018-08-30T20:28:18.073 +C If\sa\scall\sto\ssqlite3_snapshot_open()\sfails\sbecause\sthe\srequested\ssnapshot\sno\nlonger\sexists,\sreturn\sSQLITE_ERROR_SNAPSHOT\sinstead\sof\sSQLITE_BUSY_SNAPSHOT. +D 2018-08-31T19:00:16.739 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d06f463c5b623a61ac27f5cb8214fca9e53a6704d34d6b8f2124e2b1b293c88f @@ -464,7 +464,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c723716f0de7aa0a679300f7d3541c89645f4a9882161cecdb3093fc07f8cc4b F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c 6aae5739198d96c51ae6eb97c4a5b1744c22ed7a5a565a5399a717780d48a36b -F src/main.c 187011ff7a091ff4b8bea9481a42789c0fa094715b4e5d89352fb63377673490 +F src/main.c 1f54ee71990bfbf4cdc2dc79bdc33e7c4f54eef6922447b4c910f9b5885a4478 F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -502,7 +502,7 @@ F src/resolve.c 797088662ed61102485e3070ba3b3f7828bd5ef6a588223ba6865d77d52f6cea F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c ae7396a314cc1bb1d767947cd57094e3a9ffcbb155ebc1b1c391e028c44a9a04 F src/shell.c.in 6e0aad854be738a5d0368940459399be211e9ac43aebe92bb9ed46cfe38d0e1f -F src/sqlite.h.in 5a2d431493020c2c9f2f37c9119d6439444e3c44a714566a5192b6911ac917e6 +F src/sqlite.h.in cdf2a539cd0570322a94bcb97c01c56feb1be0657ec7cfb8273c89d19fff87a9 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7 F src/sqliteInt.h 26e48f0c823844fcce67bd2a11ad1ad3468aaed32fd8864bc69c4147cb608728 @@ -582,7 +582,7 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 678992ac8ec677a3f9b08126aaf891441083805e3b42574e3654d44538381c14 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c f58ff398f7dba6d6129f27b9a52fc00b46a36d0fea5368706b6d088dde801313 +F src/wal.c df50883d93689d009be5ad9bdc4e53a4ee45fcc291087ec9272569d00b360791 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c ba7225773931760cf60bf22f34d0cce2588df7ce5ce0f215a52eb88234b55ac4 F src/where.c 155809967fbab889374dedf970ea6561b8fb519fcb165d6ba00776552ecc5cde @@ -1271,12 +1271,12 @@ F test/skipscan2.test ef143c6e4a5ba4f19c1d1e3f517811f7942bdf2142736cc568feb34e0b F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 -F test/snapshot.test fef12fc5c16ff21c4748509401cfba7d9a3d91156f1bfe23fb881d3bfc65ddfe -F test/snapshot2.test 925e42427e923262db63c9d7155183f889e3e99feaedec4075f659e51608344f -F test/snapshot3.test 9719443594a04778861bd20d12596c5f880af177d6cd62f111da3198cafc6096 +F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 +F test/snapshot2.test 4fc84a0121e882d6980333bf14dfc1143dfb94f5afbb909c084977a945b45beb +F test/snapshot3.test d6ec952e437e5c06a293d0f5ec1be1b45771d46d93bccfb3818ca2617dcb11e7 F test/snapshot4.test 0f7e6bd6f1370d112ee820c541d0dd0e7b8ab4ea77429e65106d81c9ad2185a6 F test/snapshot_fault.test 52c5e97ebd218846a8ae2da4d147d3e77d71f963 -F test/snapshot_up.test b778a04561a67b8bfde828f473a8d31dbde23e3f648e36237e0369421e08f23c +F test/snapshot_up.test 93fec2d847ec12e3bae0f6486da2abc965a606e099e4e870454045f5f56f71ba F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b @@ -1758,7 +1758,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ff4dc08298ab3988e69fe60802657791f65d2af15f4b1cbd1d02649bc597d0d6 -R 8b1c21076160b5400497f5a8fe9f34ce -U drh -Z 66336bd926abce6891acc1782fdb9867 +P 47d44be4a68d377d0049a12b2587dbbcc0870b469473e1098f7c0358fe8c7532 +R 8019365693265d8430d24b1290c280cd +U dan +Z bf99ed6d8dec4f787bbe304a5e0c353c diff --git a/manifest.uuid b/manifest.uuid index 7e0941b00f..8c5645c4e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47d44be4a68d377d0049a12b2587dbbcc0870b469473e1098f7c0358fe8c7532 \ No newline at end of file +e07923128bb164efbafde29d49175b61f2ef44b2dfac5ae4ed61937945dfcf4c \ No newline at end of file diff --git a/src/main.c b/src/main.c index b39328d230..fb7ca37c1e 100644 --- a/src/main.c +++ b/src/main.c @@ -1329,6 +1329,7 @@ const char *sqlite3ErrName(int rc){ switch( rc ){ case SQLITE_OK: zName = "SQLITE_OK"; break; case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; + case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break; case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; case SQLITE_PERM: zName = "SQLITE_PERM"; break; case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9a611fa00a..6a7c4f7e03 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -472,6 +472,7 @@ int sqlite3_exec( */ #define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) #define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) +#define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8)) #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) @@ -9053,11 +9054,11 @@ SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( ** ** ^A call to sqlite3_snapshot_open() will fail to open if the specified ** snapshot has been overwritten by a [checkpoint]. In this case -** SQLITE_BUSY_SNAPSHOT is returned. +** SQLITE_ERROR_SNAPSHOT is returned. ** ** If there is already a read transaction open when this function is ** invoked, then the same read transaction remains open (on the same -** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT +** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT ** is returned. If another error code - for example SQLITE_PROTOCOL or an ** SQLITE_IOERR error code - is returned, then the final state of the ** read transaction is undefined. If SQLITE_OK is returned, then the diff --git a/src/wal.c b/src/wal.c index 326e25d339..8c32f3ea10 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2795,7 +2795,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ /* Check that the wal file has not been wrapped. Assuming that it has ** not, also check that no checkpointer has attempted to checkpoint any ** frames beyond pSnapshot->mxFrame. If either of these conditions are - ** true, return SQLITE_BUSY_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr ** with *pSnapshot and set *pChanged as appropriate for opening the ** snapshot. */ if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) @@ -2805,7 +2805,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); *pChanged = bChanged; }else{ - rc = SQLITE_BUSY_SNAPSHOT; + rc = SQLITE_ERROR_SNAPSHOT; } /* Release the shared CKPT lock obtained above. */ @@ -3802,7 +3802,7 @@ int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){ if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) || pNew->mxFramenBackfillAttempted ){ - rc = SQLITE_BUSY_SNAPSHOT; + rc = SQLITE_ERROR_SNAPSHOT; walUnlockShared(pWal, WAL_CKPT_LOCK); } } diff --git a/test/snapshot.test b/test/snapshot.test index 10400523da..75a8af214a 100644 --- a/test/snapshot.test +++ b/test/snapshot.test @@ -258,7 +258,7 @@ foreach {tn tcl} { } {} #------------------------------------------------------------------------- - # Check that SQLITE_BUSY_SNAPSHOT is returned if the specified snapshot + # Check that SQLITE_ERROR_SNAPSHOT is returned if the specified snapshot # no longer exists because the wal file has been checkpointed. # # 1. Reading a snapshot from the middle of a wal file is not possible @@ -296,7 +296,7 @@ foreach {tn tcl} { BEGIN; } list [catch {snapshot_open db main $snapshot} msg] $msg - } {1 SQLITE_BUSY_SNAPSHOT} + } {1 SQLITE_ERROR_SNAPSHOT} do_test $tn.4.1.4 { snapshot_free $snapshot execsql COMMIT @@ -327,7 +327,7 @@ foreach {tn tcl} { BEGIN; } list [catch {snapshot_open db main $snapshot} msg] $msg - } {1 SQLITE_BUSY_SNAPSHOT} + } {1 SQLITE_ERROR_SNAPSHOT} do_test $tn.4.2.4 { snapshot_free $snapshot } {} diff --git a/test/snapshot2.test b/test/snapshot2.test index 3faabd7f4c..0f0e63961f 100644 --- a/test/snapshot2.test +++ b/test/snapshot2.test @@ -110,7 +110,7 @@ do_test 2.2 { execsql {SELECT * FROM sqlite_master} execsql BEGIN list [catch { sqlite3_snapshot_open_blob db main $snap } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} do_test 2.3 { execsql COMMIT @@ -134,7 +134,7 @@ do_test 2.5 { sqlite3_snapshot_recover db main execsql BEGIN list [catch { sqlite3_snapshot_open_blob db main $snap } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} #------------------------------------------------------------------------- # Check that calling sqlite3_snapshot_recover() does not confuse the @@ -234,7 +234,7 @@ do_test 5.4 { execsql { INSERT INTO t2 VALUES('jkl') } execsql BEGIN db2 list [catch { sqlite3_snapshot_open_blob db2 main $snap } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} finish_test diff --git a/test/snapshot3.test b/test/snapshot3.test index 266f43dfd4..8c330d7cbf 100644 --- a/test/snapshot3.test +++ b/test/snapshot3.test @@ -94,7 +94,7 @@ do_test 1.7 { do_test 1.8 { execsql BEGIN db3 list [catch { sqlite3_snapshot_open_blob db3 main $snap } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} finish_test diff --git a/test/snapshot_up.test b/test/snapshot_up.test index f7c2e443cf..651a92ac64 100644 --- a/test/snapshot_up.test +++ b/test/snapshot_up.test @@ -75,7 +75,7 @@ do_execsql_test 1.6 { do_test 1.7 { list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} do_execsql_test 1.8 { SELECT * FROM t1 @@ -84,7 +84,7 @@ do_execsql_test 1.8 { do_test 1.9 { execsql { COMMIT ; BEGIN } list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} do_test 1.10 { execsql { COMMIT } @@ -113,7 +113,7 @@ do_test 1.12 { do_test 1.13 { list [catch { sqlite3_snapshot_open db main $::snap3 } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} do_test 1.14 { execsql { SELECT * FROM t1 } } {4 5 6 7 8 9 10 11 12 13 14 15} @@ -127,7 +127,7 @@ do_execsql_test 1.15 { } {7 8 9 10 11 12 13 14 15} do_test 1.16 { list [catch { sqlite3_snapshot_open db main $::snap4 } msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} +} {1 SQLITE_ERROR_SNAPSHOT} do_execsql_test 1.17 { COMMIT } sqlite3_snapshot_free $::snap1