Snapshot of upstream SQLite 3.37.2
[sqlcipher.git] / ext / rbu / rbuexlock.test
blobeddcdc115fc786693a3c685ad6c05fab4c427b64
1 # 2021 November 06
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 #***********************************************************************
13 source [file join [file dirname [info script]] rbu_common.tcl]
14 set ::testprefix rbuexlock
16 db close
17 sqlite3_shutdown
18 sqlite3_config_uri 1
20 # Create a simple RBU database. That expects to write to a table:
22 #   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
24 proc create_rbu {filename} {
25   forcedelete $filename
26   sqlite3 rbu1 $filename  
27   rbu1 eval {
28     CREATE TABLE data_t1(a, b, c, rbu_control);
29     INSERT INTO data_t1 VALUES(10, random(), random(), 0);
30     INSERT INTO data_t1 VALUES(20, random(), random(), 0);
31     INSERT INTO data_t1 VALUES(30, random(), random(), 0);
32     INSERT INTO data_t1 VALUES(40, random(), random(), 0);
33     INSERT INTO data_t1 VALUES(50, random(), random(), 0);
34     INSERT INTO data_t1 VALUES(60, random(), random(), 0);
35     INSERT INTO data_t1 VALUES(70, random(), random(), 0);
36     INSERT INTO data_t1 VALUES(80, random(), random(), 0);
37   }
38   rbu1 close
39   return $filename
42 reset_db
44 do_execsql_test 1.0 {
45   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
46   CREATE INDEX t1b ON t1(b);
47   CREATE INDEX t1c ON t1(c);
48   INSERT INTO t1 VALUES(1, 2, 3);
50 create_rbu rbu1.db
52 do_test 1.1.0 {
53   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
54   rbu step
55 } SQLITE_OK
56 do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
58 do_test 1.2.0 {
59   for {set ii 0} {$ii < 10} {incr ii} {
60     rbu step
61   }
62   rbu step
63 } SQLITE_OK
64 do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
65 do_test 1.2.2 {
66   db eval {PRAGMA journal_mode}
67 } {delete}
69 do_test 1.3.0 {
70   while {[file exists test.db-wal]==0} {
71     rbu step
72   }
73 } {}
74 do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
75 do_test 1.3.2 {
76   db eval {PRAGMA journal_mode}
77 } {delete}
80 do_test 1.4.0 {
81   rbu step
82 } SQLITE_OK
83 do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
84 do_test 1.4.2 {
85   db eval {PRAGMA journal_mode}
86 } {delete}
89 rbu close
91 do_test 1.5.0 {
92   file exists test.db-wal
93 } {1}
94 do_test 1.5.1 {
95   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
96   file exists test.db-wal
97 } 1
98 do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
99 do_test 1.5.2 {
100   db eval {PRAGMA journal_mode}
101 } {delete}
104 do_test 1.6.0 {
105   rbu step
106 } SQLITE_OK
107 do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
108 do_test 1.6.2 {
109   db eval {PRAGMA journal_mode}
110 } {delete}
112 do_test 1.7.0 {
113   while {[rbu step]=="SQLITE_OK"} {}
114   rbu close
115 } SQLITE_DONE
116 do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
117 do_test 1.7.2 {
118   db eval {PRAGMA journal_mode}
119 } {delete}
121 reset_db
122 do_execsql_test 2.0 {
123   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
124   CREATE INDEX t1b ON t1(b);
125   CREATE INDEX t1c ON t1(c);
126   INSERT INTO t1 VALUES(1, 2, 3);
128 create_rbu rbu1.db
130 do_test 2.1.0 {
131   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
132   rbu step
133 } SQLITE_OK
134 do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
136 do_test 2.2.0 {
137   for {set ii 0} {$ii < 10} {incr ii} {
138     rbu step
139   }
140   rbu step
141 } SQLITE_OK
142 do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
144 do_test 2.3.0 {
145   while {[file exists test.db-wal]==0} {
146     rbu step
147   }
148 } {}
149 do_test 2.3.1 {
150   llength [db eval {SELECT * FROM t1}]
151 } {27}
152 do_test 2.3.2 {
153   db eval {PRAGMA journal_mode}
154 } {wal}
156 do_test 2.4.0 {
157   rbu step
158 } SQLITE_OK
159 do_test 2.4.1 {
160   llength [db eval  {SELECT * FROM t1}]
161 } {27}
162 do_test 2.4.2 {
163   db eval {PRAGMA journal_mode}
164 } {wal}
166 rbu close
168 do_test 2.5.0 {
169   db eval {PRAGMA journal_mode}
170 } {wal}
171 do_execsql_test 2.5.1 {
172   DELETE FROM t1;
173 } {}
175 create_rbu rbu1.db
176 do_test 3.1.0 {
177   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
178   rbu step
179 } SQLITE_ERROR
181 do_test 3.1.1 {
182   set rc [catch {rbu close} msg]
183   lappend rc $msg
184 } {1 {SQLITE_ERROR - cannot update wal mode database}}
185 db eval {PRAGMA journal_mode=DELETE}
187 create_rbu rbu1.db
188 do_test 3.2.0 {
189   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
190   rbu step
191 } SQLITE_OK
193 do_test 3.3.1 {
194   set rc [catch {rbu close} msg]
195   lappend rc $msg
196 } {0 SQLITE_OK}
198 db close
199 create_rbu rbu1.db
200 do_test 3.4.0 {
201   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
202   rbu step
203 } SQLITE_OK
204 rbu close
207 finish_test