Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch snapshots-lock-wal Excluding Merge-Ins
This is equivalent to a diff from 2c03d8b8f0 to d71eeaab9e
2017-11-28
| ||
13:39 | Lock the wal file for all snapshot transactions, even if they would not otherwise require this, preventing checkpointers and writers from wrapping the wal file. This means that if one connection has an open snapshot transaction it is guaranteed that a second connection can open a transaction on the same snapshot. (check-in: b81a31495b user: dan tags: trunk) | |
2017-09-25
| ||
09:37 | Add an extra snapshot related test case. (check-in: 24a95e1437 user: dan tags: trunk) | |
2017-09-23
| ||
07:46 | Experimental change so that snapshot transactions always lock the wal file - preventing writers or truncate-checkpointers from wrapping it. (Closed-Leaf check-in: d71eeaab9e user: dan tags: snapshots-lock-wal) | |
2017-09-22
| ||
20:18 | Merge in all the trunk enhancements of the previous 7 months. The LIKE optimization has stopped working when there is an ESCAPE - that problem will be addressed in a subsequent check-in. (Leaf check-in: 8d2a1cca61 user: drh tags: est_count_pragma) | |
16:23 | Use the updated Win32 VFS semantics for winOpen from check-in [5d03c738e9] for WinRT, et al, as well. (check-in: 2c03d8b8f0 user: mistachkin tags: trunk) | |
12:52 | Partial backout of check-in [e0af9a904076]. It turns out we do need some extra space at the end of the record blob as an overrun area to use when decoding a maliciously malformed record. (check-in: 403b88a894 user: drh tags: trunk) | |
Changes to src/wal.c.
2246 2246 return rc; 2247 2247 } 2248 2248 } 2249 2249 2250 2250 pInfo = walCkptInfo(pWal); 2251 2251 if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame 2252 2252 #ifdef SQLITE_ENABLE_SNAPSHOT 2253 - && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0 2254 - || 0==memcmp(&pWal->hdr, pWal->pSnapshot, sizeof(WalIndexHdr))) 2253 + && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) 2255 2254 #endif 2256 2255 ){ 2257 2256 /* The WAL has been completely backfilled (or it is empty). 2258 2257 ** and can be safely ignored. 2259 2258 */ 2260 2259 rc = walLockShared(pWal, WAL_READ_LOCK(0)); 2261 2260 walShmBarrier(pWal);
Added test/snapshot3.test.
1 +# 2016 September 23 2 +# 3 +# The author disclaims copyright to this source code. In place of 4 +# a legal notice, here is a blessing: 5 +# 6 +# May you do good and not evil. 7 +# May you find forgiveness for yourself and forgive others. 8 +# May you share freely, never taking more than you give. 9 +# 10 +#*********************************************************************** 11 +# This file implements regression tests for SQLite library. The focus 12 +# of this file is the sqlite3_snapshot_xxx() APIs. 13 +# 14 + 15 +set testdir [file dirname $argv0] 16 +source $testdir/tester.tcl 17 +ifcapable !snapshot {finish_test; return} 18 +set testprefix snapshot3 19 + 20 +# This test does not work with the inmemory_journal permutation. The reason 21 +# is that each connection opened as part of this permutation executes 22 +# "PRAGMA journal_mode=memory", which fails if the database is in wal mode 23 +# and there are one or more existing connections. 24 +if {[permutation]=="inmemory_journal"} { 25 + finish_test 26 + return 27 +} 28 + 29 +#------------------------------------------------------------------------- 30 +# This block of tests verifies that it is not possible to wrap the wal 31 +# file - using a writer or a "PRAGMA wal_checkpoint = TRUNCATE" - while 32 +# there is an open snapshot transaction (transaction opened using 33 +# sqlite3_snapshot_open()). 34 +# 35 +do_execsql_test 1.0 { 36 + CREATE TABLE t1(y); 37 + PRAGMA journal_mode = wal; 38 + INSERT INTO t1 VALUES(1); 39 + INSERT INTO t1 VALUES(2); 40 + INSERT INTO t1 VALUES(3); 41 + INSERT INTO t1 VALUES(4); 42 +} {wal} 43 + 44 +do_test 1.1 { 45 + sqlite3 db2 test.db 46 + sqlite3 db3 test.db 47 + 48 + execsql {SELECT * FROM sqlite_master} db2 49 + execsql {SELECT * FROM sqlite_master} db3 50 + 51 + db2 trans { set snap [sqlite3_snapshot_get_blob db2 main] } 52 + db2 eval { SELECT * FROM t1 } 53 +} {1 2 3 4} 54 + 55 +do_test 1.2 { 56 + execsql BEGIN db2 57 + sqlite3_snapshot_open_blob db2 main $snap 58 + db2 eval { SELECT * FROM t1 } 59 +} {1 2 3 4} 60 + 61 +do_test 1.2 { 62 + execsql END db2 63 + execsql { PRAGMA wal_checkpoint } 64 + 65 + execsql BEGIN db2 66 + sqlite3_snapshot_open_blob db2 main $snap 67 + db2 eval { SELECT * FROM t1 } 68 +} {1 2 3 4} 69 + 70 +set sz [file size test.db-wal] 71 +do_test 1.3 { 72 + execsql { PRAGMA wal_checkpoint = truncate } 73 + file size test.db-wal 74 +} $sz 75 + 76 +do_test 1.4 { 77 + execsql BEGIN db3 78 + list [catch { sqlite3_snapshot_open_blob db3 main $snap } msg] $msg 79 +} {0 {}} 80 + 81 +do_test 1.5 { 82 + db3 eval { SELECT * FROM t1; END } 83 +} {1 2 3 4} 84 + 85 +do_test 1.6 { 86 + db2 eval { SELECT * FROM t1; END } 87 +} {1 2 3 4} 88 + 89 +do_test 1.7 { 90 + execsql { PRAGMA wal_checkpoint = truncate } 91 + file size test.db-wal 92 +} 0 93 + 94 +do_test 1.8 { 95 + execsql BEGIN db3 96 + list [catch { sqlite3_snapshot_open_blob db3 main $snap } msg] $msg 97 +} {1 SQLITE_BUSY_SNAPSHOT} 98 + 99 +finish_test 100 +