• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 2005 February 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: vacuum2.test,v 1.10 2009/02/18 20:31:18 drh Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Do not use a codec for tests in this file, as the database file is
20# manipulated directly using tcl scripts (using the [hexio_write] command).
21#
22do_not_use_codec
23
24# If the VACUUM statement is disabled in the current build, skip all
25# the tests in this file.
26#
27ifcapable {!vacuum||!autoinc} {
28  finish_test
29  return
30}
31if $AUTOVACUUM {
32  finish_test
33  return
34}
35
36# Ticket #1121 - make sure vacuum works if all autoincrement tables
37# have been deleted.
38#
39do_test vacuum2-1.1 {
40  execsql {
41    CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
42    DROP TABLE t1;
43    VACUUM;
44  }
45} {}
46
47# Ticket #2518.  Make sure vacuum increments the change counter
48# in the database header.
49#
50do_test vacuum2-2.1 {
51  execsql {
52    CREATE TABLE t1(x);
53    CREATE TABLE t2(y);
54    INSERT INTO t1 VALUES(1);
55  }
56  hexio_get_int [hexio_read test.db 24 4]
57} [expr {[hexio_get_int [hexio_read test.db 24 4]]+3}]
58do_test vacuum2-2.1 {
59  execsql {
60    VACUUM
61  }
62  hexio_get_int [hexio_read test.db 24 4]
63} [expr {[hexio_get_int [hexio_read test.db 24 4]]+1}]
64
65############################################################################
66# Verify that we can use the auto_vacuum pragma to request a new
67# autovacuum setting, do a VACUUM, and the new setting takes effect.
68# Make sure this happens correctly even if there are multiple open
69# connections to the same database file.
70#
71sqlite3 db2 test.db
72set pageSize [db eval {pragma page_size}]
73
74# We are currently not autovacuuming so the database should be 3 pages
75# in size.  1 page for each of sqlite_master, t1, and t2.
76#
77do_test vacuum2-3.1 {
78  execsql {
79    INSERT INTO t1 VALUES('hello');
80    INSERT INTO t2 VALUES('out there');
81  }
82  expr {[file size test.db]/$pageSize}
83} {3}
84set cksum [cksum]
85do_test vacuum2-3.2 {
86  cksum db2
87} $cksum
88
89# Convert the database to an autovacuumed database.
90ifcapable autovacuum {
91  do_test vacuum2-3.3 {
92    execsql {
93      PRAGMA auto_vacuum=FULL;
94      VACUUM;
95    }
96    expr {[file size test.db]/$pageSize}
97  } {4}
98}
99do_test vacuum2-3.4 {
100  cksum db2
101} $cksum
102do_test vacuum2-3.5 {
103  cksum
104} $cksum
105do_test vacuum2-3.6 {
106  execsql {PRAGMA integrity_check} db2
107} {ok}
108do_test vacuum2-3.7 {
109  execsql {PRAGMA integrity_check} db
110} {ok}
111
112# Convert the database back to a non-autovacuumed database.
113do_test vacuum2-3.13 {
114  execsql {
115    PRAGMA auto_vacuum=NONE;
116    VACUUM;
117  }
118  expr {[file size test.db]/$pageSize}
119} {3}
120do_test vacuum2-3.14 {
121  cksum db2
122} $cksum
123do_test vacuum2-3.15 {
124  cksum
125} $cksum
126do_test vacuum2-3.16 {
127  execsql {PRAGMA integrity_check} db2
128} {ok}
129do_test vacuum2-3.17 {
130  execsql {PRAGMA integrity_check} db
131} {ok}
132
133db2 close
134
135ifcapable autovacuum {
136  do_test vacuum2-4.1 {
137    db close
138    file delete -force test.db
139    sqlite3 db test.db
140    execsql {
141      pragma auto_vacuum=1;
142      create table t(a, b);
143      insert into t values(1, 2);
144      insert into t values(1, 2);
145      pragma auto_vacuum=0;
146      vacuum;
147      pragma auto_vacuum;
148    }
149  } {0}
150  do_test vacuum2-4.2 {
151    execsql {
152      pragma auto_vacuum=1;
153      vacuum;
154      pragma auto_vacuum;
155    }
156  } {1}
157  do_test vacuum2-4.3 {
158    execsql {
159      pragma integrity_check
160    }
161  } {ok}
162  do_test vacuum2-4.4 {
163    db close
164    sqlite3 db test.db
165    execsql {
166      pragma auto_vacuum;
167    }
168  } {1}
169  do_test vacuum2-4.5 {  # Ticket #3663
170    execsql {
171      pragma auto_vacuum=2;
172      vacuum;
173      pragma auto_vacuum;
174    }
175  } {2}
176  do_test vacuum2-4.6 {
177    execsql {
178      pragma integrity_check
179    }
180  } {ok}
181  do_test vacuum2-4.7 {
182    db close
183    sqlite3 db test.db
184    execsql {
185      pragma auto_vacuum;
186    }
187  } {2}
188}
189
190
191#-------------------------------------------------------------------------
192# The following block of tests verify the behaviour of the library when
193# a database is VACUUMed when there are one or more unfinalized SQL
194# statements reading the same database using the same db handle.
195#
196db close
197forcedelete test.db
198sqlite3 db test.db
199do_execsql_test vacuum2-5.1 {
200  CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
201  INSERT INTO t1 VALUES(1, randomblob(500));
202  INSERT INTO t1 SELECT a+1, randomblob(500) FROM t1;      -- 2
203  INSERT INTO t1 SELECT a+2, randomblob(500) FROM t1;      -- 4
204  INSERT INTO t1 SELECT a+4, randomblob(500) FROM t1;      -- 8
205  INSERT INTO t1 SELECT a+8, randomblob(500) FROM t1;      -- 16
206} {}
207
208do_test vacuum2-5.2 {
209  list [catch {
210    db eval {SELECT a, b FROM t1} { if {$a == 8} { execsql VACUUM } }
211  } msg] $msg
212} {1 {cannot VACUUM - SQL statements in progress}}
213
214do_test vacuum2-5.3 {
215  list [catch {
216    db eval {SELECT 1, 2, 3} { execsql VACUUM }
217  } msg] $msg
218} {1 {cannot VACUUM - SQL statements in progress}}
219
220do_test vacuum2-5.4 {
221  set res ""
222  set res2 ""
223  db eval {SELECT a, b FROM t1 WHERE a<=10} {
224    if {$a==6} { set res [catchsql VACUUM] }
225    lappend res2 $a
226  }
227  lappend res2 $res
228} {1 2 3 4 5 6 7 8 9 10 {1 {cannot VACUUM - SQL statements in progress}}}
229
230
231finish_test
232