1# 2017-07-15 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 file is the "swarmvtab" extension 13# 14 15set testdir [file dirname $argv0] 16source $testdir/tester.tcl 17set testprefix swarmvtab 18do_not_use_codec 19 20ifcapable !vtab { 21 finish_test 22 return 23} 24 25load_static_extension db unionvtab 26 27set nFile $sqlite_open_file_count 28 29do_execsql_test 1.0 { 30 CREATE TABLE t0(a INTEGER PRIMARY KEY, b TEXT); 31 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<400) 32 INSERT INTO t0 SELECT i, hex(randomblob(50)) FROM s; 33 34 CREATE TABLE dir(f, t, imin, imax); 35} 36 37do_test 1.1 { 38 for {set i 0} {$i < 40} {incr i} { 39 set iMin [expr $i*10 + 1] 40 set iMax [expr $iMin+9] 41 42 forcedelete "test.db$i" 43 execsql [subst { 44 ATTACH 'test.db$i' AS aux; 45 CREATE TABLE aux.t$i (a INTEGER PRIMARY KEY, b TEXT); 46 INSERT INTO aux.t$i SELECT * FROM t0 WHERE a BETWEEN $iMin AND $iMax; 47 DETACH aux; 48 INSERT INTO dir VALUES('test.db$i', 't$i', $iMin, $iMax); 49 }] 50 } 51 52 execsql { 53 CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 54 } 55} {} 56 57do_execsql_test 1.2 { 58 DROP TABLE s1; 59} {} 60 61do_execsql_test 1.3 { 62 CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 63 SELECT count(*) FROM s1 WHERE rowid<50; 64} {49} 65 66proc do_compare_test {tn where} { 67 set sql [subst { 68 SELECT (SELECT group_concat(a || ',' || b, ',') FROM t0 WHERE $where) 69 IS 70 (SELECT group_concat(a || ',' || b, ',') FROM s1 WHERE $where) 71 }] 72 73 uplevel [list do_execsql_test $tn $sql 1] 74} 75 76do_compare_test 1.4.1 "rowid = 700" 77do_compare_test 1.4.2 "rowid = -1" 78do_compare_test 1.4.3 "rowid = 0" 79do_compare_test 1.4.4 "rowid = 55" 80do_compare_test 1.4.5 "rowid BETWEEN 20 AND 100" 81do_compare_test 1.4.6 "rowid > 350" 82do_compare_test 1.4.7 "rowid >= 350" 83do_compare_test 1.4.8 "rowid >= 200" 84do_compare_test 1.4.9 "1" 85 86# Multiple simultaneous cursors. 87# 88do_execsql_test 1.5.1.(5-seconds-or-so) { 89 SELECT count(*) FROM s1 a, s1 b WHERE b.rowid<=200; 90} {80000} 91do_execsql_test 1.5.2 { 92 SELECT count(*) FROM s1 a, s1 b, s1 c 93 WHERE a.rowid=b.rowid AND b.rowid=c.rowid; 94} {400} 95 96# Empty source tables. 97# 98do_test 1.6.0 { 99 for {set i 0} {$i < 20} {incr i} { 100 sqlite3 db2 test.db$i 101 db2 eval " DELETE FROM t$i " 102 db2 close 103 } 104 db eval { DELETE FROM t0 WHERE rowid<=200 } 105} {} 106 107do_compare_test 1.6.1 "rowid = 700" 108do_compare_test 1.6.2 "rowid = -1" 109do_compare_test 1.6.3 "rowid = 0" 110do_compare_test 1.6.4 "rowid = 55" 111do_compare_test 1.6.5 "rowid BETWEEN 20 AND 100" 112do_compare_test 1.6.6 "rowid > 350" 113do_compare_test 1.6.7 "rowid >= 350" 114do_compare_test 1.6.8 "rowid >= 200" 115do_compare_test 1.6.9 "1" 116do_compare_test 1.6.10 "rowid >= 5" 117 118do_test 1.x { 119 set sqlite_open_file_count 120} [expr $nFile+9] 121 122do_test 1.y { db close } {} 123 124# Delete all the database files created above. 125# 126for {set i 0} {$i < 40} {incr i} { forcedelete "test.db$i" } 127 128#------------------------------------------------------------------------- 129# Test some error conditions: 130# 131# 2.1: Database file does not exist. 132# 2.2: Table does not exist. 133# 2.3: Table schema does not match. 134# 2.4: Syntax error in SELECT statement. 135# 136reset_db 137load_static_extension db unionvtab 138do_test 2.0.1 { 139 db eval { 140 CREATE TABLE t0(a INTEGER PRIMARY KEY, b TEXT); 141 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<400) 142 INSERT INTO t0 SELECT i, hex(randomblob(50)) FROM s; 143 CREATE TABLE dir(f, t, imin, imax); 144 } 145 146 for {set i 0} {$i < 40} {incr i} { 147 set iMin [expr $i*10 + 1] 148 set iMax [expr $iMin+9] 149 150 forcedelete "test.db$i" 151 db eval [subst { 152 ATTACH 'test.db$i' AS aux; 153 CREATE TABLE aux.t$i (a INTEGER PRIMARY KEY, b TEXT); 154 INSERT INTO aux.t$i SELECT * FROM t0 WHERE a BETWEEN $iMin AND $iMax; 155 DETACH aux; 156 INSERT INTO dir VALUES('test.db$i', 't$i', $iMin, $iMax); 157 }] 158 } 159 execsql { 160 CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 161 } 162} {} 163 164do_test 2.0.2 { 165 forcedelete test.db5 166 167 sqlite3 db2 test.db15 168 db2 eval { DROP TABLE t15 } 169 db2 close 170 171 sqlite3 db2 test.db25 172 db2 eval { 173 DROP TABLE t25; 174 CREATE TABLE t25(x, y, z PRIMARY KEY); 175 } 176 db2 close 177} {} 178 179do_catchsql_test 2.1 { 180 SELECT * FROM s1 WHERE rowid BETWEEN 1 AND 100; 181} {1 {unable to open database file}} 182do_catchsql_test 2.2 { 183 SELECT * FROM s1 WHERE rowid BETWEEN 101 AND 200; 184} {1 {no such rowid table: t15}} 185do_catchsql_test 2.3 { 186 SELECT * FROM s1 WHERE rowid BETWEEN 201 AND 300; 187} {1 {source table schema mismatch}} 188 189do_catchsql_test 2.4 { 190 CREATE VIRTUAL TABLE temp.x1 USING swarmvtab('SELECT * FROMdir'); 191} {1 {sql error: near "FROMdir": syntax error}} 192do_catchsql_test 2.5 { 193 CREATE VIRTUAL TABLE temp.x1 USING swarmvtab('SELECT * FROMdir', 'fetchdb'); 194} {1 {sql error: near "FROMdir": syntax error}} 195 196for {set i 0} {$i < 40} {incr i} { 197 forcedelete "test.db$i" 198} 199 200#------------------------------------------------------------------------- 201# Test the outcome of the fetch function throwing an exception. 202# 203proc fetch_db {file} { 204 error "fetch_db error!" 205} 206 207db func fetch_db fetch_db 208 209do_catchsql_test 3.1 { 210 CREATE VIRTUAL TABLE temp.xyz USING swarmvtab( 211 'VALUES 212 (''test.db1'', ''t1'', 1, 10), 213 (''test.db2'', ''t1'', 11, 20) 214 ', 'fetch_db_no_such_function' 215 ); 216} {1 {sql error: no such function: fetch_db_no_such_function}} 217 218do_catchsql_test 3.2 { 219 CREATE VIRTUAL TABLE temp.xyz USING swarmvtab( 220 'VALUES 221 (''test.db1'', ''t1'', 1, 10), 222 (''test.db2'', ''t1'', 11, 20) 223 ', 'fetch_db' 224 ); 225} {1 {fetch_db error!}} 226 227do_execsql_test 3.3.1 { 228 ATTACH 'test.db1' AS aux; 229 CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b); 230 INSERT INTO aux.t1 VALUES(1, NULL); 231 INSERT INTO aux.t1 VALUES(2, NULL); 232 INSERT INTO aux.t1 VALUES(9, NULL); 233 DETACH aux; 234 CREATE VIRTUAL TABLE temp.xyz USING swarmvtab( 235 'VALUES 236 (''test.db1'', ''t1'', 1, 10), 237 (''test.db2'', ''t1'', 11, 20) 238 ', 'fetch_db' 239 ); 240} {} 241 242do_catchsql_test 3.3.2 { SELECT * FROM xyz } {1 {fetch_db error!}} 243 244 245 246finish_test 247