Add new testcase() macros and fix a bug that was revealed when trying to
[sqlite.git] / test / server1.test
blob90673ef00011a3dd2221c280527c6f4a827d4486
1 # 2006 January 09
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this script is testing the server mode of SQLite.
14 # This file is derived from thread1.test
16 # $Id: server1.test,v 1.5 2007/08/29 18:20:17 drh Exp $
19 set testdir [file dirname $argv0]
20 source $testdir/tester.tcl
22 # Skip this whole file if the server testing code is not enabled
24 if {[llength [info command client_step]]==0 || [sqlite3 -has-codec]} {
25   finish_test
26   return
29 # The sample server implementation does not work right when memory
30 # management is enabled.
32 ifcapable (memorymanage||mutex_noop) {
33   finish_test
34   return
37 # Create some data to work with
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}
50 # Interleave two threads on read access.  Then make sure a third
51 # thread can write the database.  In other words:
53 #    read-lock A
54 #    read-lock B
55 #    unlock A
56 #    unlock B
57 #    write-lock C
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}
107 # Read from table t1.  Do not finalize the statement.  This
108 # will leave the lock pending.
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
118 # Read from the same table from another thread.  This is allows.
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
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.
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
139 # But we cannot insert into table t1 because threads A and B have it locked.
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
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
169 client_halt *   
170 sqlite3_enable_shared_cache 0
171 finish_test