gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/snapshot3.test (about) 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_ERROR_SNAPSHOT} 98 99 finish_test