]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If a call to sqlite3_snapshot_open() fails because the requested snapshot no
authordan <dan@noemail.net>
Fri, 31 Aug 2018 19:00:16 +0000 (19:00 +0000)
committerdan <dan@noemail.net>
Fri, 31 Aug 2018 19:00:16 +0000 (19:00 +0000)
longer exists, return SQLITE_ERROR_SNAPSHOT instead of SQLITE_BUSY_SNAPSHOT.

FossilOrigin-Name: e07923128bb164efbafde29d49175b61f2ef44b2dfac5ae4ed61937945dfcf4c

manifest
manifest.uuid
src/main.c
src/sqlite.h.in
src/wal.c
test/snapshot.test
test/snapshot2.test
test/snapshot3.test
test/snapshot_up.test

index 941aad31d57dbbaa16389266b8ef14665c8d3c68..21e91551c3e21ae8b6f4189df5428f0464cb62a1 100644 (file)
--- 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
index 7e0941b00ffb9abcfcfb0555d1bfd9a3a1dca06f..8c5645c4e75ee75b0545bf8c9f1aa4dae4b82fab 100644 (file)
@@ -1 +1 @@
-47d44be4a68d377d0049a12b2587dbbcc0870b469473e1098f7c0358fe8c7532
\ No newline at end of file
+e07923128bb164efbafde29d49175b61f2ef44b2dfac5ae4ed61937945dfcf4c
\ No newline at end of file
index b39328d2306ca2ec6b25e4624f3fb78defd8a1e5..fb7ca37c1e1b84d33c24fea9a1e3a1a75264d62e 100644 (file)
@@ -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;
index 9a611fa00a1624acaa41132bbedb06b5765feac5..6a7c4f7e030858eefe9cd820c338acaf1deba4f8 100644 (file)
@@ -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 
index 326e25d33932be40e6ad4613d5b30854cf8f4fec..8c32f3ea10da9505e0811d89f37303e293baa9af 100644 (file)
--- 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->mxFrame<walCkptInfo(pWal)->nBackfillAttempted
     ){
-      rc = SQLITE_BUSY_SNAPSHOT;
+      rc = SQLITE_ERROR_SNAPSHOT;
       walUnlockShared(pWal, WAL_CKPT_LOCK);
     }
   }
index 10400523dabdbe305563c567098394035483d0b8..75a8af214a587b7b0277730b613872921b30f145 100644 (file)
@@ -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
   } {}
index 3faabd7f4c2a28f78d36c54b6591e242bac942ee..0f0e63961fb251ed0ea9478d730c8de0c4088253 100644 (file)
@@ -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
index 266f43dfd4acd635c034d189876f4d48b4b51372..8c330d7cbfd9f6688573e42af187b06265f0739d 100644 (file)
@@ -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
 
index f7c2e443cf5964a0b4c4c4d36092f1ef8f59e7df..651a92ac64bc9e5c446a1c4c8bbcada6401eb4c5 100644 (file)
@@ -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