xref: /sqlite-3.40.0/ext/rbu/rbuexlock.test (revision 64d5b1ca)
1# 2021 November 06
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#
12
13source [file join [file dirname [info script]] rbu_common.tcl]
14set ::testprefix rbuexlock
15
16db close
17sqlite3_shutdown
18sqlite3_config_uri 1
19
20# Create a simple RBU database. That expects to write to a table:
21#
22#   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
23#
24proc 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
40}
41
42reset_db
43
44do_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);
49}
50create_rbu rbu1.db
51
52do_test 1.1.0 {
53  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
54  rbu step
55} SQLITE_OK
56do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
57
58do_test 1.2.0 {
59  for {set ii 0} {$ii < 10} {incr ii} {
60    rbu step
61  }
62  rbu step
63} SQLITE_OK
64do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
65do_test 1.2.2 {
66  db eval {PRAGMA journal_mode}
67} {delete}
68
69do_test 1.3.0 {
70  while {[file exists test.db-wal]==0} {
71    rbu step
72  }
73} {}
74do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
75do_test 1.3.2 {
76  db eval {PRAGMA journal_mode}
77} {delete}
78
79
80do_test 1.4.0 {
81  rbu step
82} SQLITE_OK
83do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
84do_test 1.4.2 {
85  db eval {PRAGMA journal_mode}
86} {delete}
87
88
89rbu close
90
91do_test 1.5.0 {
92  file exists test.db-wal
93} {1}
94do_test 1.5.1 {
95  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
96  file exists test.db-wal
97} 1
98do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
99do_test 1.5.2 {
100  db eval {PRAGMA journal_mode}
101} {delete}
102
103
104do_test 1.6.0 {
105  rbu step
106} SQLITE_OK
107do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
108do_test 1.6.2 {
109  db eval {PRAGMA journal_mode}
110} {delete}
111
112do_test 1.7.0 {
113  while {[rbu step]=="SQLITE_OK"} {}
114  rbu close
115} SQLITE_DONE
116do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
117do_test 1.7.2 {
118  db eval {PRAGMA journal_mode}
119} {delete}
120
121reset_db
122do_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);
127}
128create_rbu rbu1.db
129
130do_test 2.1.0 {
131  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
132  rbu step
133} SQLITE_OK
134do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
135
136do_test 2.2.0 {
137  for {set ii 0} {$ii < 10} {incr ii} {
138    rbu step
139  }
140  rbu step
141} SQLITE_OK
142do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
143
144do_test 2.3.0 {
145  while {[file exists test.db-wal]==0} {
146    rbu step
147  }
148} {}
149do_test 2.3.1 {
150  llength [db eval {SELECT * FROM t1}]
151} {27}
152do_test 2.3.2 {
153  db eval {PRAGMA journal_mode}
154} {wal}
155
156do_test 2.4.0 {
157  rbu step
158} SQLITE_OK
159do_test 2.4.1 {
160  llength [db eval  {SELECT * FROM t1}]
161} {27}
162do_test 2.4.2 {
163  db eval {PRAGMA journal_mode}
164} {wal}
165
166rbu close
167
168do_test 2.5.0 {
169  db eval {PRAGMA journal_mode}
170} {wal}
171do_execsql_test 2.5.1 {
172  DELETE FROM t1;
173} {}
174
175create_rbu rbu1.db
176do_test 3.1.0 {
177  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
178  rbu step
179} SQLITE_ERROR
180
181do_test 3.1.1 {
182  set rc [catch {rbu close} msg]
183  lappend rc $msg
184} {1 {SQLITE_ERROR - cannot update wal mode database}}
185db eval {PRAGMA journal_mode=DELETE}
186
187create_rbu rbu1.db
188do_test 3.2.0 {
189  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
190  rbu step
191} SQLITE_OK
192
193do_test 3.3.1 {
194  set rc [catch {rbu close} msg]
195  lappend rc $msg
196} {0 SQLITE_OK}
197
198db close
199create_rbu rbu1.db
200do_test 3.4.0 {
201  sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
202  rbu step
203} SQLITE_OK
204rbu close
205
206
207finish_test
208