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

     1  # 2020 May 06
     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  #
    12  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  source $testdir/lock_common.tcl
    16  set testprefix walsetlk
    17  
    18  ifcapable !wal {finish_test ; return }
    19  db timeout 1000
    20  
    21  #-------------------------------------------------------------------------
    22  # 1.*: Test that nothing goes wrong if recovery is forced while opening
    23  #      a write transaction or performing a checkpoint with blocking locks.
    24  #
    25  
    26  do_execsql_test 1.0 {
    27    CREATE TABLE t1(x, y);
    28    PRAGMA journal_mode = wal;
    29    INSERT INTO t1 VALUES(1, 2);
    30    INSERT INTO t1 VALUES(3, 4);
    31    INSERT INTO t1 VALUES(5, 6);
    32    INSERT INTO t1 VALUES(7, 8);
    33  } {wal}
    34  
    35  sqlite3 db2 test.db
    36  db2 timeout 1000
    37  
    38  do_execsql_test -db db2 1.1 {
    39    SELECT * FROM t1
    40  } {1 2 3 4 5 6 7 8}
    41  
    42  set fd [open test.db-shm r+]
    43  puts $fd "blahblahblahblah"
    44  flush $fd
    45  
    46  do_execsql_test 1.2 {
    47    BEGIN;
    48      INSERT INTO t1 VALUES(9, 10);
    49  }
    50  
    51  do_execsql_test -db db2 1.3 {
    52    SELECT * FROM t1
    53  } {1 2 3 4 5 6 7 8}
    54  
    55  do_test 1.4 {
    56    list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg
    57  } {1 {database is locked}}
    58  
    59  do_execsql_test 1.5 { COMMIT }
    60  do_execsql_test -db db2 1.6 {
    61    SELECT * FROM t1
    62  } {1 2 3 4 5 6 7 8 9 10}
    63  
    64  puts $fd "blahblahblahblah"
    65  flush $fd
    66  
    67  do_execsql_test -db db2 1.7 {
    68    PRAGMA wal_checkpoint = TRUNCATE
    69  } {0 0 0}
    70  
    71  do_test 1.8 {
    72    file size test.db-wal
    73  } 0
    74  
    75  close $fd
    76  db close
    77  db2 close
    78  #-------------------------------------------------------------------------
    79  
    80  do_multiclient_test tn {
    81    do_test 2.$tn.1 {
    82      sql1 {
    83        PRAGMA journal_mode = wal;
    84        CREATE TABLE t1(s, v);
    85        INSERT INTO t1 VALUES(1, 2);
    86        INSERT INTO t1 VALUES(3, 4);
    87        INSERT INTO t1 VALUES(5, 6);
    88      }
    89      code1 { db timeout 2000 }
    90    } {}
    91  
    92    do_test 2.$tn.2 {
    93      sql2 {
    94        BEGIN;
    95          INSERT INTO t1 VALUES(7, 8);
    96      }
    97    } {}
    98  
    99    do_test 2.$tn.3 {
   100      set us [lindex [time { catch {db eval "BEGIN EXCLUSIVE"} }] 0]
   101      expr $us>1000000 && $us<4000000
   102    } {1}
   103  
   104    do_test 2.$tn.4 {
   105      sql2 { COMMIT }
   106      sql1 { SELECT * FROM t1 }
   107    } {1 2 3 4 5 6 7 8}
   108  
   109    do_test 2.$tn.5 {
   110      sql2 {
   111        BEGIN;
   112          INSERT INTO t1 VALUES(9, 10);
   113      }
   114    } {}
   115  
   116    do_test 2.$tn.6 {
   117      set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
   118      expr $us>1000000 && $us<4000000
   119    } {1}
   120  
   121    do_test 2.$tn.7 {
   122      sql2 {
   123        COMMIT;
   124        BEGIN;
   125          SELECT * FROM t1;
   126      }
   127    } {1 2 3 4 5 6 7 8 9 10}
   128  
   129    do_test 2.$tn.8 {
   130      set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
   131      expr $us>1000000 && $us<4000000
   132    } {1}
   133  
   134    do_test 2.$tn.9 {
   135      sql3 {
   136        INSERT INTO t1 VALUES(11, 12);
   137      }
   138      sql2 {
   139        COMMIT;
   140        BEGIN;
   141          SELECT * FROM t1;
   142      }
   143      sql3 {
   144        INSERT INTO t1 VALUES(13, 14);
   145      }
   146    } {}
   147  
   148    do_test 2.$tn.10 {
   149      set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
   150      expr $us>1000000 && $us<4000000
   151    } {1}
   152  
   153    do_test 2.$tn.11 {
   154      sql3 {
   155        BEGIN;
   156          SELECT * FROM t1;
   157      }
   158      sql1 { INSERT INTO t1 VALUES(15, 16); }
   159    } {}
   160  
   161    do_test 2.$tn.12 {
   162      set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
   163      expr $us>1000000 && $us<4000000
   164    } {1}
   165  
   166    do_test 2.$tn.13 {
   167      sql2 {
   168        COMMIT;
   169        BEGIN;
   170          SELECT * FROM t1;
   171      }
   172      sql1 { INSERT INTO t1 VALUES(17, 18); }
   173    } {}
   174  
   175    do_test 2.$tn.14 {
   176      set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
   177      expr $us>1000000 && $us<4000000
   178    } {1}
   179    
   180  }
   181  
   182  #-------------------------------------------------------------------------
   183  reset_db
   184  sqlite3 db2 test.db
   185  db2 timeout 1000
   186  do_execsql_test 3.0 {
   187    PRAGMA journal_mode = wal;
   188    CREATE TABLE x1(x, y);
   189    BEGIN;
   190      INSERT INTO x1 VALUES(1, 2);
   191  } {wal}
   192  
   193  do_test 3.1 {
   194    list [catch { db2 eval {BEGIN EXCLUSIVE} } msg] $msg
   195  } {1 {database is locked}}
   196  
   197  finish_test