OLD | NEW |
(Empty) | |
| 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 |
OLD | NEW |