1: # 2006 June 10
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 is on testing the following virtual table methods:
13: #
14: # xBegin
15: # xSync
16: # xCommit
17: # xRollback
18: #
19: # $Id: vtab4.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
20:
21: set testdir [file dirname $argv0]
22: source $testdir/tester.tcl
23:
24: unset -nocomplain echo_module
25: unset -nocomplain echo_module_sync_fail
26:
27: ifcapable !vtab {
28: finish_test
29: return
30: }
31:
32: # Register the echo module
33: db cache size 0
34: register_echo_module [sqlite3_connection_pointer db]
35:
36: do_test vtab4-1.1 {
37: execsql {
38: CREATE TABLE treal(a PRIMARY KEY, b, c);
39: CREATE VIRTUAL TABLE techo USING echo(treal);
40: }
41: } {}
42:
43: # Test an INSERT, UPDATE and DELETE statement on the virtual table
44: # in an implicit transaction. Each should result in a single call
45: # to xBegin, xSync and xCommit.
46: #
47: do_test vtab4-1.2 {
48: set echo_module [list]
49: execsql {
50: INSERT INTO techo VALUES(1, 2, 3);
51: }
52: set echo_module
53: } {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
54: do_test vtab4-1.3 {
55: set echo_module [list]
56: execsql {
57: UPDATE techo SET a = 2;
58: }
59: set echo_module
60: } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
61: xBegin echo(treal) \
62: xFilter {SELECT rowid, * FROM 'treal'} \
63: xSync echo(treal) \
64: xCommit echo(treal) \
65: ]
66: do_test vtab4-1.4 {
67: set echo_module [list]
68: execsql {
69: DELETE FROM techo;
70: }
71: set echo_module
72: } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
73: xBegin echo(treal) \
74: xFilter {SELECT rowid, * FROM 'treal'} \
75: xSync echo(treal) \
76: xCommit echo(treal) \
77: ]
78:
79: # Ensure xBegin is not called more than once in a single transaction.
80: #
81: do_test vtab4-2.1 {
82: set echo_module [list]
83: execsql {
84: BEGIN;
85: INSERT INTO techo VALUES(1, 2, 3);
86: INSERT INTO techo VALUES(4, 5, 6);
87: INSERT INTO techo VALUES(7, 8, 9);
88: COMMIT;
89: }
90: set echo_module
91: } {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
92:
93: # Try a transaction with two virtual tables.
94: #
95: do_test vtab4-2.2 {
96: execsql {
97: CREATE TABLE sreal(a, b, c UNIQUE);
98: CREATE VIRTUAL TABLE secho USING echo(sreal);
99: }
100: set echo_module [list]
101: execsql {
102: BEGIN;
103: INSERT INTO secho SELECT * FROM techo;
104: DELETE FROM techo;
105: COMMIT;
106: }
107: set echo_module
108: } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
109: xBegin echo(sreal) \
110: xFilter {SELECT rowid, * FROM 'treal'} \
111: xBestIndex {SELECT rowid, * FROM 'treal'} \
112: xBegin echo(treal) \
113: xFilter {SELECT rowid, * FROM 'treal'} \
114: xSync echo(sreal) \
115: xSync echo(treal) \
116: xCommit echo(sreal) \
117: xCommit echo(treal) \
118: ]
119: do_test vtab4-2.3 {
120: execsql {
121: SELECT * FROM secho;
122: }
123: } {1 2 3 4 5 6 7 8 9}
124: do_test vtab4-2.4 {
125: execsql {
126: SELECT * FROM techo;
127: }
128: } {}
129:
130: # Try an explicit ROLLBACK on a transaction with two open virtual tables.
131: do_test vtab4-2.5 {
132: set echo_module [list]
133: execsql {
134: BEGIN;
135: INSERT INTO techo SELECT * FROM secho;
136: DELETE FROM secho;
137: ROLLBACK;
138: }
139: set echo_module
140: } [list xBestIndex {SELECT rowid, * FROM 'sreal'} \
141: xBegin echo(treal) \
142: xFilter {SELECT rowid, * FROM 'sreal'} \
143: xBestIndex {SELECT rowid, * FROM 'sreal'} \
144: xBegin echo(sreal) \
145: xFilter {SELECT rowid, * FROM 'sreal'} \
146: xRollback echo(treal) \
147: xRollback echo(sreal) \
148: ]
149: do_test vtab4-2.6 {
150: execsql {
151: SELECT * FROM secho;
152: }
153: } {1 2 3 4 5 6 7 8 9}
154: do_test vtab4-2.7 {
155: execsql {
156: SELECT * FROM techo;
157: }
158: } {}
159:
160: do_test vtab4-3.1 {
161: set echo_module [list]
162: set echo_module_sync_fail treal
163: catchsql {
164: INSERT INTO techo VALUES(1, 2, 3);
165: }
166: } {1 {unknown error}}
167: do_test vtab4-3.2 {
168: set echo_module
169: } {xBegin echo(treal) xSync echo(treal) xRollback echo(treal)}
170:
171: do_test vtab4-3.3 {
172: set echo_module [list]
173: set echo_module_sync_fail sreal
174: catchsql {
175: BEGIN;
176: INSERT INTO techo SELECT * FROM secho;
177: DELETE FROM secho;
178: COMMIT;
179: }
180: set echo_module
181: } [list xBestIndex {SELECT rowid, * FROM 'sreal'} \
182: xBegin echo(treal) \
183: xFilter {SELECT rowid, * FROM 'sreal'} \
184: xBestIndex {SELECT rowid, * FROM 'sreal'} \
185: xBegin echo(sreal) \
186: xFilter {SELECT rowid, * FROM 'sreal'} \
187: xSync echo(treal) \
188: xSync echo(sreal) \
189: xRollback echo(treal) \
190: xRollback echo(sreal) \
191: ]
192:
193: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>