163331b1aSdan# 2017-07-15 263331b1aSdan# 363331b1aSdan# The author disclaims copyright to this source code. In place of 463331b1aSdan# a legal notice, here is a blessing: 563331b1aSdan# 663331b1aSdan# May you do good and not evil. 763331b1aSdan# May you find forgiveness for yourself and forgive others. 863331b1aSdan# May you share freely, never taking more than you give. 963331b1aSdan# 1063331b1aSdan#*********************************************************************** 1163331b1aSdan# This file implements regression tests for SQLite library. The 1263331b1aSdan# focus of this file is the "swarmvtab" extension 1363331b1aSdan# 1463331b1aSdan 1563331b1aSdanset testdir [file dirname $argv0] 1663331b1aSdansource $testdir/tester.tcl 1763331b1aSdanset testprefix swarmvtab 1863331b1aSdan 1963331b1aSdanifcapable !vtab { 2063331b1aSdan finish_test 2163331b1aSdan return 2263331b1aSdan} 2363331b1aSdan 2463331b1aSdanload_static_extension db unionvtab 2563331b1aSdan 26a64d1fbcSdanset nFile $sqlite_open_file_count 27a64d1fbcSdan 2863331b1aSdando_execsql_test 1.0 { 2963331b1aSdan CREATE TABLE t0(a INTEGER PRIMARY KEY, b TEXT); 3063331b1aSdan WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<400) 3163331b1aSdan INSERT INTO t0 SELECT i, hex(randomblob(50)) FROM s; 3263331b1aSdan 3363331b1aSdan CREATE TABLE dir(f, t, imin, imax); 3463331b1aSdan} 3563331b1aSdan 3663331b1aSdando_test 1.1 { 3763331b1aSdan for {set i 0} {$i < 40} {incr i} { 3863331b1aSdan set iMin [expr $i*10 + 1] 3963331b1aSdan set iMax [expr $iMin+9] 4063331b1aSdan 4163331b1aSdan forcedelete "test.db$i" 4263331b1aSdan execsql [subst { 4363331b1aSdan ATTACH 'test.db$i' AS aux; 4463331b1aSdan CREATE TABLE aux.t$i (a INTEGER PRIMARY KEY, b TEXT); 4563331b1aSdan INSERT INTO aux.t$i SELECT * FROM t0 WHERE a BETWEEN $iMin AND $iMax; 4663331b1aSdan DETACH aux; 4763331b1aSdan INSERT INTO dir VALUES('test.db$i', 't$i', $iMin, $iMax); 4863331b1aSdan }] 4963331b1aSdan } 5063331b1aSdan 5163331b1aSdan execsql { 5263331b1aSdan CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 5363331b1aSdan } 54a64d1fbcSdan} {} 5563331b1aSdan 5663331b1aSdando_execsql_test 1.2 { 5763331b1aSdan DROP TABLE s1; 58a64d1fbcSdan} {} 5963331b1aSdan 6063331b1aSdando_execsql_test 1.3 { 6163331b1aSdan CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 6263331b1aSdan SELECT count(*) FROM s1 WHERE rowid<50; 6363331b1aSdan} {49} 6463331b1aSdan 6563331b1aSdanproc do_compare_test {tn where} { 6663331b1aSdan set sql [subst { 67*0ff22170Sdan SELECT (SELECT group_concat(a || ',' || b, ',') FROM t0 WHERE $where) 68*0ff22170Sdan IS 69*0ff22170Sdan (SELECT group_concat(a || ',' || b, ',') FROM s1 WHERE $where) 7063331b1aSdan }] 7163331b1aSdan 7263331b1aSdan uplevel [list do_execsql_test $tn $sql 1] 7363331b1aSdan} 7463331b1aSdan 75*0ff22170Sdando_compare_test 1.4.1 "rowid = 700" 76*0ff22170Sdando_compare_test 1.4.2 "rowid = -1" 77*0ff22170Sdando_compare_test 1.4.3 "rowid = 0" 78*0ff22170Sdando_compare_test 1.4.4 "rowid = 55" 79*0ff22170Sdando_compare_test 1.4.5 "rowid BETWEEN 20 AND 100" 80*0ff22170Sdando_compare_test 1.4.6 "rowid > 350" 81*0ff22170Sdando_compare_test 1.4.7 "rowid >= 350" 82*0ff22170Sdando_compare_test 1.4.8 "rowid >= 200" 83*0ff22170Sdando_compare_test 1.4.9 "1" 84*0ff22170Sdan 85*0ff22170Sdan# Multiple simultaneous cursors. 86*0ff22170Sdan# 87*0ff22170Sdando_execsql_test 1.5.1.(5-seconds-or-so) { 88*0ff22170Sdan SELECT count(*) FROM s1 a, s1 b WHERE b.rowid<=200; 89*0ff22170Sdan} {80000} 90*0ff22170Sdando_execsql_test 1.5.2 { 91*0ff22170Sdan SELECT count(*) FROM s1 a, s1 b, s1 c 92*0ff22170Sdan WHERE a.rowid=b.rowid AND b.rowid=c.rowid; 93*0ff22170Sdan} {400} 94*0ff22170Sdan 95*0ff22170Sdan# Empty source tables. 96*0ff22170Sdan# 97*0ff22170Sdando_test 1.6.0 { 98*0ff22170Sdan for {set i 0} {$i < 20} {incr i} { 99*0ff22170Sdan sqlite3 db2 test.db$i 100*0ff22170Sdan db2 eval " DELETE FROM t$i " 101*0ff22170Sdan db2 close 102*0ff22170Sdan } 103*0ff22170Sdan db eval { DELETE FROM t0 WHERE rowid<=200 } 104*0ff22170Sdan} {} 105*0ff22170Sdan 106*0ff22170Sdando_compare_test 1.6.1 "rowid = 700" 107*0ff22170Sdando_compare_test 1.6.2 "rowid = -1" 108*0ff22170Sdando_compare_test 1.6.3 "rowid = 0" 109*0ff22170Sdando_compare_test 1.6.4 "rowid = 55" 110*0ff22170Sdando_compare_test 1.6.5 "rowid BETWEEN 20 AND 100" 111*0ff22170Sdando_compare_test 1.6.6 "rowid > 350" 112*0ff22170Sdando_compare_test 1.6.7 "rowid >= 350" 113*0ff22170Sdando_compare_test 1.6.8 "rowid >= 200" 114*0ff22170Sdando_compare_test 1.6.9 "1" 115*0ff22170Sdando_compare_test 1.6.10 "rowid >= 5" 11663331b1aSdan 117a64d1fbcSdando_test 1.x { 118a64d1fbcSdan set sqlite_open_file_count 119a64d1fbcSdan} [expr $nFile+9] 120a64d1fbcSdan 121a64d1fbcSdando_test 1.y { db close } {} 12263331b1aSdan 123*0ff22170Sdan# Delete all the database files created above. 124*0ff22170Sdan# 125*0ff22170Sdanfor {set i 0} {$i < 40} {incr i} { forcedelete "test.db$i" } 126*0ff22170Sdan 127*0ff22170Sdan#------------------------------------------------------------------------- 128*0ff22170Sdan# Test some error conditions: 129*0ff22170Sdan# 130*0ff22170Sdan# 2.1: Database file does not exist. 131*0ff22170Sdan# 2.2: Table does not exist. 132*0ff22170Sdan# 2.3: Table schema does not match. 133*0ff22170Sdan# 134*0ff22170Sdanreset_db 135*0ff22170Sdanload_static_extension db unionvtab 136*0ff22170Sdando_test 2.0.1 { 137*0ff22170Sdan db eval { 138*0ff22170Sdan CREATE TABLE t0(a INTEGER PRIMARY KEY, b TEXT); 139*0ff22170Sdan WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<400) 140*0ff22170Sdan INSERT INTO t0 SELECT i, hex(randomblob(50)) FROM s; 141*0ff22170Sdan CREATE TABLE dir(f, t, imin, imax); 142*0ff22170Sdan } 143*0ff22170Sdan 144*0ff22170Sdan for {set i 0} {$i < 40} {incr i} { 145*0ff22170Sdan set iMin [expr $i*10 + 1] 146*0ff22170Sdan set iMax [expr $iMin+9] 147*0ff22170Sdan 148*0ff22170Sdan forcedelete "test.db$i" 149*0ff22170Sdan db eval [subst { 150*0ff22170Sdan ATTACH 'test.db$i' AS aux; 151*0ff22170Sdan CREATE TABLE aux.t$i (a INTEGER PRIMARY KEY, b TEXT); 152*0ff22170Sdan INSERT INTO aux.t$i SELECT * FROM t0 WHERE a BETWEEN $iMin AND $iMax; 153*0ff22170Sdan DETACH aux; 154*0ff22170Sdan INSERT INTO dir VALUES('test.db$i', 't$i', $iMin, $iMax); 155*0ff22170Sdan }] 156*0ff22170Sdan } 157*0ff22170Sdan execsql { 158*0ff22170Sdan CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); 159*0ff22170Sdan } 160*0ff22170Sdan} {} 161*0ff22170Sdan 162*0ff22170Sdando_test 2.0.2 { 163*0ff22170Sdan forcedelete test.db5 164*0ff22170Sdan 165*0ff22170Sdan sqlite3 db2 test.db15 166*0ff22170Sdan db2 eval { DROP TABLE t15 } 167*0ff22170Sdan db2 close 168*0ff22170Sdan 169*0ff22170Sdan sqlite3 db2 test.db25 170*0ff22170Sdan db2 eval { 171*0ff22170Sdan DROP TABLE t25; 172*0ff22170Sdan CREATE TABLE t25(x, y, z PRIMARY KEY); 173*0ff22170Sdan } 174*0ff22170Sdan db2 close 175*0ff22170Sdan} {} 176*0ff22170Sdan 177*0ff22170Sdando_catchsql_test 2.1 { 178*0ff22170Sdan SELECT * FROM s1 WHERE rowid BETWEEN 1 AND 100; 179*0ff22170Sdan} {1 {unable to open database file}} 180*0ff22170Sdando_catchsql_test 2.2 { 181*0ff22170Sdan SELECT * FROM s1 WHERE rowid BETWEEN 101 AND 200; 182*0ff22170Sdan} {1 {no such rowid table: t15}} 183*0ff22170Sdando_catchsql_test 2.3 { 184*0ff22170Sdan SELECT * FROM s1 WHERE rowid BETWEEN 201 AND 300; 185*0ff22170Sdan} {1 {source table schema mismatch}} 18663331b1aSdan 18763331b1aSdanfinish_test 18863331b1aSdan 189