github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/incrvacuum3.test (about)

     1  # 2013 Feb 25
     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 the SQLite library, focusing
    12  # on the incremental vacuum feature.
    13  #
    14  # The tests in this file were added at the same time as optimizations 
    15  # were made to:
    16  #
    17  #   * Truncate the database after a rollback mode commit, and
    18  #
    19  #   * Avoid moving pages to locations from which they may need to be moved
    20  #     a second time if an incremental-vacuum proccess is allowed to vacuum
    21  #     the entire database.
    22  #
    23  
    24  set testdir [file dirname $argv0]
    25  source $testdir/tester.tcl
    26  set testprefix incrvacuum3
    27  
    28  # If this build of the library does not support auto-vacuum, omit this
    29  # whole file.
    30  ifcapable {!autovacuum || !pragma} {
    31    finish_test
    32    return
    33  }
    34  
    35  proc check_on_disk {} {
    36  
    37    # Copy the wal and journal files for database "test.db" to "test2.db".
    38    forcedelete test2.db test2.db-journal test2.db-wal
    39    if {[file exists test.db-journal]} { 
    40      forcecopy test.db-journal test2.db-journal 
    41    }
    42    if {[file exists test.db-wal]} { 
    43      forcecopy test.db-wal test2.db-wal 
    44    }
    45  
    46    # Now copy the database file itself. Do this using open/read/puts
    47    # instead of the [file copy] command in order to avoid attempting
    48    # to read the 512 bytes begining at offset $sqlite_pending_byte.
    49    #
    50    set sz [file size test.db]
    51    set fd [open test.db]
    52    set fd2 [open test2.db w]
    53    fconfigure $fd  -encoding binary -translation binary
    54    fconfigure $fd2 -encoding binary -translation binary
    55    if {$sz>$::sqlite_pending_byte} {
    56      puts -nonewline $fd2 [read $fd $::sqlite_pending_byte]
    57      seek $fd [expr $::sqlite_pending_byte+512]
    58      seek $fd2 [expr $::sqlite_pending_byte+512]
    59    }
    60    puts -nonewline $fd2 [read $fd]
    61    close $fd2
    62    close $fd
    63  
    64    # Open "test2.db" and check it is Ok.
    65    sqlite3 dbcheck test2.db
    66    set ret [dbcheck eval { PRAGMA integrity_check }]
    67    dbcheck close
    68    set ret
    69  }
    70  
    71  # Run these tests once in rollback journal mode, and once in wal mode.
    72  #
    73  foreach {T jrnl_mode} {
    74    1 delete
    75    2 wal
    76  } {
    77    catch { db close }
    78    forcedelete test.db test.db-journal test.db-wal
    79    sqlite3 db test.db
    80    db eval {
    81      PRAGMA cache_size = 5;
    82      PRAGMA page_size = 1024;
    83      PRAGMA auto_vacuum = 2;
    84    }
    85    db eval "PRAGMA journal_mode = $jrnl_mode"
    86    
    87    foreach {tn sql} {
    88      1 {
    89        CREATE TABLE t1(x UNIQUE);
    90        INSERT INTO t1 VALUES(randomblob(400));
    91        INSERT INTO t1 VALUES(randomblob(400));
    92        INSERT INTO t1 SELECT randomblob(400) FROM t1;    --   4
    93        INSERT INTO t1 SELECT randomblob(400) FROM t1;    --   8
    94        INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  16
    95        INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  32
    96        INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  64
    97        INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 128
    98        INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 256
    99      }
   100    
   101      2 {
   102        DELETE FROM t1 WHERE rowid%8;
   103      }
   104    
   105      3 { 
   106        BEGIN;
   107          PRAGMA incremental_vacuum = 100;
   108          INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  64
   109          INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 128
   110          INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 256
   111        ROLLBACK;
   112      }
   113    
   114      4 { 
   115        BEGIN;
   116          SAVEPOINT one;
   117            PRAGMA incremental_vacuum = 100;
   118            SAVEPOINT two;
   119              INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  64
   120              INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 128
   121              INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 256
   122      }
   123    
   124      5 {   ROLLBACK to two }
   125    
   126      6 { ROLLBACK to one }
   127    
   128      7 { 
   129          INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  64
   130          PRAGMA incremental_vacuum = 1000;
   131          INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 128
   132          INSERT INTO t1 SELECT randomblob(400) FROM t1;    -- 256
   133        ROLLBACK;
   134      }
   135    
   136      8 { 
   137        BEGIN;
   138          INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  64
   139          PRAGMA incremental_vacuum = 1000;
   140          INSERT INTO t1 SELECT randomblob(400) FROM t1;    --  128
   141        COMMIT;
   142      }
   143    } {
   144      do_execsql_test $T.1.$tn.1 $sql
   145      do_execsql_test $T.1.$tn.2 {PRAGMA integrity_check} ok
   146      do_test         $T.1.$tn.3 { check_on_disk }        ok
   147    }
   148  
   149    do_execsql_test $T.1.x.1 { PRAGMA freelist_count   } 0
   150    do_execsql_test $T.1.x.2 { SELECT count(*) FROM t1 } 128
   151  }
   152  
   153  finish_test