OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |