gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/sync2.test (about) 1 # 2017 March 16 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. 12 # 13 # Specificly, it tests that "PRAGMA synchronous" appears to work. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 set testprefix sync2 19 20 # 21 # These tests are only applicable when pager pragma are 22 # enabled. Also, since every test uses an ATTACHed database, they 23 # are only run when ATTACH is enabled. 24 # 25 ifcapable !pager_pragmas||!attach||!dirsync { 26 finish_test 27 return 28 } 29 if {$::tcl_platform(platform)!="unix" 30 || [permutation] == "journaltest" 31 || [permutation] == "inmemory_journal" 32 || [atomic_batch_write test.db] 33 } { 34 finish_test 35 return 36 } 37 38 proc execsql_sync {sql} { 39 set s $::sqlite_sync_count 40 set res [execsql $sql] 41 concat [expr $::sqlite_sync_count-$s] $res 42 } 43 44 proc do_execsql_sync_test {tn sql res} { 45 uplevel [list do_test $tn [list execsql_sync $sql] [list {*}$res]] 46 } 47 48 #----------------------------------------------------------------------- 49 # Tests for journal mode. 50 # 51 sqlite3 db test.db 52 do_execsql_test 1.0 { 53 CREATE TABLE t1(a, b); 54 INSERT INTO t1 VALUES(1, 2); 55 } 56 57 do_execsql_sync_test 1.1 { INSERT INTO t1 VALUES(3, 4) } 4 58 59 # synchronous=normal. So, 1 sync on the directory, 1 on the journal, 1 60 # on the db file. 3 in total. 61 do_execsql_test 1.2.1 { PRAGMA main.synchronous = NORMAL } 62 do_execsql_test 1.2.2 { PRAGMA main.synchronous } 1 63 do_execsql_sync_test 1.2.3 { INSERT INTO t1 VALUES(5, 6) } 3 64 65 # synchronous=off. No syncs. 66 do_execsql_test 1.3.1 { PRAGMA main.synchronous = OFF } 67 do_execsql_test 1.3.2 { PRAGMA main.synchronous } 0 68 do_execsql_sync_test 1.3.3 { INSERT INTO t1 VALUES(7, 8) } 0 69 70 # synchronous=full, journal_mode=delete. So, 1 sync on the directory, 71 # 2 on the journal, 1 on the db file. 4 in total. 72 do_execsql_test 1.4.1 { PRAGMA main.synchronous = FULL } 73 do_execsql_test 1.4.2 { PRAGMA main.synchronous } 2 74 do_execsql_sync_test 1.4.3 { INSERT INTO t1 VALUES(9, 10) } 4 75 76 #----------------------------------------------------------------------- 77 # Tests for wal mode. 78 # 79 do_execsql_test 1.5 { PRAGMA journal_mode = wal } {wal} 80 81 # sync=full, journal_mode=wal. One sync on the directory, two on the 82 # wal file. 83 do_execsql_sync_test 1.6 { INSERT INTO t1 VALUES(11, 12) } 3 84 85 # One sync on the wal file. 86 do_execsql_sync_test 1.7 { INSERT INTO t1 VALUES(13, 14) } 1 87 88 # No syncs. 89 do_execsql_test 1.8.1 { PRAGMA main.synchronous = NORMAL } 90 do_execsql_test 1.8.2 { PRAGMA main.synchronous } 1 91 do_execsql_sync_test 1.8.3 { INSERT INTO t1 VALUES(15, 16) } 0 92 93 # One sync on wal file, one on the db file. 94 do_execsql_sync_test 1.9 { PRAGMA wal_checkpoint } {2 0 3 3} 95 96 # No syncs. 97 do_execsql_test 1.10.1 { PRAGMA main.synchronous = OFF } 98 do_execsql_test 1.10.2 { PRAGMA main.synchronous } 0 99 do_execsql_sync_test 1.10.3 { INSERT INTO t1 VALUES(17, 18) } 0 100 101 #----------------------------------------------------------------------- 102 # Tests for the compile time settings SQLITE_DEFAULT_SYNCHRONOUS and 103 # SQLITE_DEFAULT_WAL_SYNCHRONOUS. These tests only run if the former 104 # is set to "2" and the latter to "1". This is not the default, but 105 # it is currently the recommended configuration. 106 # 107 # https://sqlite.org/compile.html#recommended_compile_time_options 108 # 109 if {$SQLITE_DEFAULT_SYNCHRONOUS==2 && $SQLITE_DEFAULT_WAL_SYNCHRONOUS==1} { 110 111 db close 112 sqlite3 db test.db 113 114 # Wal mode, sync=normal. The first transaction does one sync on directory, 115 # one on the wal file. The second does no syncs. 116 do_execsql_sync_test 1.11.1 { INSERT INTO t1 VALUES(19, 20) } 2 117 do_execsql_sync_test 1.11.2 { INSERT INTO t1 VALUES(21, 22) } 0 118 do_execsql_test 1.11.3 { PRAGMA main.synchronous } 1 119 120 # One sync on wal file, one on the db file. 121 do_execsql_sync_test 1.12 { PRAGMA wal_checkpoint } {2 0 2 2} 122 123 # First transaction syncs the wal file once, the second not at all. 124 # one on the wal file. The second does no syncs. 125 do_execsql_sync_test 1.13.1 { INSERT INTO t1 VALUES(22, 23) } 1 126 do_execsql_sync_test 1.13.2 { INSERT INTO t1 VALUES(24, 25) } 0 127 128 do_execsql_test 1.14 { PRAGMA journal_mode = delete } {delete} 129 130 # Delete mode, sync=full. The first transaction does one sync on 131 # directory, two on the journal file, one on the db. The second does 132 # the same. 133 do_execsql_sync_test 1.15.1 { INSERT INTO t1 VALUES(26, 27) } 4 134 do_execsql_sync_test 1.15.2 { INSERT INTO t1 VALUES(28, 29) } 4 135 do_execsql_test 1.15.3 { PRAGMA main.synchronous } 2 136 137 # Switch back to wal mode. 138 do_execsql_test 1.16 { PRAGMA journal_mode = wal } {wal} 139 140 do_execsql_sync_test 1.17.1 { INSERT INTO t1 VALUES(30, 31) } 2 141 do_execsql_sync_test 1.17.2 { INSERT INTO t1 VALUES(32, 33) } 0 142 do_execsql_test 1.17.3 { PRAGMA main.synchronous } 1 143 144 # Now set synchronous=off, then switch back to delete mode. Check 145 # that the db handle is still using synchronous=off. 146 do_execsql_test 1.18.3 { PRAGMA main.synchronous=off } 147 do_execsql_test 1.18 { PRAGMA journal_mode = delete } {delete} 148 149 do_execsql_sync_test 1.19.1 { INSERT INTO t1 VALUES(34, 35) } 0 150 do_execsql_sync_test 1.19.2 { INSERT INTO t1 VALUES(36, 37) } 0 151 do_execsql_test 1.19.3 { PRAGMA main.synchronous } 0 152 153 # Close and reopen the db. Back to synchronous=normal. 154 db close 155 sqlite3 db test.db 156 do_execsql_sync_test 1.20.1 { INSERT INTO t1 VALUES(38, 39) } 4 157 do_execsql_sync_test 1.20.2 { INSERT INTO t1 VALUES(40, 41) } 4 158 do_execsql_test 1.20.3 { PRAGMA main.synchronous } 2 159 } 160 161 finish_test