|
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 file delete 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 |