Annotation of embedaddon/sqlite3/test/incrvacuum2.test, revision 1.1.1.1
1.1 misho 1: # 2007 May 04
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 incremental vacuum feature.
13: #
14: # $Id: incrvacuum2.test,v 1.6 2009/07/25 13:42:50 danielk1977 Exp $
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18:
19: # If this build of the library does not support auto-vacuum, omit this
20: # whole file.
21: ifcapable {!autovacuum || !pragma} {
22: finish_test
23: return
24: }
25:
26: set testprefix incrvacuum2
27:
28: # Create a database in incremental vacuum mode that has many
29: # pages on the freelist.
30: #
31: do_test incrvacuum2-1.1 {
32: execsql {
33: PRAGMA page_size=1024;
34: PRAGMA auto_vacuum=incremental;
35: CREATE TABLE t1(x);
36: INSERT INTO t1 VALUES(zeroblob(30000));
37: DELETE FROM t1;
38: }
39: file size test.db
40: } {32768}
41:
42: # Vacuum off a single page.
43: #
44: do_test incrvacuum2-1.2 {
45: execsql {
46: PRAGMA incremental_vacuum(1);
47: }
48: file size test.db
49: } {31744}
50:
51: # Vacuum off five pages
52: #
53: do_test incrvacuum2-1.3 {
54: execsql {
55: PRAGMA incremental_vacuum(5);
56: }
57: file size test.db
58: } {26624}
59:
60: # Vacuum off all the rest
61: #
62: do_test incrvacuum2-1.4 {
63: execsql {
64: PRAGMA incremental_vacuum(1000);
65: }
66: file size test.db
67: } {3072}
68:
69: # Make sure incremental vacuum works on attached databases.
70: #
71: ifcapable attach {
72: do_test incrvacuum2-2.1 {
73: forcedelete test2.db test2.db-journal
74: execsql {
75: ATTACH DATABASE 'test2.db' AS aux;
76: PRAGMA aux.auto_vacuum=incremental;
77: CREATE TABLE aux.t2(x);
78: INSERT INTO t2 VALUES(zeroblob(30000));
79: INSERT INTO t1 SELECT * FROM t2;
80: DELETE FROM t2;
81: DELETE FROM t1;
82: }
83: list [file size test.db] [file size test2.db]
84: } {32768 32768}
85: do_test incrvacuum2-2.2 {
86: execsql {
87: PRAGMA aux.incremental_vacuum(1)
88: }
89: list [file size test.db] [file size test2.db]
90: } {32768 31744}
91: do_test incrvacuum2-2.3 {
92: execsql {
93: PRAGMA aux.incremental_vacuum(5)
94: }
95: list [file size test.db] [file size test2.db]
96: } {32768 26624}
97: do_test incrvacuum2-2.4 {
98: execsql {
99: PRAGMA main.incremental_vacuum(5)
100: }
101: list [file size test.db] [file size test2.db]
102: } {27648 26624}
103: do_test incrvacuum2-2.5 {
104: execsql {
105: PRAGMA aux.incremental_vacuum
106: }
107: list [file size test.db] [file size test2.db]
108: } {27648 3072}
109: do_test incrvacuum2-2.6 {
110: execsql {
111: PRAGMA incremental_vacuum(1)
112: }
113: list [file size test.db] [file size test2.db]
114: } {26624 3072}
115: }
116:
117: do_test incrvacuum2-3.1 {
118: execsql {
119: PRAGMA auto_vacuum = 'full';
120: BEGIN;
121: CREATE TABLE abc(a);
122: INSERT INTO abc VALUES(randstr(1500,1500));
123: COMMIT;
124: }
125: } {}
126: do_test incrvacuum2-3.2 {
127: execsql {
128: BEGIN;
129: DELETE FROM abc;
130: PRAGMA incremental_vacuum;
131: COMMIT;
132: }
133: } {}
134:
135: integrity_check incrvacuum2-3.3
136:
137: ifcapable wal {
138: # At one point, when a specific page was being extracted from the b-tree
139: # free-list (e.g. during an incremental-vacuum), all trunk pages that
140: # occurred before the specific page in the free-list trunk were being
141: # written to the journal or wal file. This is not necessary. Only the
142: # extracted page and the page that contains the pointer to it need to
143: # be journalled.
144: #
145: # This problem was fixed by [d03d63d77e] (just before 3.7.6 release).
146: #
147: # This test case builds a database containing many free pages. Then runs
148: # "PRAGMA incremental_vacuum(1)" until the db contains zero free pages.
149: # Each "PRAGMA incremental_vacuum(1)" should modify at most 4 pages. The
150: # worst case is when a trunk page is removed from the end of the db file.
151: # In this case pages written are:
152: #
153: # 1. The previous trunk page (that contains a pointer to the recycled
154: # trunk page), and
155: # 2. The leaf page transformed into a trunk page to replace the recycled
156: # page, and
157: # 3. The trunk page that contained a pointer to the leaf page used
158: # in (2), and
159: # 4. Page 1. Page 1 is always updated, even in WAL mode, since it contains
160: # the "number of free-list pages" field.
161: #
162: db close
163: forcedelete test.db
164: sqlite3 db test.db
165:
166: do_execsql_test 4.1 {
167: PRAGMA page_size = 512;
168: PRAGMA auto_vacuum = 2;
169: CREATE TABLE t1(x);
170: INSERT INTO t1 VALUES(randomblob(400));
171: INSERT INTO t1 SELECT * FROM t1; -- 2
172: INSERT INTO t1 SELECT * FROM t1; -- 4
173: INSERT INTO t1 SELECT * FROM t1; -- 8
174: INSERT INTO t1 SELECT * FROM t1; -- 16
175: INSERT INTO t1 SELECT * FROM t1; -- 32
176: INSERT INTO t1 SELECT * FROM t1; -- 128
177: INSERT INTO t1 SELECT * FROM t1; -- 256
178: INSERT INTO t1 SELECT * FROM t1; -- 512
179: INSERT INTO t1 SELECT * FROM t1; -- 1024
180: INSERT INTO t1 SELECT * FROM t1; -- 2048
181: INSERT INTO t1 SELECT * FROM t1; -- 4096
182: INSERT INTO t1 SELECT * FROM t1; -- 8192
183: DELETE FROM t1 WHERE oid>512;
184: DELETE FROM t1;
185: }
186:
187: do_test 4.2 {
188: execsql {
189: PRAGMA journal_mode = WAL;
190: PRAGMA incremental_vacuum(1);
191: PRAGMA wal_checkpoint;
192: }
193: file size test.db-wal
194: } [expr {32+2*(512+24)}]
195:
196: do_test 4.3 {
197: db close
198: sqlite3 db test.db
199: set maxsz 0
200: while {[file size test.db] > [expr 512*3]} {
201: execsql { PRAGMA journal_mode = WAL }
202: execsql { PRAGMA wal_checkpoint }
203: execsql { PRAGMA incremental_vacuum(1) }
204: set newsz [file size test.db-wal]
205: if {$newsz>$maxsz} {set maxsz $newsz}
206: }
207: set maxsz
208: } [expr {32+3*(512+24)}]
209: }
210:
211: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>