xref: /sqlite-3.40.0/test/vacuum3.test (revision 11e29677)
13a2c8c8bSdanielk1977# 2007 March 19
23a2c8c8bSdanielk1977#
33a2c8c8bSdanielk1977# The author disclaims copyright to this source code.  In place of
43a2c8c8bSdanielk1977# a legal notice, here is a blessing:
53a2c8c8bSdanielk1977#
63a2c8c8bSdanielk1977#    May you do good and not evil.
73a2c8c8bSdanielk1977#    May you find forgiveness for yourself and forgive others.
83a2c8c8bSdanielk1977#    May you share freely, never taking more than you give.
93a2c8c8bSdanielk1977#
103a2c8c8bSdanielk1977#***********************************************************************
113a2c8c8bSdanielk1977# This file implements regression tests for SQLite library.  The
123a2c8c8bSdanielk1977# focus of this file is changing the database page size using a
133a2c8c8bSdanielk1977# VACUUM statement.
143a2c8c8bSdanielk1977#
157426f864Sdrh# $Id: vacuum3.test,v 1.9 2008/08/26 21:07:27 drh Exp $
163a2c8c8bSdanielk1977
173a2c8c8bSdanielk1977set testdir [file dirname $argv0]
183a2c8c8bSdanielk1977source $testdir/tester.tcl
193a2c8c8bSdanielk1977
203a2c8c8bSdanielk1977# If the VACUUM statement is disabled in the current build, skip all
213a2c8c8bSdanielk1977# the tests in this file.
223a2c8c8bSdanielk1977#
233a2c8c8bSdanielk1977ifcapable !vacuum {
243a2c8c8bSdanielk1977  finish_test
253a2c8c8bSdanielk1977  return
263a2c8c8bSdanielk1977}
273a2c8c8bSdanielk1977
283a2c8c8bSdanielk1977
293a2c8c8bSdanielk1977#-------------------------------------------------------------------
303a2c8c8bSdanielk1977# Test cases vacuum3-1.* convert a simple 2-page database between a
313a2c8c8bSdanielk1977# few different page sizes.
323a2c8c8bSdanielk1977#
333a2c8c8bSdanielk1977do_test vacuum3-1.1 {
343a2c8c8bSdanielk1977  execsql {
3510b20ef1Sdrh    PRAGMA auto_vacuum=OFF;
363a2c8c8bSdanielk1977    PRAGMA page_size = 1024;
373a2c8c8bSdanielk1977    CREATE TABLE t1(a, b, c);
383a2c8c8bSdanielk1977    INSERT INTO t1 VALUES(1, 2, 3);
393a2c8c8bSdanielk1977  }
403a2c8c8bSdanielk1977} {}
413a2c8c8bSdanielk1977do_test vacuum3-1.2 {
423a2c8c8bSdanielk1977  execsql { PRAGMA page_size }
433a2c8c8bSdanielk1977} {1024}
443a2c8c8bSdanielk1977do_test vacuum3-1.3 {
453a2c8c8bSdanielk1977  file size test.db
463a2c8c8bSdanielk1977} {2048}
473a2c8c8bSdanielk1977
483a2c8c8bSdanielk1977set I 4
493a2c8c8bSdanielk1977foreach {request actual database} [list \
503a2c8c8bSdanielk1977  2048 2048 4096                        \
513a2c8c8bSdanielk1977  1024 1024 2048                        \
523a2c8c8bSdanielk1977  1170 1024 2048                        \
533a2c8c8bSdanielk1977  256  1024 2048                        \
543a2c8c8bSdanielk1977  512  512  1024                        \
553a2c8c8bSdanielk1977  4096 4096 8192                        \
563a2c8c8bSdanielk1977  1024 1024 2048                        \
573a2c8c8bSdanielk1977] {
583a2c8c8bSdanielk1977  do_test vacuum3-1.$I.1 {
593a2c8c8bSdanielk1977    execsql "
603a2c8c8bSdanielk1977      PRAGMA page_size = $request;
613a2c8c8bSdanielk1977      VACUUM;
623a2c8c8bSdanielk1977    "
633a2c8c8bSdanielk1977    execsql { PRAGMA page_size }
643a2c8c8bSdanielk1977  } $actual
653a2c8c8bSdanielk1977  do_test vacuum3-1.$I.2 {
663a2c8c8bSdanielk1977    file size test.db
673a2c8c8bSdanielk1977  } $database
683a2c8c8bSdanielk1977  do_test vacuum3-1.$I.3 {
693a2c8c8bSdanielk1977    execsql { SELECT * FROM t1 }
703a2c8c8bSdanielk1977  } {1 2 3}
713a2c8c8bSdanielk1977  integrity_check vacuum3-1.$I.4
723a2c8c8bSdanielk1977
733a2c8c8bSdanielk1977  incr I
743a2c8c8bSdanielk1977}
753a2c8c8bSdanielk1977
763a2c8c8bSdanielk1977#-------------------------------------------------------------------
773a2c8c8bSdanielk1977# Test cases vacuum3-2.* convert a simple 3-page database between a
783a2c8c8bSdanielk1977# few different page sizes.
793a2c8c8bSdanielk1977#
803a2c8c8bSdanielk1977do_test vacuum3-2.1 {
813a2c8c8bSdanielk1977  execsql {
823a2c8c8bSdanielk1977    PRAGMA page_size = 1024;
833a2c8c8bSdanielk1977    VACUUM;
84*11e29677Sdan  }
85*11e29677Sdan  ifcapable altertable {
86*11e29677Sdan    execsql { ALTER TABLE t1 ADD COLUMN d; }
87*11e29677Sdan  } else {
88*11e29677Sdan    execsql {
89*11e29677Sdan      DROP TABLE t1;
90*11e29677Sdan      CREATE TABLE t1(a, b, c, d);
91*11e29677Sdan      INSERT INTO t1 VALUES(1, 2, 3, NULL);
92*11e29677Sdan    }
93*11e29677Sdan  }
94*11e29677Sdan  execsql {
953a2c8c8bSdanielk1977    UPDATE t1 SET d = randomblob(1000);
963a2c8c8bSdanielk1977  }
973a2c8c8bSdanielk1977  file size test.db
983a2c8c8bSdanielk1977} {3072}
993a2c8c8bSdanielk1977do_test vacuum3-2.2 {
1003a2c8c8bSdanielk1977  execsql { PRAGMA page_size }
1013a2c8c8bSdanielk1977} {1024}
1023a2c8c8bSdanielk1977do_test vacuum3-2.3 {
1033a2c8c8bSdanielk1977  set blob [db one {select d from t1}]
1043a2c8c8bSdanielk1977  string length $blob
1053a2c8c8bSdanielk1977} {1000}
1063a2c8c8bSdanielk1977
1073a2c8c8bSdanielk1977set I 4
1083a2c8c8bSdanielk1977foreach {request actual database} [list \
1093a2c8c8bSdanielk1977  2048 2048 4096                        \
1103a2c8c8bSdanielk1977  1024 1024 3072                        \
1113a2c8c8bSdanielk1977  1170 1024 3072                        \
1123a2c8c8bSdanielk1977  256  1024 3072                        \
1133a2c8c8bSdanielk1977  512  512  2048                        \
1143a2c8c8bSdanielk1977  4096 4096 8192                        \
1153a2c8c8bSdanielk1977  1024 1024 3072                        \
1163a2c8c8bSdanielk1977] {
1173a2c8c8bSdanielk1977  do_test vacuum3-2.$I.1 {
1183a2c8c8bSdanielk1977    execsql "
1193a2c8c8bSdanielk1977      PRAGMA page_size = $request;
1203a2c8c8bSdanielk1977      VACUUM;
1213a2c8c8bSdanielk1977    "
1223a2c8c8bSdanielk1977    execsql { PRAGMA page_size }
1233a2c8c8bSdanielk1977  } $actual
1243a2c8c8bSdanielk1977  do_test vacuum3-2.$I.2 {
1253a2c8c8bSdanielk1977    file size test.db
1263a2c8c8bSdanielk1977  } $database
1273a2c8c8bSdanielk1977  do_test vacuum3-2.$I.3 {
1283a2c8c8bSdanielk1977    execsql { SELECT * FROM t1 }
1293a2c8c8bSdanielk1977  } [list 1 2 3 $blob]
1303a2c8c8bSdanielk1977  integrity_check vacuum3-1.$I.4
1313a2c8c8bSdanielk1977
1323a2c8c8bSdanielk1977  incr I
1333a2c8c8bSdanielk1977}
1343a2c8c8bSdanielk1977
1353a2c8c8bSdanielk1977#-------------------------------------------------------------------
1363a2c8c8bSdanielk1977# Test cases vacuum3-3.* converts a database large enough to include
1373a2c8c8bSdanielk1977# the locking page (in a test environment) between few different
1383a2c8c8bSdanielk1977# page sizes.
1393a2c8c8bSdanielk1977#
1403a2c8c8bSdanielk1977proc signature {} {
1413a2c8c8bSdanielk1977  return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}]
1423a2c8c8bSdanielk1977}
1433a2c8c8bSdanielk1977do_test vacuum3-3.1 {
1443a2c8c8bSdanielk1977  execsql "
1453a2c8c8bSdanielk1977    PRAGMA page_size = 1024;
1463a2c8c8bSdanielk1977    BEGIN;
1473a2c8c8bSdanielk1977    CREATE TABLE abc(a PRIMARY KEY, b, c);
1483a2c8c8bSdanielk1977    INSERT INTO abc VALUES(randomblob(100), randomblob(200), randomblob(1000));
1493a2c8c8bSdanielk1977    INSERT INTO abc
1503a2c8c8bSdanielk1977        SELECT randomblob(1000), randomblob(200), randomblob(100)
1513a2c8c8bSdanielk1977        FROM abc;
1523a2c8c8bSdanielk1977    INSERT INTO abc
1533a2c8c8bSdanielk1977        SELECT randomblob(100), randomblob(200), randomblob(1000)
1543a2c8c8bSdanielk1977        FROM abc;
1553a2c8c8bSdanielk1977    INSERT INTO abc
1563a2c8c8bSdanielk1977        SELECT randomblob(100), randomblob(200), randomblob(1000)
1573a2c8c8bSdanielk1977        FROM abc;
1583a2c8c8bSdanielk1977    INSERT INTO abc
1593a2c8c8bSdanielk1977        SELECT randomblob(100), randomblob(200), randomblob(1000)
1603a2c8c8bSdanielk1977        FROM abc;
1613a2c8c8bSdanielk1977    INSERT INTO abc
1623a2c8c8bSdanielk1977        SELECT randomblob(100), randomblob(200), randomblob(1000)
1633a2c8c8bSdanielk1977        FROM abc;
1643a2c8c8bSdanielk1977    INSERT INTO abc
1653a2c8c8bSdanielk1977        SELECT randomblob(25), randomblob(45), randomblob(9456)
1663a2c8c8bSdanielk1977        FROM abc;
1673a2c8c8bSdanielk1977    INSERT INTO abc
1683a2c8c8bSdanielk1977        SELECT randomblob(100), randomblob(200), randomblob(1000)
1693a2c8c8bSdanielk1977        FROM abc;
1703a2c8c8bSdanielk1977    INSERT INTO abc
1713a2c8c8bSdanielk1977        SELECT randomblob(25), randomblob(45), randomblob(9456)
1723a2c8c8bSdanielk1977        FROM abc;
1733a2c8c8bSdanielk1977    COMMIT;
1743a2c8c8bSdanielk1977  "
1753a2c8c8bSdanielk1977} {}
1763a2c8c8bSdanielk1977do_test vacuum3-3.2 {
1773a2c8c8bSdanielk1977  execsql { PRAGMA page_size }
1783a2c8c8bSdanielk1977} {1024}
1793a2c8c8bSdanielk1977
1803a2c8c8bSdanielk1977set ::sig [signature]
1813a2c8c8bSdanielk1977
1823a2c8c8bSdanielk1977set I 3
1833a2c8c8bSdanielk1977foreach {request actual} [list \
1843a2c8c8bSdanielk1977  2048 2048                    \
1853a2c8c8bSdanielk1977  1024 1024                    \
1863a2c8c8bSdanielk1977  1170 1024                    \
1873a2c8c8bSdanielk1977  256  1024                    \
1883a2c8c8bSdanielk1977  512  512                     \
1893a2c8c8bSdanielk1977  4096 4096                    \
1903a2c8c8bSdanielk1977  1024 1024                    \
1913a2c8c8bSdanielk1977] {
1923a2c8c8bSdanielk1977  do_test vacuum3-3.$I.1 {
1933a2c8c8bSdanielk1977    execsql "
1943a2c8c8bSdanielk1977      PRAGMA page_size = $request;
1953a2c8c8bSdanielk1977      VACUUM;
1963a2c8c8bSdanielk1977    "
1973a2c8c8bSdanielk1977    execsql { PRAGMA page_size }
1983a2c8c8bSdanielk1977  } $actual
1993a2c8c8bSdanielk1977  do_test vacuum3-3.$I.2 {
2003a2c8c8bSdanielk1977    signature
2013a2c8c8bSdanielk1977  } $::sig
2023a2c8c8bSdanielk1977  integrity_check vacuum3-3.$I.3
2033a2c8c8bSdanielk1977
2043a2c8c8bSdanielk1977  incr I
2053a2c8c8bSdanielk1977}
2063a2c8c8bSdanielk1977
207b388c415Sdanielk1977do_test vacuum3-4.1 {
208b388c415Sdanielk1977  db close
209fda06befSmistachkin  delete_file test.db
210b388c415Sdanielk1977  sqlite3 db test.db
211b388c415Sdanielk1977  execsql {
212b388c415Sdanielk1977    PRAGMA page_size=1024;
213b388c415Sdanielk1977    CREATE TABLE abc(a, b, c);
214b388c415Sdanielk1977    INSERT INTO abc VALUES(1, 2, 3);
215b388c415Sdanielk1977    INSERT INTO abc VALUES(4, 5, 6);
216b388c415Sdanielk1977  }
217b388c415Sdanielk1977  execsql { SELECT * FROM abc }
218b388c415Sdanielk1977} {1 2 3 4 5 6}
219b388c415Sdanielk1977do_test vacuum3-4.2 {
220b388c415Sdanielk1977  sqlite3 db2 test.db
221b388c415Sdanielk1977  execsql { SELECT * FROM abc } db2
222b388c415Sdanielk1977} {1 2 3 4 5 6}
223b388c415Sdanielk1977do_test vacuum3-4.3 {
224b388c415Sdanielk1977  execsql {
225b388c415Sdanielk1977    PRAGMA page_size = 2048;
226b388c415Sdanielk1977    VACUUM;
227b388c415Sdanielk1977  }
228b388c415Sdanielk1977  execsql { SELECT * FROM abc }
229b388c415Sdanielk1977} {1 2 3 4 5 6}
230b388c415Sdanielk1977do_test vacuum3-4.4 {
231b388c415Sdanielk1977  execsql { SELECT * FROM abc } db2
232b388c415Sdanielk1977} {1 2 3 4 5 6}
233b388c415Sdanielk1977do_test vacuum3-4.5 {
2347dc89e65Sdanielk1977  execsql {
2357dc89e65Sdanielk1977    PRAGMA page_size=16384;
2367dc89e65Sdanielk1977    VACUUM;
2377dc89e65Sdanielk1977  } db2
2387dc89e65Sdanielk1977  execsql { SELECT * FROM abc } db2
2397dc89e65Sdanielk1977} {1 2 3 4 5 6}
2407dc89e65Sdanielk1977do_test vacuum3-4.6 {
2417dc89e65Sdanielk1977  execsql {
2427dc89e65Sdanielk1977    PRAGMA page_size=1024;
2437dc89e65Sdanielk1977    VACUUM;
2447dc89e65Sdanielk1977  }
2457dc89e65Sdanielk1977  execsql { SELECT * FROM abc } db2
246b388c415Sdanielk1977} {1 2 3 4 5 6}
247b388c415Sdanielk1977
2487426f864Sdrh# Unable to change the page-size of an in-memory using vacuum.
24953a4ddf7Sdanielk1977db2 close
2507426f864Sdrhsqlite3 db2 :memory:
2517426f864Sdrhdo_test vacuum3-5.1 {
2527426f864Sdrh  db2 eval {
2537426f864Sdrh    CREATE TABLE t1(x);
2547426f864Sdrh    INSERT INTO t1 VALUES(1234);
2557426f864Sdrh    PRAGMA page_size=4096;
2567426f864Sdrh    VACUUM;
2577426f864Sdrh    SELECT * FROM t1;
2587426f864Sdrh  }
2597426f864Sdrh} {1234}
2607426f864Sdrhdo_test vacuum3-5.2 {
2617426f864Sdrh  db2 eval {
2627426f864Sdrh    PRAGMA page_size
2637426f864Sdrh  }
2647426f864Sdrh} {1024}
26553a4ddf7Sdanielk1977
26606249db1Sdanielk1977set create_database_sql {
2673a2c8c8bSdanielk1977  BEGIN;
2683a2c8c8bSdanielk1977  CREATE TABLE t1(a, b, c);
2693a2c8c8bSdanielk1977  INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50));
2703a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1;
2713a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1;
2723a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1;
2733a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1;
2743a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1;
2753a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1;
2763a2c8c8bSdanielk1977  INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1;
2773a2c8c8bSdanielk1977  INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600));
2783a2c8c8bSdanielk1977  CREATE TABLE t2 AS SELECT * FROM t1;
2793a2c8c8bSdanielk1977  CREATE TABLE t3 AS SELECT * FROM t1;
2803a2c8c8bSdanielk1977  COMMIT;
2813a2c8c8bSdanielk1977  DROP TABLE t2;
28206249db1Sdanielk1977}
28306249db1Sdanielk1977
28406249db1Sdanielk1977do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep "
28506249db1Sdanielk1977  PRAGMA page_size = 1024;
28606249db1Sdanielk1977  $create_database_sql
28706249db1Sdanielk1977" -sqlbody {
2883a2c8c8bSdanielk1977  PRAGMA page_size = 4096;
2893a2c8c8bSdanielk1977  VACUUM;
2903a2c8c8bSdanielk1977}
29106249db1Sdanielk1977do_ioerr_test vacuum3-ioerr-2 -cksum true -sqlprep "
2923a2c8c8bSdanielk1977  PRAGMA page_size = 2048;
29306249db1Sdanielk1977  $create_database_sql
29406249db1Sdanielk1977" -sqlbody {
2953a2c8c8bSdanielk1977  PRAGMA page_size = 512;
2963a2c8c8bSdanielk1977  VACUUM;
2973a2c8c8bSdanielk1977}
2983a2c8c8bSdanielk1977
29906249db1Sdanielk1977ifcapable autovacuum {
30006249db1Sdanielk1977  do_ioerr_test vacuum3-ioerr-3 -cksum true -sqlprep "
30106249db1Sdanielk1977    PRAGMA auto_vacuum = 0;
30206249db1Sdanielk1977    $create_database_sql
30306249db1Sdanielk1977  " -sqlbody {
30406249db1Sdanielk1977    PRAGMA auto_vacuum = 1;
30506249db1Sdanielk1977    VACUUM;
30606249db1Sdanielk1977  }
30706249db1Sdanielk1977  do_ioerr_test vacuum3-ioerr-4 -cksum true -sqlprep "
30806249db1Sdanielk1977    PRAGMA auto_vacuum = 1;
30906249db1Sdanielk1977    $create_database_sql
31006249db1Sdanielk1977  " -sqlbody {
31106249db1Sdanielk1977    PRAGMA auto_vacuum = 0;
31206249db1Sdanielk1977    VACUUM;
31306249db1Sdanielk1977  }
31406249db1Sdanielk1977}
31506249db1Sdanielk1977
3163a2c8c8bSdanielk1977source $testdir/malloc_common.tcl
3173a2c8c8bSdanielk1977if {$MEMDEBUG} {
3183a2c8c8bSdanielk1977  do_malloc_test vacuum3-malloc-1 -sqlprep {
3193a2c8c8bSdanielk1977    PRAGMA page_size = 2048;
3203a2c8c8bSdanielk1977    BEGIN;
3213a2c8c8bSdanielk1977    CREATE TABLE t1(a, b, c);
3223a2c8c8bSdanielk1977    INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50));
3233a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1;
3243a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1;
3253a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1;
3263a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1;
3273a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1;
3283a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1;
3293a2c8c8bSdanielk1977    INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1;
3303a2c8c8bSdanielk1977    INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600));
3313a2c8c8bSdanielk1977    CREATE TABLE t2 AS SELECT * FROM t1;
3323a2c8c8bSdanielk1977    CREATE TABLE t3 AS SELECT * FROM t1;
3333a2c8c8bSdanielk1977    COMMIT;
3343a2c8c8bSdanielk1977    DROP TABLE t2;
3353a2c8c8bSdanielk1977  } -sqlbody {
3363a2c8c8bSdanielk1977    PRAGMA page_size = 512;
3373a2c8c8bSdanielk1977    VACUUM;
3383a2c8c8bSdanielk1977  }
339701bb3b4Sdrh  do_malloc_test vacuum3-malloc-2 -sqlprep {
340701bb3b4Sdrh    PRAGMA encoding=UTF16;
341701bb3b4Sdrh    CREATE TABLE t1(a, b, c);
342701bb3b4Sdrh    INSERT INTO t1 VALUES(1, 2, 3);
343701bb3b4Sdrh    CREATE TABLE t2(x,y,z);
344701bb3b4Sdrh    INSERT INTO t2 SELECT * FROM t1;
345701bb3b4Sdrh  } -sqlbody {
346701bb3b4Sdrh    VACUUM;
347701bb3b4Sdrh  }
3483a2c8c8bSdanielk1977}
3493a2c8c8bSdanielk1977
3503a2c8c8bSdanielk1977finish_test
351