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 #***********************************************************************
12 # This file contains tests for the RBU module. More specifically, it
13 # contains tests to ensure that the sqlite3rbu_vacuum() API works as
17 source [file join [file dirname [info script]] rbu_common.tcl]
19 foreach {step} {0 1} {
21 s state.db t test.db-vacuum n {}
23 set ::testprefix rbuvacuum2-$step$ttt
25 #-------------------------------------------------------------------------
26 # Test that a database that contains fts3 tables can be vacuumed.
31 CREATE VIRTUAL TABLE t1 USING fts3(z, y);
32 INSERT INTO t1 VALUES('fix this issue', 'at some point');
35 do_rbu_vacuum_test 1.2 $step $state
39 } {{fix this issue} {at some point}}
42 SELECT rowid FROM t1 WHERE t1 MATCH 'fix';
46 INSERT INTO t1 VALUES('a b c', 'd e f');
47 INSERT INTO t1 VALUES('l h i', 'd e f');
48 DELETE FROM t1 WHERE docid = 2;
49 INSERT INTO t1 VALUES('a b c', 'x y z');
52 do_rbu_vacuum_test 1.6 $step $state
54 INSERT INTO t1(t1) VALUES('integrity-check');
57 {fix this issue} {at some point}
63 #-------------------------------------------------------------------------
64 # Test that a database that contains fts5 tables can be vacuumed.
69 CREATE VIRTUAL TABLE t1 USING fts5(z, y);
70 INSERT INTO t1 VALUES('fix this issue', 'at some point');
73 do_rbu_vacuum_test 2.2 $step $state
77 } {{fix this issue} {at some point}}
80 SELECT rowid FROM t1 ('fix');
84 INSERT INTO t1 VALUES('a b c', 'd e f');
85 INSERT INTO t1 VALUES('l h i', 'd e f');
86 DELETE FROM t1 WHERE rowid = 2;
87 INSERT INTO t1 VALUES('a b c', 'x y z');
90 do_rbu_vacuum_test 2.6 $step $state
92 INSERT INTO t1(t1) VALUES('integrity-check');
95 {fix this issue} {at some point}
101 #-------------------------------------------------------------------------
102 # Test that a database that contains an rtree table can be vacuumed.
106 do_execsql_test 3.1 {
107 CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2);
108 INSERT INTO rt VALUES(1, 45, 55);
109 INSERT INTO rt VALUES(2, 50, 60);
110 INSERT INTO rt VALUES(3, 55, 65);
113 do_rbu_vacuum_test 3.2 $step $state
115 do_execsql_test 3.3 {
117 } {1 45.0 55.0 2 50.0 60.0 3 55.0 65.0}
119 do_execsql_test 3.4.1 {
120 SELECT rowid FROM rt WHERE x2>51 AND x1 < 51
122 do_execsql_test 3.4.2 {
123 SELECT rowid FROM rt WHERE x2>59 AND x1 < 59
126 do_rbu_vacuum_test 3.5 $step $state
128 do_execsql_test 3.6.1 {
129 SELECT rowid FROM rt WHERE x2>51 AND x1 < 51
131 do_execsql_test 3.6.2 {
132 SELECT rowid FROM rt WHERE x2>59 AND x1 < 59
138 do_execsql_test 4.1 {
139 CREATE TABLE t1(a, b, c);
140 INSERT INTO t1 VALUES(1, 2, 3);
141 CREATE VIEW v1 AS SELECT * FROM t1;
142 CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END;
145 do_execsql_test 4.2 {
146 SELECT * FROM sqlite_master;
148 table t1 t1 2 {CREATE TABLE t1(a, b, c)}
149 view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t1}
150 trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END}
153 do_rbu_vacuum_test 4.3 $step $state
154 do_execsql_test 4.4 {
155 SELECT * FROM sqlite_master;
157 table t1 t1 2 {CREATE TABLE t1(a, b, c)}
158 view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t1}
159 trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END}
165 #-------------------------------------------------------------------------
166 # Test that passing a NULL value as the second argument to
167 # sqlite3rbu_vacuum() causes it to:
169 # * Use <database>-vacuum as the state db, and
170 # * Set the state db permissions to the same as those on the db file.
173 if {$::tcl_platform(platform)=="unix"} {
177 do_execsql_test 5.0 {
178 CREATE TABLE t1(a, b);
179 INSERT INTO t1 VALUES(1, 2);
180 INSERT INTO t1 VALUES(3, 4);
181 INSERT INTO t1 VALUES(5, 6);
182 INSERT INTO t1 VALUES(7, 8);
192 forcedelete test.db-vacuum
195 file attributes test.db -permissions $perm
196 sqlite3rbu_vacuum rbu test.db
200 do_test 5.$tn.2 { file exists test.db-vacuum } 1
201 do_test 5.$tn.3 { file attributes test.db-vacuum -permissions} $perm
206 #-------------------------------------------------------------------------
207 # Test the outcome of some other connection running a checkpoint while
208 # the incremental checkpoint is suspended.
211 do_execsql_test 6.0 {
212 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
213 CREATE INDEX i1b ON t1(b);
214 CREATE INDEX i1c ON t1(c);
215 INSERT INTO t1 VALUES(1, 2, 3);
216 INSERT INTO t1 VALUES(4, 5, 6);
221 sqlite3rbu_vacuum rbu test.db test.db2
222 while {[rbu state]!="checkpoint"} { rbu step }
226 do_execsql_test 6.2 {
227 SELECT 1 FROM sqlite_master LIMIT 1;
228 PRAGMA wal_checkpoint;
232 sqlite3rbu_vacuum rbu test.db test.db2
233 while {[rbu step]!="SQLITE_DONE"} { rbu step }
235 execsql { PRAGMA integrity_check }
239 sqlite3rbu_vacuum rbu test.db test.db-vactmp
240 list [catch { rbu close } msg] $msg