Annotation of embedaddon/sqlite3/test/vacuum2.test, revision 1.1.1.1

1.1       misho       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: 
                     16: set testdir [file dirname $argv0]
                     17: source $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: #
                     22: do_not_use_codec
                     23: 
                     24: # If the VACUUM statement is disabled in the current build, skip all
                     25: # the tests in this file.
                     26: #
                     27: ifcapable {!vacuum||!autoinc} {
                     28:   finish_test
                     29:   return
                     30: }
                     31: if $AUTOVACUUM {
                     32:   finish_test
                     33:   return
                     34: }
                     35: 
                     36: # Ticket #1121 - make sure vacuum works if all autoincrement tables
                     37: # have been deleted.
                     38: #
                     39: do_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: #
                     50: do_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}]
                     58: do_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: #
                     71: sqlite3 db2 test.db
                     72: set 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: #
                     77: do_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}
                     84: set cksum [cksum]
                     85: do_test vacuum2-3.2 {
                     86:   cksum db2
                     87: } $cksum
                     88: 
                     89: # Convert the database to an autovacuumed database.
                     90: ifcapable 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: }
                     99: do_test vacuum2-3.4 {
                    100:   cksum db2
                    101: } $cksum
                    102: do_test vacuum2-3.5 {
                    103:   cksum
                    104: } $cksum
                    105: do_test vacuum2-3.6 {
                    106:   execsql {PRAGMA integrity_check} db2
                    107: } {ok}
                    108: do_test vacuum2-3.7 {
                    109:   execsql {PRAGMA integrity_check} db
                    110: } {ok}
                    111: 
                    112: # Convert the database back to a non-autovacuumed database.
                    113: do_test vacuum2-3.13 {
                    114:   execsql {
                    115:     PRAGMA auto_vacuum=NONE;
                    116:     VACUUM;
                    117:   }
                    118:   expr {[file size test.db]/$pageSize}
                    119: } {3}
                    120: do_test vacuum2-3.14 {
                    121:   cksum db2
                    122: } $cksum
                    123: do_test vacuum2-3.15 {
                    124:   cksum
                    125: } $cksum
                    126: do_test vacuum2-3.16 {
                    127:   execsql {PRAGMA integrity_check} db2
                    128: } {ok}
                    129: do_test vacuum2-3.17 {
                    130:   execsql {PRAGMA integrity_check} db
                    131: } {ok}
                    132: 
                    133: db2 close
                    134: 
                    135: ifcapable autovacuum {
                    136:   do_test vacuum2-4.1 {
                    137:     db close
                    138:     forcedelete 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: #
                    196: db close
                    197: forcedelete test.db
                    198: sqlite3 db test.db
                    199: do_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: 
                    208: do_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: 
                    214: do_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: 
                    220: do_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: 
                    231: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>