modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/pragma3.test (about) 1 # 2014-12-19 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 # This file implements tests for PRAGMA data_version command. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 do_not_use_codec 19 20 do_execsql_test pragma3-100 { 21 PRAGMA data_version; 22 } {1} 23 do_execsql_test pragma3-101 { 24 PRAGMA temp.data_version; 25 } {1} 26 27 # Writing to the pragma is a no-op 28 do_execsql_test pragma3-102 { 29 PRAGMA main.data_version=1234; 30 PRAGMA main.data_version; 31 } {1 1} 32 33 # EVIDENCE-OF: R-27726-60934 The "PRAGMA data_version" command provides 34 # an indication that the database file has been modified. 35 # 36 # EVIDENCE-OF: R-47505-58569 The "PRAGMA data_version" value is 37 # unchanged for commits made on the same database connection. 38 # 39 do_execsql_test pragma3-110 { 40 PRAGMA data_version; 41 BEGIN IMMEDIATE; 42 PRAGMA data_version; 43 CREATE TABLE t1(a); 44 INSERT INTO t1 VALUES(100),(200),(300); 45 PRAGMA data_version; 46 COMMIT; 47 SELECT * FROM t1; 48 PRAGMA data_version; 49 } {1 1 1 100 200 300 1} 50 51 sqlite3 db2 test.db 52 do_test pragma3-120 { 53 db2 eval { 54 SELECT * FROM t1; 55 PRAGMA data_version; 56 } 57 } {100 200 300 1} 58 59 do_execsql_test pragma3-130 { 60 PRAGMA data_version; 61 BEGIN IMMEDIATE; 62 PRAGMA data_version; 63 INSERT INTO t1 VALUES(400),(500); 64 PRAGMA data_version; 65 COMMIT; 66 SELECT * FROM t1; 67 PRAGMA data_version; 68 PRAGMA shrink_memory; 69 } {1 1 1 100 200 300 400 500 1} 70 71 # EVIDENCE-OF: R-63005-41812 The integer values returned by two 72 # invocations of "PRAGMA data_version" from the same connection will be 73 # different if changes were committed to the database by any other 74 # connection in the interim. 75 # 76 # Value went from 1 in pragma3-120 to 2 here. 77 # 78 do_test pragma3-140 { 79 db2 eval { 80 SELECT * FROM t1; 81 PRAGMA data_version; 82 BEGIN IMMEDIATE; 83 PRAGMA data_version; 84 UPDATE t1 SET a=a+1; 85 COMMIT; 86 SELECT * FROM t1; 87 PRAGMA data_version; 88 } 89 } {100 200 300 400 500 2 2 101 201 301 401 501 2} 90 do_execsql_test pragma3-150 { 91 SELECT * FROM t1; 92 PRAGMA data_version; 93 } {101 201 301 401 501 2} 94 95 # 96 do_test pragma3-160 { 97 db eval { 98 BEGIN; 99 PRAGMA data_version; 100 UPDATE t1 SET a=555 WHERE a=501; 101 PRAGMA data_version; 102 SELECT * FROM t1 ORDER BY a; 103 PRAGMA data_version; 104 } 105 } {2 2 101 201 301 401 555 2} 106 do_test pragma3-170 { 107 db2 eval { 108 PRAGMA data_version; 109 } 110 } {2} 111 do_test pragma3-180 { 112 db eval { 113 COMMIT; 114 PRAGMA data_version; 115 } 116 } {2} 117 do_test pragma3-190 { 118 db2 eval { 119 PRAGMA data_version; 120 } 121 } {3} 122 123 # EVIDENCE-OF: R-19326-44825 The "PRAGMA data_version" value is a local 124 # property of each database connection and so values returned by two 125 # concurrent invocations of "PRAGMA data_version" on separate database 126 # connections are often different even though the underlying database is 127 # identical. 128 # 129 do_test pragma3-195 { 130 expr {[db eval {PRAGMA data_version}]!=[db2 eval {PRAGMA data_version}]} 131 } {1} 132 133 # EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is 134 # the same for all database connections, including database connections 135 # in separate processes and shared cache database connections. 136 # 137 # The next block checks the behavior for separate processes. 138 # 139 do_test pragma3-200 { 140 db eval {PRAGMA data_version; SELECT * FROM t1;} 141 } {2 101 201 301 401 555} 142 do_test pragma3-201 { 143 set fd [open pragma3.txt wb] 144 puts $fd { 145 sqlite3 db test.db; 146 db eval {DELETE FROM t1 WHERE a>300}; 147 db close; 148 exit; 149 } 150 close $fd 151 exec [info nameofexec] pragma3.txt 152 forcedelete pragma3.txt 153 db eval { 154 PRAGMA data_version; 155 SELECT * FROM t1; 156 } 157 } {3 101 201} 158 db2 close 159 db close 160 161 # EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is 162 # the same for all database connections, including database connections 163 # in separate processes and shared cache database connections. 164 # 165 # The next block checks that behavior is the same for shared-cache. 166 # 167 ifcapable shared_cache { 168 set ::enable_shared_cache [sqlite3_enable_shared_cache 1] 169 sqlite3 db test.db 170 sqlite3 db2 test.db 171 do_test pragma3-300 { 172 db eval { 173 PRAGMA data_version; 174 BEGIN; 175 CREATE TABLE t3(a,b,c); 176 CREATE TABLE t4(x,y,z); 177 INSERT INTO t4 VALUES(123,456,789); 178 PRAGMA data_version; 179 COMMIT; 180 PRAGMA data_version; 181 } 182 } {1 1 1} 183 do_test pragma3-310 { 184 db2 eval { 185 PRAGMA data_version; 186 BEGIN; 187 INSERT INTO t3(a,b,c) VALUES('abc','def','ghi'); 188 SELECT * FROM t3; 189 PRAGMA data_version; 190 } 191 } {2 abc def ghi 2} 192 # The transaction in db2 has not yet committed, so the data_version in 193 # db is unchanged. 194 do_test pragma3-320 { 195 db eval { 196 PRAGMA data_version; 197 SELECT * FROM t4; 198 } 199 } {1 123 456 789} 200 do_test pragma3-330 { 201 db2 eval { 202 COMMIT; 203 PRAGMA data_version; 204 SELECT * FROM t4; 205 } 206 } {2 123 456 789} 207 do_test pragma3-340 { 208 db eval { 209 PRAGMA data_version; 210 SELECT * FROM t3; 211 SELECT * FROM t4; 212 } 213 } {2 abc def ghi 123 456 789} 214 db2 close 215 db close 216 sqlite3_enable_shared_cache $::enable_shared_cache 217 } 218 219 # Make sure this also works in WAL mode 220 # 221 # This will not work with the in-memory journal permutation, as opening 222 # [db2] switches the journal mode back to "memory" 223 # 224 if {[wal_is_capable]} { 225 if {[permutation]!="inmemory_journal"} { 226 227 sqlite3 db test.db 228 db eval {PRAGMA journal_mode=WAL} 229 sqlite3 db2 test.db 230 do_test pragma3-400 { 231 db eval { 232 PRAGMA data_version; 233 PRAGMA journal_mode; 234 SELECT * FROM t1; 235 } 236 } {2 wal 101 201} 237 do_test pragma3-410 { 238 db2 eval { 239 PRAGMA data_version; 240 PRAGMA journal_mode; 241 SELECT * FROM t1; 242 } 243 } {2 wal 101 201} 244 do_test pragma3-420 { 245 db eval {UPDATE t1 SET a=111*(a/100); PRAGMA data_version; SELECT * FROM t1} 246 } {2 111 222} 247 do_test pragma3-430 { 248 db2 eval {PRAGMA data_version; SELECT * FROM t1;} 249 } {3 111 222} 250 db2 close 251 } 252 } 253 254 finish_test