Annotation of embedaddon/sqlite3/test/incrvacuum2.test, revision 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>