adjust test for new attach behavior introduced in upstream check-in a02da71f
[sqlcipher.git] / ext / rbu / rbuexlock.test
blob27fd6c4ba2f298cad7e64ad49ce38501ef1fcdd3
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 if_no_rbu_support { finish_test ; return }
15 set ::testprefix rbuexlock
17 db close
19 set journalmode delete
20 if {[permutation]=="inmemory_journal"} {
21   set journalmode memory
24 # Create a simple RBU database. That expects to write to a table:
26 #   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
28 proc create_rbu {filename} {
29   forcedelete $filename
30   sqlite3 rbu1 $filename  
31   rbu1 eval {
32     CREATE TABLE data_t1(a, b, c, rbu_control);
33     INSERT INTO data_t1 VALUES(10, random(), random(), 0);
34     INSERT INTO data_t1 VALUES(20, random(), random(), 0);
35     INSERT INTO data_t1 VALUES(30, random(), random(), 0);
36     INSERT INTO data_t1 VALUES(40, random(), random(), 0);
37     INSERT INTO data_t1 VALUES(50, random(), random(), 0);
38     INSERT INTO data_t1 VALUES(60, random(), random(), 0);
39     INSERT INTO data_t1 VALUES(70, random(), random(), 0);
40     INSERT INTO data_t1 VALUES(80, random(), random(), 0);
41   }
42   rbu1 close
43   return $filename
46 reset_db
48 do_execsql_test 1.0 {
49   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
50   CREATE INDEX t1b ON t1(b);
51   CREATE INDEX t1c ON t1(c);
52   INSERT INTO t1 VALUES(1, 2, 3);
54 create_rbu rbu1.db
56 do_test 1.1.0 {
57   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
58   rbu step
59 } SQLITE_OK
60 do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
62 do_test 1.2.0 {
63   for {set ii 0} {$ii < 10} {incr ii} {
64     rbu step
65   }
66   rbu step
67 } SQLITE_OK
68 do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
69 do_test 1.2.2 {
70   db eval {PRAGMA journal_mode}
71 } $journalmode
73 do_test 1.3.0 {
74   while {[file exists test.db-wal]==0} {
75     rbu step
76   }
77 } {}
78 do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
79 do_test 1.3.2 {
80   db eval {PRAGMA journal_mode}
81 } $journalmode
84 do_test 1.4.0 {
85   rbu step
86 } SQLITE_OK
87 do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
88 do_test 1.4.2 {
89   db eval {PRAGMA journal_mode}
90 } $journalmode
93 rbu close
95 do_test 1.5.0 {
96   file exists test.db-wal
97 } {1}
98 do_test 1.5.1 {
99   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
100   file exists test.db-wal
101 } 1
102 do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
103 do_test 1.5.2 {
104   db eval {PRAGMA journal_mode}
105 } $journalmode
108 do_test 1.6.0 {
109   rbu step
110 } SQLITE_OK
111 do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
112 do_test 1.6.2 {
113   db eval {PRAGMA journal_mode}
114 } $journalmode
116 do_test 1.7.0 {
117   while {[rbu step]=="SQLITE_OK"} {}
118   rbu close
119 } SQLITE_DONE
120 do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
121 do_test 1.7.2 {
122   db eval {PRAGMA journal_mode}
123 } $journalmode
125 reset_db
126 do_execsql_test 2.0 {
127   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
128   CREATE INDEX t1b ON t1(b);
129   CREATE INDEX t1c ON t1(c);
130   INSERT INTO t1 VALUES(1, 2, 3);
132 create_rbu rbu1.db
134 do_test 2.1.0 {
135   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
136   rbu step
137 } SQLITE_OK
138 do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
140 do_test 2.2.0 {
141   for {set ii 0} {$ii < 10} {incr ii} {
142     rbu step
143   }
144   rbu step
145 } SQLITE_OK
146 do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
148 do_test 2.3.0 {
149   while {[file exists test.db-wal]==0} {
150     rbu step
151   }
152 } {}
153 do_test 2.3.1 {
154   llength [db eval {SELECT * FROM t1}]
155 } {27}
156 do_test 2.3.2 {
157   db eval {PRAGMA journal_mode}
158 } {wal}
160 do_test 2.4.0 {
161   rbu step
162 } SQLITE_OK
163 do_test 2.4.1 {
164   llength [db eval  {SELECT * FROM t1}]
165 } {27}
166 do_test 2.4.2 {
167   db eval {PRAGMA journal_mode}
168 } {wal}
170 rbu close
172 do_test 2.5.0 {
173   db eval {PRAGMA journal_mode}
174 } {wal}
175 do_execsql_test 2.5.1 {
176   DELETE FROM t1;
177 } {}
179 create_rbu rbu1.db
180 do_test 3.1.0 {
181   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
182   rbu step
183 } SQLITE_ERROR
185 do_test 3.1.1 {
186   set rc [catch {rbu close} msg]
187   lappend rc $msg
188 } {1 {SQLITE_ERROR - cannot update wal mode database}}
189 db eval {PRAGMA journal_mode=DELETE}
191 create_rbu rbu1.db
192 do_test 3.2.0 {
193   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
194   rbu step
195 } SQLITE_OK
197 do_test 3.3.1 {
198   set rc [catch {rbu close} msg]
199   lappend rc $msg
200 } {0 SQLITE_OK}
202 db close
203 create_rbu rbu1.db
204 do_test 3.4.0 {
205   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
206   rbu step
207 } SQLITE_OK
208 rbu close
211 finish_test