OLD | NEW |
| (Empty) |
1 # 2007 March 19 | |
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 changing the database page size using a | |
13 # VACUUM statement. | |
14 # | |
15 # $Id: vacuum3.test,v 1.9 2008/08/26 21:07:27 drh Exp $ | |
16 | |
17 set testdir [file dirname $argv0] | |
18 source $testdir/tester.tcl | |
19 | |
20 # If the VACUUM statement is disabled in the current build, skip all | |
21 # the tests in this file. | |
22 # | |
23 ifcapable !vacuum { | |
24 finish_test | |
25 return | |
26 } | |
27 | |
28 | |
29 #------------------------------------------------------------------- | |
30 # Test cases vacuum3-1.* convert a simple 2-page database between a | |
31 # few different page sizes. | |
32 # | |
33 do_test vacuum3-1.1 { | |
34 execsql { | |
35 PRAGMA auto_vacuum=OFF; | |
36 PRAGMA page_size = 1024; | |
37 CREATE TABLE t1(a, b, c); | |
38 INSERT INTO t1 VALUES(1, 2, 3); | |
39 } | |
40 } {} | |
41 do_test vacuum3-1.2 { | |
42 execsql { PRAGMA page_size } | |
43 } {1024} | |
44 do_test vacuum3-1.3 { | |
45 file size test.db | |
46 } {2048} | |
47 | |
48 set I 4 | |
49 foreach {request actual database} [list \ | |
50 2048 2048 4096 \ | |
51 1024 1024 2048 \ | |
52 1170 1024 2048 \ | |
53 256 1024 2048 \ | |
54 512 512 1024 \ | |
55 4096 4096 8192 \ | |
56 1024 1024 2048 \ | |
57 ] { | |
58 do_test vacuum3-1.$I.1 { | |
59 execsql " | |
60 PRAGMA page_size = $request; | |
61 VACUUM; | |
62 " | |
63 execsql { PRAGMA page_size } | |
64 } $actual | |
65 do_test vacuum3-1.$I.2 { | |
66 file size test.db | |
67 } $database | |
68 do_test vacuum3-1.$I.3 { | |
69 execsql { SELECT * FROM t1 } | |
70 } {1 2 3} | |
71 integrity_check vacuum3-1.$I.4 | |
72 | |
73 incr I | |
74 } | |
75 | |
76 #------------------------------------------------------------------- | |
77 # Test cases vacuum3-2.* convert a simple 3-page database between a | |
78 # few different page sizes. | |
79 # | |
80 do_test vacuum3-2.1 { | |
81 execsql { | |
82 PRAGMA page_size = 1024; | |
83 VACUUM; | |
84 ALTER TABLE t1 ADD COLUMN d; | |
85 UPDATE t1 SET d = randomblob(1000); | |
86 } | |
87 file size test.db | |
88 } {3072} | |
89 do_test vacuum3-2.2 { | |
90 execsql { PRAGMA page_size } | |
91 } {1024} | |
92 do_test vacuum3-2.3 { | |
93 set blob [db one {select d from t1}] | |
94 string length $blob | |
95 } {1000} | |
96 | |
97 set I 4 | |
98 foreach {request actual database} [list \ | |
99 2048 2048 4096 \ | |
100 1024 1024 3072 \ | |
101 1170 1024 3072 \ | |
102 256 1024 3072 \ | |
103 512 512 2048 \ | |
104 4096 4096 8192 \ | |
105 1024 1024 3072 \ | |
106 ] { | |
107 do_test vacuum3-2.$I.1 { | |
108 execsql " | |
109 PRAGMA page_size = $request; | |
110 VACUUM; | |
111 " | |
112 execsql { PRAGMA page_size } | |
113 } $actual | |
114 do_test vacuum3-2.$I.2 { | |
115 file size test.db | |
116 } $database | |
117 do_test vacuum3-2.$I.3 { | |
118 execsql { SELECT * FROM t1 } | |
119 } [list 1 2 3 $blob] | |
120 integrity_check vacuum3-1.$I.4 | |
121 | |
122 incr I | |
123 } | |
124 | |
125 #------------------------------------------------------------------- | |
126 # Test cases vacuum3-3.* converts a database large enough to include | |
127 # the locking page (in a test environment) between few different | |
128 # page sizes. | |
129 # | |
130 proc signature {} { | |
131 return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}] | |
132 } | |
133 do_test vacuum3-3.1 { | |
134 execsql " | |
135 PRAGMA page_size = 1024; | |
136 BEGIN; | |
137 CREATE TABLE abc(a PRIMARY KEY, b, c); | |
138 INSERT INTO abc VALUES(randomblob(100), randomblob(200), randomblob(1000)); | |
139 INSERT INTO abc | |
140 SELECT randomblob(1000), randomblob(200), randomblob(100) | |
141 FROM abc; | |
142 INSERT INTO abc | |
143 SELECT randomblob(100), randomblob(200), randomblob(1000) | |
144 FROM abc; | |
145 INSERT INTO abc | |
146 SELECT randomblob(100), randomblob(200), randomblob(1000) | |
147 FROM abc; | |
148 INSERT INTO abc | |
149 SELECT randomblob(100), randomblob(200), randomblob(1000) | |
150 FROM abc; | |
151 INSERT INTO abc | |
152 SELECT randomblob(100), randomblob(200), randomblob(1000) | |
153 FROM abc; | |
154 INSERT INTO abc | |
155 SELECT randomblob(25), randomblob(45), randomblob(9456) | |
156 FROM abc; | |
157 INSERT INTO abc | |
158 SELECT randomblob(100), randomblob(200), randomblob(1000) | |
159 FROM abc; | |
160 INSERT INTO abc | |
161 SELECT randomblob(25), randomblob(45), randomblob(9456) | |
162 FROM abc; | |
163 COMMIT; | |
164 " | |
165 } {} | |
166 do_test vacuum3-3.2 { | |
167 execsql { PRAGMA page_size } | |
168 } {1024} | |
169 | |
170 set ::sig [signature] | |
171 | |
172 set I 3 | |
173 foreach {request actual} [list \ | |
174 2048 2048 \ | |
175 1024 1024 \ | |
176 1170 1024 \ | |
177 256 1024 \ | |
178 512 512 \ | |
179 4096 4096 \ | |
180 1024 1024 \ | |
181 ] { | |
182 do_test vacuum3-3.$I.1 { | |
183 execsql " | |
184 PRAGMA page_size = $request; | |
185 VACUUM; | |
186 " | |
187 execsql { PRAGMA page_size } | |
188 } $actual | |
189 do_test vacuum3-3.$I.2 { | |
190 signature | |
191 } $::sig | |
192 integrity_check vacuum3-3.$I.3 | |
193 | |
194 incr I | |
195 } | |
196 | |
197 do_test vacuum3-4.1 { | |
198 db close | |
199 delete_file test.db | |
200 sqlite3 db test.db | |
201 execsql { | |
202 PRAGMA page_size=1024; | |
203 CREATE TABLE abc(a, b, c); | |
204 INSERT INTO abc VALUES(1, 2, 3); | |
205 INSERT INTO abc VALUES(4, 5, 6); | |
206 } | |
207 execsql { SELECT * FROM abc } | |
208 } {1 2 3 4 5 6} | |
209 do_test vacuum3-4.2 { | |
210 sqlite3 db2 test.db | |
211 execsql { SELECT * FROM abc } db2 | |
212 } {1 2 3 4 5 6} | |
213 do_test vacuum3-4.3 { | |
214 execsql { | |
215 PRAGMA page_size = 2048; | |
216 VACUUM; | |
217 } | |
218 execsql { SELECT * FROM abc } | |
219 } {1 2 3 4 5 6} | |
220 do_test vacuum3-4.4 { | |
221 execsql { SELECT * FROM abc } db2 | |
222 } {1 2 3 4 5 6} | |
223 do_test vacuum3-4.5 { | |
224 execsql { | |
225 PRAGMA page_size=16384; | |
226 VACUUM; | |
227 } db2 | |
228 execsql { SELECT * FROM abc } db2 | |
229 } {1 2 3 4 5 6} | |
230 do_test vacuum3-4.6 { | |
231 execsql { | |
232 PRAGMA page_size=1024; | |
233 VACUUM; | |
234 } | |
235 execsql { SELECT * FROM abc } db2 | |
236 } {1 2 3 4 5 6} | |
237 | |
238 # Unable to change the page-size of an in-memory using vacuum. | |
239 db2 close | |
240 sqlite3 db2 :memory: | |
241 do_test vacuum3-5.1 { | |
242 db2 eval { | |
243 CREATE TABLE t1(x); | |
244 INSERT INTO t1 VALUES(1234); | |
245 PRAGMA page_size=4096; | |
246 VACUUM; | |
247 SELECT * FROM t1; | |
248 } | |
249 } {1234} | |
250 do_test vacuum3-5.2 { | |
251 db2 eval { | |
252 PRAGMA page_size | |
253 } | |
254 } {1024} | |
255 | |
256 set create_database_sql { | |
257 BEGIN; | |
258 CREATE TABLE t1(a, b, c); | |
259 INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50)); | |
260 INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1; | |
261 INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1; | |
262 INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1; | |
263 INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1; | |
264 INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1; | |
265 INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1; | |
266 INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1; | |
267 INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600)); | |
268 CREATE TABLE t2 AS SELECT * FROM t1; | |
269 CREATE TABLE t3 AS SELECT * FROM t1; | |
270 COMMIT; | |
271 DROP TABLE t2; | |
272 } | |
273 | |
274 do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep " | |
275 PRAGMA page_size = 1024; | |
276 $create_database_sql | |
277 " -sqlbody { | |
278 PRAGMA page_size = 4096; | |
279 VACUUM; | |
280 } | |
281 do_ioerr_test vacuum3-ioerr-2 -cksum true -sqlprep " | |
282 PRAGMA page_size = 2048; | |
283 $create_database_sql | |
284 " -sqlbody { | |
285 PRAGMA page_size = 512; | |
286 VACUUM; | |
287 } | |
288 | |
289 ifcapable autovacuum { | |
290 do_ioerr_test vacuum3-ioerr-3 -cksum true -sqlprep " | |
291 PRAGMA auto_vacuum = 0; | |
292 $create_database_sql | |
293 " -sqlbody { | |
294 PRAGMA auto_vacuum = 1; | |
295 VACUUM; | |
296 } | |
297 do_ioerr_test vacuum3-ioerr-4 -cksum true -sqlprep " | |
298 PRAGMA auto_vacuum = 1; | |
299 $create_database_sql | |
300 " -sqlbody { | |
301 PRAGMA auto_vacuum = 0; | |
302 VACUUM; | |
303 } | |
304 } | |
305 | |
306 source $testdir/malloc_common.tcl | |
307 if {$MEMDEBUG} { | |
308 do_malloc_test vacuum3-malloc-1 -sqlprep { | |
309 PRAGMA page_size = 2048; | |
310 BEGIN; | |
311 CREATE TABLE t1(a, b, c); | |
312 INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50)); | |
313 INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1; | |
314 INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1; | |
315 INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1; | |
316 INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1; | |
317 INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1; | |
318 INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1; | |
319 INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1; | |
320 INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600)); | |
321 CREATE TABLE t2 AS SELECT * FROM t1; | |
322 CREATE TABLE t3 AS SELECT * FROM t1; | |
323 COMMIT; | |
324 DROP TABLE t2; | |
325 } -sqlbody { | |
326 PRAGMA page_size = 512; | |
327 VACUUM; | |
328 } | |
329 do_malloc_test vacuum3-malloc-2 -sqlprep { | |
330 PRAGMA encoding=UTF16; | |
331 CREATE TABLE t1(a, b, c); | |
332 INSERT INTO t1 VALUES(1, 2, 3); | |
333 CREATE TABLE t2(x,y,z); | |
334 INSERT INTO t2 SELECT * FROM t1; | |
335 } -sqlbody { | |
336 VACUUM; | |
337 } | |
338 } | |
339 | |
340 finish_test | |
OLD | NEW |