AryaWu/sqlite
0
1# 2017-07-152#3# The author disclaims copyright to this source code. In place of4# 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. The12# focus of this file is the "swarmvtab" extension13#14 15set testdir [file dirname $argv0]16source $testdir/tester.tcl17set testprefix swarmvtab18do_not_use_codec19 20ifcapable !vtab {21 finish_test22 return23}24 25load_static_extension db unionvtab26 27set nFile $sqlite_open_file_count28 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$i101 db2 eval " DELETE FROM t$i "102 db2 close103 }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_count120} [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_db137load_static_extension db unionvtab138do_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.db5166 167 sqlite3 db2 test.db15168 db2 eval { DROP TABLE t15 }169 db2 close170 171 sqlite3 db2 test.db25172 db2 eval { 173 DROP TABLE t25;174 CREATE TABLE t25(x, y, z PRIMARY KEY);175 }176 db2 close177} {}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_db208 209do_catchsql_test 3.1 {210 CREATE VIRTUAL TABLE temp.xyz USING swarmvtab(211 'VALUES212 (''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 'VALUES221 (''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 'VALUES236 (''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_test247 