Home | History | Annotate | Download | only in test
      1 # 2010 April 19
      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 operation of the library in
     13 # "PRAGMA journal_mode=WAL" mode.
     14 # 
     15 # More specifically, this file contains regression tests for the 
     16 # sqlite3_wal_hook() mechanism, including the sqlite3_wal_autocheckpoint()
     17 # and "PRAGMA wal_autocheckpoint" convenience interfaces.
     18 #
     19 
     20 set testdir [file dirname $argv0]
     21 source $testdir/tester.tcl
     22 source $testdir/wal_common.tcl
     23 
     24 ifcapable !wal {finish_test ; return }
     25 
     26 set ::wal_hook [list]
     27 proc wal_hook {zDb nEntry} {
     28   lappend ::wal_hook $zDb $nEntry
     29   return 0
     30 }
     31 db wal_hook wal_hook
     32 
     33 do_test walhook-1.1 {
     34   execsql { 
     35     PRAGMA page_size = 1024;
     36     PRAGMA auto_vacuum = 0;
     37     PRAGMA journal_mode = wal;
     38     PRAGMA synchronous = normal;
     39     CREATE TABLE t1(i PRIMARY KEY, j);
     40   }
     41   set ::wal_hook
     42 } {main 3}
     43 
     44 do_test walhook-1.2 {
     45   set ::wal_hook [list]
     46   execsql { INSERT INTO t1 VALUES(1, 'one') }
     47   set ::wal_hook
     48 } {main 5}
     49 do_test walhook-1.3 {
     50   proc wal_hook {args} { db eval {PRAGMA wal_checkpoint}; return 0 }
     51   execsql { INSERT INTO t1 VALUES(2, 'two') }
     52   file size test.db
     53 } [expr 3*1024]
     54 do_test walhook-1.4 {
     55   proc wal_hook {zDb nEntry} { 
     56     execsql { PRAGMA wal_checkpoint }
     57     return 0
     58   }
     59   execsql { CREATE TABLE t2(a, b) }
     60   file size test.db
     61 } [expr 4*1024]
     62 
     63 do_test walhook-1.5 {
     64   sqlite3 db2 test.db
     65   proc wal_hook {zDb nEntry} {
     66     execsql { PRAGMA wal_checkpoint } db2
     67     return 0
     68   }
     69   execsql { CREATE TABLE t3(a PRIMARY KEY, b) }
     70   file size test.db
     71 } [expr 6*1024]
     72 
     73 db2 close
     74 db close
     75 sqlite3 db test.db
     76 do_test walhook-2.1 {
     77   execsql { PRAGMA synchronous = NORMAL }
     78   execsql { PRAGMA wal_autocheckpoint }
     79 } {1000}
     80 do_test walhook-2.2 {
     81   execsql { PRAGMA wal_autocheckpoint = 10}
     82 } {10}
     83 do_test walhook-2.3 {
     84   execsql { PRAGMA wal_autocheckpoint }
     85 } {10}
     86 
     87 #
     88 # The database connection is configured with "PRAGMA wal_autocheckpoint = 10".
     89 # Check that transactions are written to the log file until it contains at
     90 # least 10 frames, then the database is checkpointed. Subsequent transactions
     91 # are written into the start of the log file.
     92 #
     93 foreach {tn sql dbpages logpages} {
     94   4 "CREATE TABLE t4(x PRIMARY KEY, y)"   6   3
     95   5 "INSERT INTO t4 VALUES(1, 'one')"     6   5
     96   6 "INSERT INTO t4 VALUES(2, 'two')"     6   7
     97   7 "INSERT INTO t4 VALUES(3, 'three')"   6   9
     98   8 "INSERT INTO t4 VALUES(4, 'four')"    8  11
     99   9 "INSERT INTO t4 VALUES(5, 'five')"    8  11
    100 } {
    101   do_test walhook-2.$tn {
    102     execsql $sql
    103     list [file size test.db] [file size test.db-wal]
    104   } [list [expr $dbpages*1024] [wal_file_size $logpages 1024]]
    105 }
    106 
    107 catch { db2 close }
    108 catch { db close }
    109 finish_test
    110