persistentstorage/sqlite3api/TEST/TclScript/server1.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2006 January 09
       
     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 is testing the server mode of SQLite.
       
    13 #
       
    14 # This file is derived from thread1.test
       
    15 #
       
    16 # $Id: server1.test,v 1.5 2007/08/29 18:20:17 drh Exp $
       
    17 
       
    18 
       
    19 set testdir [file dirname $argv0]
       
    20 source $testdir/tester.tcl
       
    21 
       
    22 # Skip this whole file if the server testing code is not enabled
       
    23 #
       
    24 if {[llength [info command client_step]]==0 || [sqlite3 -has-codec]} {
       
    25   finish_test
       
    26   return
       
    27 }
       
    28 
       
    29 # The sample server implementation does not work right when memory
       
    30 # management is enabled.
       
    31 #
       
    32 ifcapable memorymanage {
       
    33   finish_test
       
    34   return
       
    35 }
       
    36 
       
    37 # Create some data to work with
       
    38 #
       
    39 do_test server1-1.1 {
       
    40   execsql {
       
    41     CREATE TABLE t1(a,b);
       
    42     INSERT INTO t1 VALUES(1,'abcdefgh');
       
    43     INSERT INTO t1 SELECT a+1, b||b FROM t1;
       
    44     INSERT INTO t1 SELECT a+2, b||b FROM t1;
       
    45     INSERT INTO t1 SELECT a+4, b||b FROM t1;
       
    46     SELECT count(*), max(length(b)) FROM t1;
       
    47   }
       
    48 } {8 64}
       
    49 
       
    50 # Interleave two threads on read access.  Then make sure a third
       
    51 # thread can write the database.  In other words:
       
    52 #
       
    53 #    read-lock A
       
    54 #    read-lock B
       
    55 #    unlock A
       
    56 #    unlock B
       
    57 #    write-lock C
       
    58 #
       
    59 do_test server1-1.2 {
       
    60   client_create A test.db
       
    61   client_create B test.db
       
    62   client_create C test.db
       
    63   client_compile A {SELECT a FROM t1}
       
    64   client_step A
       
    65   client_result A
       
    66 } SQLITE_ROW
       
    67 do_test server1-1.3 {
       
    68   client_argc A
       
    69 } 1
       
    70 do_test server1-1.4 {
       
    71   client_argv A 0
       
    72 } 1
       
    73 do_test server1-1.5 {
       
    74   client_compile B {SELECT b FROM t1}
       
    75   client_step B
       
    76   client_result B
       
    77 } SQLITE_ROW
       
    78 do_test server1-1.6 {
       
    79   client_argc B
       
    80 } 1
       
    81 do_test server1-1.7 {
       
    82   client_argv B 0
       
    83 } abcdefgh
       
    84 do_test server1-1.8 {
       
    85   client_finalize A
       
    86   client_result A
       
    87 } SQLITE_OK
       
    88 do_test server1-1.9 {
       
    89   client_finalize B
       
    90   client_result B
       
    91 } SQLITE_OK
       
    92 do_test server1-1.10 {
       
    93   client_compile C {CREATE TABLE t2(x,y)}
       
    94   client_step C
       
    95   client_result C
       
    96 } SQLITE_DONE
       
    97 do_test server1-1.11 {
       
    98   client_finalize C
       
    99   client_result C
       
   100 } SQLITE_OK
       
   101 do_test server1-1.12 {
       
   102   catchsql {SELECT name FROM sqlite_master}
       
   103   execsql {SELECT name FROM sqlite_master}
       
   104 } {t1 t2}
       
   105 
       
   106 
       
   107 # Read from table t1.  Do not finalize the statement.  This
       
   108 # will leave the lock pending.
       
   109 #
       
   110 do_test server1-2.1 {
       
   111   client_halt *
       
   112   client_create A test.db
       
   113   client_compile A {SELECT a FROM t1}
       
   114   client_step A
       
   115   client_result A
       
   116 } SQLITE_ROW
       
   117 
       
   118 # Read from the same table from another thread.  This is allows.
       
   119 #
       
   120 do_test server1-2.2 {
       
   121   client_create B test.db
       
   122   client_compile B {SELECT b FROM t1}
       
   123   client_step B
       
   124   client_result B
       
   125 } SQLITE_ROW
       
   126 
       
   127 # Write to a different table from another thread.  This is allowed
       
   128 # because in server mode with a shared cache we have table-level locking.
       
   129 #
       
   130 do_test server1-2.3 {
       
   131   client_create C test.db
       
   132   client_compile C {INSERT INTO t2 VALUES(98,99)}
       
   133   client_step C
       
   134   client_result C
       
   135   client_finalize C
       
   136   client_result C
       
   137 } SQLITE_OK
       
   138 
       
   139 # But we cannot insert into table t1 because threads A and B have it locked.
       
   140 #
       
   141 do_test server1-2.4 {
       
   142   client_compile C {INSERT INTO t1 VALUES(98,99)}
       
   143   client_step C
       
   144   client_result C
       
   145   client_finalize C
       
   146   client_result C
       
   147 } SQLITE_LOCKED
       
   148 do_test server1-2.5 {
       
   149   client_finalize B
       
   150   client_wait B
       
   151   client_compile C {INSERT INTO t1 VALUES(98,99)}
       
   152   client_step C
       
   153   client_result C
       
   154   client_finalize C
       
   155   client_result C
       
   156 } SQLITE_LOCKED
       
   157 
       
   158 # Insert into t1 is successful after finishing the other two threads.
       
   159 do_test server1-2.6 {
       
   160   client_finalize A
       
   161   client_wait A
       
   162   client_compile C {INSERT INTO t1 VALUES(98,99)}
       
   163   client_step C
       
   164   client_result C
       
   165   client_finalize C
       
   166   client_result C
       
   167 } SQLITE_OK
       
   168 
       
   169 client_halt *   
       
   170 sqlite3_enable_shared_cache 0
       
   171 finish_test