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