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