xref: /sqlite-3.40.0/test/swarmvtab.test (revision 0ff22170)
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