replace use of sqlite3StrICmp with public sqlite3_stricmp API
[sqlcipher.git] / ext / rbu / rbuvacuum2.test
blob6d6dfde9b9a823f94dce11512d4c78e120669f0c
1 # 2016 June 1
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
14 # expected.
17 source [file join [file dirname [info script]] rbu_common.tcl]
19 foreach {step} {0 1} {
20 foreach {ttt state} {
21   s state.db t test.db-vacuum n {}
22 } {
23   set ::testprefix rbuvacuum2-$step$ttt
24   
25   #-------------------------------------------------------------------------
26   # Test that a database that contains fts3 tables can be vacuumed.
27   #
28   ifcapable fts3 {
29     reset_db
30     do_execsql_test 1.1 {
31       CREATE VIRTUAL TABLE t1 USING fts3(z, y);
32       INSERT INTO t1 VALUES('fix this issue', 'at some point');
33     }
34   
35     do_rbu_vacuum_test 1.2 $step $state
36   
37     do_execsql_test 1.3 {
38       SELECT * FROM t1;
39     } {{fix this issue} {at some point}}
40   
41     do_execsql_test 1.4 {
42       SELECT rowid FROM t1 WHERE t1 MATCH 'fix';
43     } {1}
45     do_execsql_test 1.5 {
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');
50     }
52     do_rbu_vacuum_test 1.6 $step $state
53     do_execsql_test 1.7 {
54       INSERT INTO t1(t1) VALUES('integrity-check');
55       SELECT * FROM t1;
56     } {
57       {fix this issue} {at some point}
58       {l h i} {d e f}
59       {a b c} {x y z}
60     }
61   }
62   
63   #-------------------------------------------------------------------------
64   # Test that a database that contains fts5 tables can be vacuumed.
65   #
66   ifcapable fts5 {
67     reset_db
68     do_execsql_test 2.1 {
69       CREATE VIRTUAL TABLE t1 USING fts5(z, y);
70       INSERT INTO t1 VALUES('fix this issue', 'at some point');
71     }
72   
73     do_rbu_vacuum_test 2.2 $step $state
74   
75     do_execsql_test 2.3 {
76       SELECT * FROM t1;
77     } {{fix this issue} {at some point}}
78   
79     do_execsql_test 2.4 {
80       SELECT rowid FROM t1 ('fix');
81     } {1}
83     do_execsql_test 2.5 {
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');
88     }
90     do_rbu_vacuum_test 2.6 $step $state
91     do_execsql_test 2.7 {
92       INSERT INTO t1(t1) VALUES('integrity-check');
93       SELECT * FROM t1;
94     } {
95       {fix this issue} {at some point}
96       {l h i} {d e f}
97       {a b c} {x y z}
98     }
99   }
101   #-------------------------------------------------------------------------
102   # Test that a database that contains an rtree table can be vacuumed.
103   #
104   ifcapable rtree {
105     reset_db
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);
111     }
112   
113     do_rbu_vacuum_test 3.2 $step $state
114   
115     do_execsql_test 3.3 {
116       SELECT * FROM rt;
117     } {1 45.0 55.0 2 50.0 60.0 3 55.0 65.0}
118   
119     do_execsql_test 3.4.1 {
120       SELECT rowid FROM rt WHERE x2>51 AND x1 < 51
121     } {1 2}
122     do_execsql_test 3.4.2 {
123       SELECT rowid FROM rt WHERE x2>59 AND x1 < 59
124     } {2 3}
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
130     } {1 2}
131     do_execsql_test 3.6.2 {
132       SELECT rowid FROM rt WHERE x2>59 AND x1 < 59
133     } {2 3}
134   }
136   ifcapable trigger {
137     reset_db
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;
143     }
145     do_execsql_test 4.2 {
146       SELECT * FROM sqlite_master;
147     } {
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}
151     }
153     do_rbu_vacuum_test 4.3 $step $state
154     do_execsql_test 4.4 {
155       SELECT * FROM sqlite_master;
156     } {
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}
160     }
161   }
164   
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.
172 db close
173 if {$::tcl_platform(platform)=="unix"} {
174   forcedelete test.db
176   sqlite3 db test.db
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);
183   }
184   db close
186   foreach {tn perm} {
187     1 00755
188     2 00666
189     3 00644
190     4 00444
191   } {
192     forcedelete test.db-vacuum
194     do_test 5.$tn.1 {
195       file attributes test.db -permissions $perm
196       sqlite3rbu_vacuum rbu test.db
197       rbu step
198     } {SQLITE_OK}
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
202     rbu close
203   }
206 #-------------------------------------------------------------------------
207 # Test the outcome of some other connection running a checkpoint while
208 # the incremental checkpoint is suspended.
210 reset_db
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);
218 forcedelete test.db2
220 do_test 6.1 {
221   sqlite3rbu_vacuum rbu test.db test.db2
222   while {[rbu state]!="checkpoint"} { rbu step }
223   rbu close
224 } {SQLITE_OK}
226 do_execsql_test 6.2 {
227   SELECT 1 FROM sqlite_master LIMIT 1;
228   PRAGMA wal_checkpoint;
229 } {1 0 4 4}
231 do_test 6.3 {
232   sqlite3rbu_vacuum rbu test.db test.db2
233   while {[rbu step]!="SQLITE_DONE"} { rbu step }
234   rbu close
235   execsql { PRAGMA integrity_check }
236 } {ok}
238 do_test 6.4 {
239   sqlite3rbu_vacuum rbu test.db test.db-vactmp
240   list [catch { rbu close } msg] $msg
241 } {1 SQLITE_MISUSE}
243 finish_test