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.1.1.1 2012/02/21 17:04:16 misho 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 $cmdlinearg(soft-heap-limit)
145: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>