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