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 194