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

     1  # 2018 August 6
     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  # Tests for calling sqlite3_snapshot_open() when there is already
    13  # a read transaction open on the database.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  ifcapable !snapshot {finish_test; return}
    19  set testprefix snapshot_up
    20  
    21  # This test does not work with the inmemory_journal permutation. The reason
    22  # is that each connection opened as part of this permutation executes
    23  # "PRAGMA journal_mode=memory", which fails if the database is in wal mode
    24  # and there are one or more existing connections.
    25  if {[permutation]=="inmemory_journal"} {
    26    finish_test
    27    return
    28  }
    29  
    30  do_execsql_test 1.0 {
    31    CREATE TABLE t1(a, b, c);
    32    PRAGMA journal_mode = wal;
    33    INSERT INTO t1 VALUES(1, 2, 3);
    34    INSERT INTO t1 VALUES(4, 5, 6);
    35    INSERT INTO t1 VALUES(7, 8, 9);
    36  } {wal}
    37  
    38  do_test 1.1 {
    39    execsql BEGIN
    40    set ::snap1 [sqlite3_snapshot_get db main]
    41    execsql COMMIT
    42    execsql { INSERT INTO t1 VALUES(10, 11, 12); }
    43    execsql BEGIN
    44    set ::snap2 [sqlite3_snapshot_get db main]
    45    execsql COMMIT
    46    execsql { INSERT INTO t1 VALUES(13, 14, 15); }
    47    execsql BEGIN
    48    set ::snap3 [sqlite3_snapshot_get db main]
    49    execsql COMMIT
    50  } {}
    51  
    52  do_execsql_test 1.2 {
    53    BEGIN;
    54      SELECT * FROM t1
    55  } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15}
    56  
    57  do_test 1.3 {
    58    sqlite3_snapshot_open db main $::snap1
    59    execsql { SELECT * FROM t1 }
    60  } {1 2 3 4 5 6 7 8 9}
    61  
    62  do_test 1.4 {
    63    sqlite3_snapshot_open db main $::snap2
    64    execsql { SELECT * FROM t1 }
    65  } {1 2 3 4 5 6 7 8 9 10 11 12}
    66  
    67  do_test 1.5 {
    68    sqlite3 db2 test.db
    69    execsql { PRAGMA wal_checkpoint } db2
    70  } {0 5 4}
    71  
    72  do_execsql_test 1.6 {
    73    SELECT * FROM t1
    74  } {1 2 3 4 5 6 7 8 9 10 11 12}
    75  
    76  do_test 1.7 {
    77    list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg
    78  } {1 SQLITE_ERROR_SNAPSHOT}
    79  
    80  do_execsql_test 1.8 {
    81    SELECT * FROM t1
    82  } {1 2 3 4 5 6 7 8 9 10 11 12}
    83  
    84  do_test 1.9 {
    85    execsql { COMMIT ; BEGIN }
    86    list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg
    87  } {1 SQLITE_ERROR_SNAPSHOT}
    88  
    89  do_test 1.10 {
    90    execsql { COMMIT }
    91    execsql {
    92      PRAGMA wal_checkpoint;
    93      DELETE FROM t1 WHERE a = 1;
    94    } db2
    95    execsql BEGIN
    96    set ::snap4 [sqlite3_snapshot_get db main]
    97    execsql COMMIT
    98    execsql {
    99      DELETE FROM t1 WHERE a = 4;
   100    } db2
   101  } {}
   102  
   103  do_test 1.11 {
   104    execsql { 
   105      BEGIN;
   106        SELECT * FROM t1
   107    }
   108  } {7 8 9 10 11 12 13 14 15}
   109  do_test 1.12 {
   110    sqlite3_snapshot_open db main $::snap4
   111    execsql { SELECT * FROM t1 }
   112  } {4 5 6 7 8 9 10 11 12 13 14 15}
   113  
   114  do_test 1.13 {
   115    list [catch { sqlite3_snapshot_open db main $::snap3 } msg] $msg
   116  } {1 SQLITE_ERROR_SNAPSHOT}
   117  do_test 1.14 {
   118    execsql { SELECT * FROM t1 }
   119  } {4 5 6 7 8 9 10 11 12 13 14 15}
   120  
   121  db close
   122  db2 close
   123  sqlite3 db test.db
   124  do_execsql_test 1.15 {
   125    BEGIN;
   126      SELECT * FROM t1
   127  } {7 8 9 10 11 12 13 14 15}
   128  do_test 1.16 {
   129    list [catch { sqlite3_snapshot_open db main $::snap4 } msg] $msg
   130  } {1 SQLITE_ERROR_SNAPSHOT}
   131  do_execsql_test 1.17 { COMMIT }
   132  
   133  sqlite3_snapshot_free $::snap1
   134  sqlite3_snapshot_free $::snap2
   135  sqlite3_snapshot_free $::snap3
   136  sqlite3_snapshot_free $::snap4
   137  
   138  #-------------------------------------------------------------------------
   139  catch { db close }
   140  sqlite3 db test.db
   141  sqlite3 db2 test.db
   142  sqlite3 db3 test.db
   143  
   144  proc xBusy {args} { return 1 }
   145  db3 busy xBusy
   146  
   147  do_test 2.1 {
   148    execsql { INSERT INTO t1 VALUES(16, 17, 18) } db2
   149    execsql BEGIN
   150    set ::snap1 [sqlite3_snapshot_get db main]
   151    execsql COMMIT
   152    execsql { INSERT INTO t1 VALUES(19, 20, 21) } db2
   153    execsql BEGIN
   154    set ::snap2 [sqlite3_snapshot_get db main]
   155    execsql COMMIT
   156    set {} {}
   157  } {}
   158  
   159  do_execsql_test -db db2 2.2 {
   160    BEGIN;
   161      INSERT INTO t1 VALUES(19, 20, 21);
   162  }
   163  
   164  do_test 2.3 {
   165    execsql BEGIN
   166    sqlite3_snapshot_open db main $::snap1
   167    execsql { SELECT * FROM t1 }
   168  } {7 8 9 10 11 12 13 14 15 16 17 18}
   169  
   170  proc xBusy {args} { 
   171    set ::res [list [catch { sqlite3_snapshot_open db main $::snap2 } msg] $msg]
   172    return 1
   173  }
   174  db3 busy xBusy
   175  do_test 2.4 {
   176    execsql {PRAGMA wal_checkpoint = restart} db3
   177    set ::res
   178  } {1 SQLITE_BUSY}
   179  
   180  sqlite3_snapshot_free $::snap1
   181  sqlite3_snapshot_free $::snap2
   182  
   183  finish_test