aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test')
-rw-r--r--libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test359
1 files changed, 359 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test b/libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test
new file mode 100644
index 0000000..bcf204d
--- /dev/null
+++ b/libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test
@@ -0,0 +1,359 @@
1# 2001 September 15
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# This file implements regression tests for SQLite library. The
12# focus of this file is testing the VACUUM statement.
13#
14# $Id: vacuum.test,v 1.38 2006/10/04 11:55:50 drh Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# If the VACUUM statement is disabled in the current build, skip all
20# the tests in this file.
21#
22ifcapable {!vacuum} {
23 finish_test
24 return
25}
26if $AUTOVACUUM {
27 finish_test
28 return
29}
30
31set fcnt 1
32proc cksum {{db db}} {
33 set sql "SELECT name, type, sql FROM sqlite_master ORDER BY name, type"
34 set txt [$db eval $sql]\n
35 set sql "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
36 foreach tbl [$db eval $sql] {
37 append txt [$db eval "SELECT * FROM $tbl"]\n
38 }
39 foreach prag {default_cache_size} {
40 append txt $prag-[$db eval "PRAGMA $prag"]\n
41 }
42 if 0 {
43 global fcnt
44 set fd [open dump$fcnt.txt w]
45 puts -nonewline $fd $txt
46 close $fd
47 incr fcnt
48 }
49 set cksum [string length $txt]-[md5 $txt]
50 # puts $cksum-[file size test.db]
51 return $cksum
52}
53do_test vacuum-1.1 {
54 execsql {
55 BEGIN;
56 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
57 INSERT INTO t1 VALUES(NULL,randstr(10,100),randstr(5,50));
58 INSERT INTO t1 VALUES(123456,randstr(10,100),randstr(5,50));
59 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
60 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
61 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
62 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
63 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
64 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
65 INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1;
66 CREATE INDEX i1 ON t1(b,c);
67 CREATE UNIQUE INDEX i2 ON t1(c,a);
68 CREATE TABLE t2 AS SELECT * FROM t1;
69 COMMIT;
70 DROP TABLE t2;
71 }
72 set ::size1 [file size test.db]
73 set ::cksum [cksum]
74 expr {$::cksum!=""}
75} {1}
76do_test vacuum-1.2 {
77 execsql {
78 VACUUM;
79 }
80 cksum
81} $cksum
82ifcapable vacuum {
83 do_test vacuum-1.3 {
84 expr {[file size test.db]<$::size1}
85 } {1}
86}
87do_test vacuum-1.4 {
88 set sql_script {
89 BEGIN;
90 CREATE TABLE t2 AS SELECT * FROM t1;
91 CREATE TABLE t3 AS SELECT * FROM t1;
92 CREATE VIEW v1 AS SELECT b, c FROM t3;
93 CREATE TRIGGER r1 AFTER DELETE ON t2 BEGIN SELECT 1; END;
94 COMMIT;
95 DROP TABLE t2;
96 }
97 # If the library was compiled to omit view support, comment out the
98 # create view in the script $sql_script before executing it. Similarly,
99 # if triggers are not supported, comment out the trigger definition.
100 ifcapable !view {
101 regsub {CREATE VIEW} $sql_script {-- CREATE VIEW} sql_script
102 }
103 ifcapable !trigger {
104 regsub {CREATE TRIGGER} $sql_script {-- CREATE TRIGGER} sql_script
105 }
106 execsql $sql_script
107 set ::size1 [file size test.db]
108 set ::cksum [cksum]
109 expr {$::cksum!=""}
110} {1}
111do_test vacuum-1.5 {
112 execsql {
113 VACUUM;
114 }
115 cksum
116} $cksum
117
118ifcapable vacuum {
119 do_test vacuum-1.6 {
120 expr {[file size test.db]<$::size1}
121 } {1}
122}
123ifcapable vacuum {
124 do_test vacuum-2.1 {
125 catchsql {
126 BEGIN;
127 VACUUM;
128 COMMIT;
129 }
130 } {1 {cannot VACUUM from within a transaction}}
131 catch {db eval COMMIT}
132}
133do_test vacuum-2.2 {
134 sqlite3 db2 test.db
135 execsql {
136 BEGIN;
137 CREATE TABLE t4 AS SELECT * FROM t1;
138 CREATE TABLE t5 AS SELECT * FROM t1;
139 COMMIT;
140 DROP TABLE t4;
141 DROP TABLE t5;
142 } db2
143 set ::cksum [cksum db2]
144 catchsql {
145 VACUUM
146 }
147} {0 {}}
148do_test vacuum-2.3 {
149 cksum
150} $cksum
151do_test vacuum-2.4 {
152 catch {db2 eval {SELECT count(*) FROM sqlite_master}}
153 cksum db2
154} $cksum
155
156# Make sure the schema cookie is incremented by vacuum.
157#
158do_test vacuum-2.5 {
159 execsql {
160 BEGIN;
161 CREATE TABLE t6 AS SELECT * FROM t1;
162 CREATE TABLE t7 AS SELECT * FROM t1;
163 COMMIT;
164 }
165 sqlite3 db3 test.db
166 execsql {
167 -- The "SELECT * FROM sqlite_master" statement ensures that this test
168 -- works when shared-cache is enabled. If shared-cache is enabled, then
169 -- db3 shares a cache with db2 (but not db - it was opened as
170 -- "./test.db").
171 SELECT * FROM sqlite_master;
172 SELECT * FROM t7 LIMIT 1
173 } db3
174 execsql {
175 VACUUM;
176 }
177 execsql {
178 INSERT INTO t7 VALUES(1234567890,'hello','world');
179 } db3
180 execsql {
181 SELECT * FROM t7 WHERE a=1234567890
182 }
183} {1234567890 hello world}
184integrity_check vacuum-2.6
185do_test vacuum-2.7 {
186 execsql {
187 SELECT * FROM t7 WHERE a=1234567890
188 } db3
189} {1234567890 hello world}
190do_test vacuum-2.8 {
191 execsql {
192 INSERT INTO t7 SELECT * FROM t6;
193 SELECT count(*) FROM t7;
194 }
195} 513
196integrity_check vacuum-2.9
197do_test vacuum-2.10 {
198 execsql {
199 DELETE FROM t7;
200 SELECT count(*) FROM t7;
201 } db3
202} 0
203integrity_check vacuum-2.11
204db3 close
205
206
207# Ticket #427. Make sure VACUUM works when the EMPTY_RESULT_CALLBACKS
208# pragma is turned on.
209#
210do_test vacuum-3.1 {
211 db close
212 db2 close
213 file delete test.db
214 sqlite3 db test.db
215 execsql {
216 PRAGMA empty_result_callbacks=on;
217 VACUUM;
218 }
219} {}
220
221# Ticket #464. Make sure VACUUM works with the sqlite3_prepare() API.
222#
223do_test vacuum-4.1 {
224 db close
225 sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
226 set VM [sqlite3_prepare $DB {VACUUM} -1 TAIL]
227 sqlite3_step $VM
228} {SQLITE_DONE}
229do_test vacuum-4.2 {
230 sqlite3_finalize $VM
231} SQLITE_OK
232
233# Ticket #515. VACUUM after deleting and recreating the table that
234# a view refers to. Omit this test if the library is not view-enabled.
235#
236ifcapable view {
237do_test vacuum-5.1 {
238 db close
239 file delete -force test.db
240 sqlite3 db test.db
241 catchsql {
242 CREATE TABLE Test (TestID int primary key);
243 INSERT INTO Test VALUES (NULL);
244 CREATE VIEW viewTest AS SELECT * FROM Test;
245
246 BEGIN;
247 CREATE TABLE tempTest (TestID int primary key, Test2 int NULL);
248 INSERT INTO tempTest SELECT TestID, 1 FROM Test;
249 DROP TABLE Test;
250 CREATE TABLE Test(TestID int primary key, Test2 int NULL);
251 INSERT INTO Test SELECT * FROM tempTest;
252 DROP TABLE tempTest;
253 COMMIT;
254 VACUUM;
255 }
256} {0 {}}
257do_test vacuum-5.2 {
258 catchsql {
259 VACUUM;
260 }
261} {0 {}}
262} ;# ifcapable view
263
264# Ensure vacuum works with complicated tables names.
265do_test vacuum-6.1 {
266 execsql {
267 CREATE TABLE "abc abc"(a, b, c);
268 INSERT INTO "abc abc" VALUES(1, 2, 3);
269 VACUUM;
270 }
271} {}
272do_test vacuum-6.2 {
273 execsql {
274 select * from "abc abc";
275 }
276} {1 2 3}
277
278# Also ensure that blobs survive a vacuum.
279ifcapable {bloblit} {
280 do_test vacuum-6.3 {
281 execsql {
282 DELETE FROM "abc abc";
283 INSERT INTO "abc abc" VALUES(X'00112233', NULL, NULL);
284 VACUUM;
285 }
286 } {}
287 do_test vacuum-6.4 {
288 execsql {
289 select count(*) from "abc abc" WHERE a = X'00112233';
290 }
291 } {1}
292}
293
294# Check what happens when an in-memory database is vacuumed. The
295# [file delete] command covers us in case the library was compiled
296# without in-memory database support.
297#
298file delete -force :memory:
299do_test vacuum-7.0 {
300 sqlite3 db2 :memory:
301 execsql {
302 CREATE TABLE t1(t);
303 VACUUM;
304 } db2
305} {}
306db2 close
307
308# Ticket #873. VACUUM a database that has ' in its name.
309#
310do_test vacuum-8.1 {
311 file delete -force a'z.db
312 file delete -force a'z.db-journal
313 sqlite3 db2 a'z.db
314 execsql {
315 CREATE TABLE t1(t);
316 VACUUM;
317 } db2
318} {}
319db2 close
320
321# Ticket #1095: Vacuum a table that uses AUTOINCREMENT
322#
323ifcapable {autoinc} {
324 do_test vacuum-9.1 {
325 execsql {
326 DROP TABLE 'abc abc';
327 CREATE TABLE autoinc(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
328 INSERT INTO autoinc(b) VALUES('hi');
329 INSERT INTO autoinc(b) VALUES('there');
330 DELETE FROM autoinc;
331 }
332 set ::cksum [cksum]
333 expr {$::cksum!=""}
334 } {1}
335 do_test vacuum-9.2 {
336 execsql {
337 VACUUM;
338 }
339 cksum
340 } $::cksum
341 do_test vacuum-9.3 {
342 execsql {
343 INSERT INTO autoinc(b) VALUES('one');
344 INSERT INTO autoinc(b) VALUES('two');
345 }
346 set ::cksum [cksum]
347 expr {$::cksum!=""}
348 } {1}
349 do_test vacuum-9.4 {
350 execsql {
351 VACUUM;
352 }
353 cksum
354 } $::cksum
355}
356
357file delete -force {a'z.db}
358
359finish_test