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>