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 15set testdir [file dirname $argv0] 16source $testdir/tester.tcl 17ifcapable !snapshot {finish_test; return} 18set 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. 24if {[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# 35do_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 44do_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 55do_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 61do_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 70set sz [file size test.db-wal] 71do_test 1.3 { 72 execsql { PRAGMA wal_checkpoint = truncate } 73 file size test.db-wal 74} $sz 75 76do_test 1.4 { 77 execsql BEGIN db3 78 list [catch { sqlite3_snapshot_open_blob db3 main $snap } msg] $msg 79} {0 {}} 80 81do_test 1.5 { 82 db3 eval { SELECT * FROM t1; END } 83} {1 2 3 4} 84 85do_test 1.6 { 86 db2 eval { SELECT * FROM t1; END } 87} {1 2 3 4} 88 89do_test 1.7 { 90 execsql { PRAGMA wal_checkpoint = truncate } 91 file size test.db-wal 92} 0 93 94do_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 99finish_test 100