persistentstorage/sqlite3api/TEST/TclScript/capi3b.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2004 September 2
       
     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 script testing the callback-free C/C++ API and in
       
    13 # particular the behavior of sqlite3_step() when trying to commit
       
    14 # with lock contention.
       
    15 #
       
    16 # $Id: capi3b.test,v 1.4 2007/08/10 19:46:14 drh Exp $
       
    17 #
       
    18 
       
    19 set testdir [file dirname $argv0]
       
    20 source $testdir/tester.tcl
       
    21 
       
    22 
       
    23 # These tests depend on the pager holding changes in cache
       
    24 # until it is time to commit.  But that won't happen if the
       
    25 # soft-heap-limit is set too low.  So disable the soft heap limit
       
    26 # for the duration of this test.
       
    27 #
       
    28 sqlite3_soft_heap_limit 0
       
    29 
       
    30 
       
    31 set DB [sqlite3_connection_pointer db]
       
    32 sqlite3 db2 test.db
       
    33 set DB2 [sqlite3_connection_pointer db2]
       
    34 
       
    35 # Create some data in the database
       
    36 #
       
    37 do_test capi3b-1.1 {
       
    38   execsql {
       
    39     CREATE TABLE t1(x);
       
    40     INSERT INTO t1 VALUES(1);
       
    41     INSERT INTO t1 VALUES(2);
       
    42     SELECT * FROM t1
       
    43   }
       
    44 } {1 2}
       
    45 
       
    46 # Make sure the second database connection can see the data
       
    47 #
       
    48 do_test capi3b-1.2 {
       
    49   execsql {
       
    50     SELECT * FROM t1
       
    51   } db2
       
    52 } {1 2}
       
    53 
       
    54 # First database connection acquires a shared lock
       
    55 #
       
    56 do_test capi3b-1.3 {
       
    57   execsql {
       
    58     BEGIN;
       
    59     SELECT * FROM t1;
       
    60   }
       
    61 } {1 2}
       
    62 
       
    63 # Second database connection tries to write.  The sqlite3_step()
       
    64 # function returns SQLITE_BUSY because it cannot commit.
       
    65 #
       
    66 do_test capi3b-1.4 {
       
    67   set VM [sqlite3_prepare $DB2 {INSERT INTO t1 VALUES(3)} -1 TAIL]
       
    68   sqlite3_step $VM
       
    69 } SQLITE_BUSY
       
    70 
       
    71 # The sqlite3_step call can be repeated multiple times.
       
    72 #
       
    73 do_test capi3b-1.5.1 {
       
    74   sqlite3_step $VM
       
    75 } SQLITE_BUSY
       
    76 do_test capi3b-1.5.2 {
       
    77   sqlite3_step $VM
       
    78 } SQLITE_BUSY
       
    79 
       
    80 # The first connection closes its transaction.  This allows the second
       
    81 # connections sqlite3_step to succeed.
       
    82 #
       
    83 do_test capi3b-1.6 {
       
    84   execsql COMMIT
       
    85   sqlite3_step $VM
       
    86 } SQLITE_DONE
       
    87 do_test capi3b-1.7 {
       
    88   sqlite3_finalize $VM
       
    89 } SQLITE_OK
       
    90 do_test capi3b-1.8 {
       
    91   execsql {SELECT * FROM t1} db2
       
    92 } {1 2 3}
       
    93 do_test capi3b-1.9 {
       
    94   execsql {SELECT * FROM t1}
       
    95 } {1 2 3}
       
    96 
       
    97 # Start doing a SELECT with one connection.  This gets a SHARED lock.
       
    98 # Then do an INSERT with the other connection.  The INSERT should
       
    99 # not be able to complete until the SELECT finishes.
       
   100 #
       
   101 do_test capi3b-2.1 {
       
   102   set VM1 [sqlite3_prepare $DB {SELECT * FROM t1} -1 TAIL]
       
   103   sqlite3_step $VM1
       
   104 } SQLITE_ROW
       
   105 do_test capi3b-2.2 {
       
   106   sqlite3_column_text $VM1 0
       
   107 } 1
       
   108 do_test capi3b-2.3 {
       
   109   set VM2 [sqlite3_prepare $DB2 {INSERT INTO t1 VALUES(4)} -1 TAIL]
       
   110   sqlite3_step $VM2
       
   111 } SQLITE_BUSY
       
   112 do_test capi3b-2.4 {
       
   113   sqlite3_step $VM1
       
   114 } SQLITE_ROW
       
   115 do_test capi3b-2.5 {
       
   116   sqlite3_column_text $VM1 0
       
   117 } 2
       
   118 do_test capi3b-2.6 {
       
   119   sqlite3_step $VM2
       
   120 } SQLITE_BUSY
       
   121 do_test capi3b-2.7 {
       
   122   sqlite3_step $VM1
       
   123 } SQLITE_ROW
       
   124 do_test capi3b-2.8 {
       
   125   sqlite3_column_text $VM1 0
       
   126 } 3
       
   127 do_test capi3b-2.9 {
       
   128   sqlite3_step $VM2
       
   129 } SQLITE_BUSY
       
   130 do_test capi3b-2.10 {
       
   131   sqlite3_step $VM1
       
   132 } SQLITE_DONE
       
   133 do_test capi3b-2.11 {
       
   134   sqlite3_step $VM2
       
   135 } SQLITE_DONE
       
   136 do_test capi3b-2.12 {
       
   137   sqlite3_finalize $VM1
       
   138   sqlite3_finalize $VM2
       
   139   execsql {SELECT * FROM t1}
       
   140 } {1 2 3 4}
       
   141 
       
   142 catch {db2 close}
       
   143 
       
   144 sqlite3_soft_heap_limit $soft_limit
       
   145 finish_test