|
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.3 2008/07/12 14:52:21 drh 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 |