1624edacfSdan# 2017 March 22 2624edacfSdan# 3624edacfSdan# The author disclaims copyright to this source code. In place of 4624edacfSdan# a legal notice, here is a blessing: 5624edacfSdan# 6624edacfSdan# May you do good and not evil. 7624edacfSdan# May you find forgiveness for yourself and forgive others. 8624edacfSdan# May you share freely, never taking more than you give. 9624edacfSdan# 10624edacfSdan#************************************************************************* 11624edacfSdan# This file implements regression tests for SQLite library. The 12624edacfSdan# focus of this script is testing the FTS3 module. 13624edacfSdan# 14624edacfSdan 15624edacfSdanset testdir [file dirname $argv0] 16624edacfSdansource $testdir/tester.tcl 17624edacfSdanset testprefix fts3misc 18624edacfSdan 19624edacfSdan# If SQLITE_ENABLE_FTS3 is defined, omit this file. 20624edacfSdanifcapable !fts3 { 21624edacfSdan finish_test 22624edacfSdan return 23624edacfSdan} 24624edacfSdan 25624edacfSdan#------------------------------------------------------------------------- 26624edacfSdan# A self-join. 27624edacfSdan# 28624edacfSdando_execsql_test 1.0 { 29624edacfSdan CREATE VIRTUAL TABLE t1 USING fts3(a, b); 30624edacfSdan INSERT INTO t1 VALUES('one', 'i'); 31624edacfSdan INSERT INTO t1 VALUES('one', 'ii'); 32624edacfSdan INSERT INTO t1 VALUES('two', 'i'); 33624edacfSdan INSERT INTO t1 VALUES('two', 'ii'); 34624edacfSdan} 35624edacfSdan 36624edacfSdando_execsql_test 1.1 { 37624edacfSdan SELECT a.a, b.b FROM t1 a, t1 b WHERE a.t1 MATCH 'two' AND b.t1 MATCH 'i' 38624edacfSdan} {two i two i two i two i} 39624edacfSdan 40624edacfSdan#------------------------------------------------------------------------- 41624edacfSdan# FTS tables with 128 or more columns. 42624edacfSdan# 43624edacfSdanproc v1 {v} { 44624edacfSdan set vector [list a b c d e f g h] 45624edacfSdan set res [list] 46624edacfSdan for {set i 0} {$i<8} {incr i} { 47624edacfSdan if {$v & (1 << $i)} { lappend res [lindex $vector $i] } 48624edacfSdan } 49624edacfSdan set res 50624edacfSdan} 51624edacfSdanproc v2 {v} { 52624edacfSdan set vector [list d e f g h i j k] 53624edacfSdan set res [list] 54624edacfSdan for {set i 0} {$i<8} {incr i} { 55624edacfSdan if {$v & (1 << $i)} { lappend res [lindex $vector $i] } 56624edacfSdan } 57624edacfSdan set res 58624edacfSdan} 59624edacfSdandb func v1 v1 60624edacfSdandb func v2 v2 61624edacfSdan 62624edacfSdando_test 2.0 { 63624edacfSdan set cols [list] 64624edacfSdan for {set i 0} {$i<200} {incr i} { 65624edacfSdan lappend cols "c$i" 66624edacfSdan } 67624edacfSdan execsql "CREATE VIRTUAL TABLE t2 USING fts3([join $cols ,])" 68624edacfSdan execsql { 69624edacfSdan WITH data(i) AS ( 70624edacfSdan SELECT 1 UNION ALL SELECT i+1 FROM data WHERE i<200 71624edacfSdan ) 72624edacfSdan INSERT INTO t2(c198, c199) SELECT v1(i), v2(i) FROM data; 73624edacfSdan } 74624edacfSdan} {} 75624edacfSdando_execsql_test 2.1 { 76624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH '"a b c"' 77624edacfSdan} { 78624edacfSdan 7 15 23 31 39 47 55 63 71 79 87 95 103 111 79624edacfSdan 119 127 135 143 151 159 167 175 183 191 199 80624edacfSdan} 81624edacfSdando_execsql_test 2.2 { 82624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH '"g h i"' 83624edacfSdan} { 84624edacfSdan 56 57 58 59 60 61 62 63 120 121 122 123 124 85624edacfSdan 125 126 127 184 185 186 187 188 189 190 191 86624edacfSdan} 87624edacfSdando_execsql_test 2.3 { 88624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH '"i h"' 89624edacfSdan} { 90624edacfSdan} 91624edacfSdando_execsql_test 2.4 { 92624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH '"f e"' 93624edacfSdan} { 94624edacfSdan} 95624edacfSdando_execsql_test 2.5 { 96624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH '"e f"' 97624edacfSdan} { 98624edacfSdan 6 7 14 15 22 23 30 31 38 39 46 47 48 49 50 51 52 53 54 55 56 99624edacfSdan 57 58 59 60 61 62 63 70 71 78 79 86 87 94 95 102 103 110 100624edacfSdan 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 101624edacfSdan 134 135 142 143 150 151 158 159 166 167 174 175 176 177 178 179 180 102624edacfSdan 181 182 183 184 185 186 187 188 189 190 191 198 199 103624edacfSdan} 104624edacfSdan 105a059e99cSdan#------------------------------------------------------------------------- 106624edacfSdan# Range constraints on the docid using non-integer values. 107624edacfSdan# 108624edacfSdando_execsql_test 2.6 { 109624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN NULL AND 45; 110624edacfSdan} {} 111624edacfSdando_execsql_test 2.7 { 112624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN 11.5 AND 48.2; 113624edacfSdan} { 114624edacfSdan 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 115624edacfSdan 29 30 31 34 35 38 39 42 43 46 47 48 116624edacfSdan} 117624edacfSdando_execsql_test 2.8 { 118624edacfSdan SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN '11.5' AND '48.2'; 119624edacfSdan} { 120624edacfSdan 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 121624edacfSdan 29 30 31 34 35 38 39 42 43 46 47 48 122624edacfSdan} 123624edacfSdan 124a059e99cSdan#------------------------------------------------------------------------- 125a059e99cSdan# Phrase query tests. 126a059e99cSdan# 127a059e99cSdando_execsql_test 3.1.1 { 128a059e99cSdan CREATE VIRTUAL TABLE t3 USING fts3; 129a059e99cSdan INSERT INTO t3 VALUES('a b c'); 130a059e99cSdan INSERT INTO t3 VALUES('d e f'); 131a059e99cSdan INSERT INTO t3 VALUES('a b d'); 132a059e99cSdan INSERT INTO t3 VALUES('1 2 3 4 5 6 7 8 9 10 11'); 133a059e99cSdan} 134a059e99cSdando_execsql_test 3.1.2 { 135a059e99cSdan SELECT * FROM t3 WHERE t3 MATCH '"a b x y"' ORDER BY docid DESC 136a059e99cSdan} 137a059e99cSdando_execsql_test 3.1.3 { 138a059e99cSdan SELECT * FROM t3 WHERE t3 MATCH '"a b c" OR "a b x y"' ORDER BY docid DESC 139a059e99cSdan} {{a b c}} 140a059e99cSdando_execsql_test 3.1.4 { 141a059e99cSdan SELECT * FROM t3 WHERE t3 MATCH '"a* b* x* a*"' 142a059e99cSdan} 143a059e99cSdando_execsql_test 3.1.5 { 144a059e99cSdan SELECT rowid FROM t3 WHERE t3 MATCH '"2 3 4 5 6 7 8 9"' 145a059e99cSdan} {4} 146a059e99cSdan 147a059e99cSdan#------------------------------------------------------------------------- 148a059e99cSdan# 149a059e99cSdanreset_db 1507b458519Sdanifcapable fts4_deferred { 151a059e99cSdan do_execsql_test 4.0 { 152a059e99cSdan PRAGMA page_size = 512; 153a059e99cSdan CREATE VIRTUAL TABLE t4 USING fts4; 154a059e99cSdan WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<8000 ) 155a059e99cSdan INSERT INTO t4 SELECT 'a b c a b c a b c' FROM s; 156a059e99cSdan } 157a059e99cSdan do_execsql_test 4.1 { 158a059e99cSdan SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"' 159a059e99cSdan } {8000} 160a059e99cSdan do_execsql_test 4.2 { 161a059e99cSdan SELECT quote(value) from t4_stat where id=0 162a059e99cSdan } {X'C03EC0B204C0A608'} 1630f0d3ddfSdrh sqlite3_db_config db DEFENSIVE 0 164a059e99cSdan do_execsql_test 4.3 { 165a059e99cSdan UPDATE t4_stat SET value = X'C03EC0B204C0A60800' WHERE id=0; 166a059e99cSdan } 167a059e99cSdan do_catchsql_test 4.4 { 168a059e99cSdan SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"' 169a059e99cSdan } {1 {database disk image is malformed}} 170a059e99cSdan do_execsql_test 4.5 { 171a059e99cSdan UPDATE t4_stat SET value = X'00C03EC0B204C0A608' WHERE id=0; 172a059e99cSdan } 173a059e99cSdan do_catchsql_test 4.6 { 174a059e99cSdan SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"' 175a059e99cSdan } {1 {database disk image is malformed}} 1767b458519Sdan} 177a059e99cSdan 178dc62dacaSdan#------------------------------------------------------------------------- 179dc62dacaSdan# 180dc62dacaSdanreset_db 181dc62dacaSdando_execsql_test 5.0 { 182dc62dacaSdan CREATE VIRTUAL TABLE t5 USING fts4; 183dc62dacaSdan INSERT INTO t5 VALUES('a x x x x b x x x x c'); 184dc62dacaSdan INSERT INTO t5 VALUES('a x x x x b x x x x c'); 185dc62dacaSdan INSERT INTO t5 VALUES('a x x x x b x x x x c'); 186dc62dacaSdan} 187dc62dacaSdando_execsql_test 5.1 { 188dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/4 c' 189dc62dacaSdan} {1 2 3} 190dc62dacaSdando_execsql_test 5.2 { 191dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/3 b NEAR/4 c' 192dc62dacaSdan} {} 193dc62dacaSdando_execsql_test 5.3 { 194dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/3 c' 195dc62dacaSdan} {} 196dc62dacaSdando_execsql_test 5.4 { 197dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'y NEAR/4 b NEAR/4 c' 198dc62dacaSdan} {} 199dc62dacaSdando_execsql_test 5.5 { 200dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'x OR a NEAR/3 b NEAR/3 c' 201dc62dacaSdan} {1 2 3} 202dc62dacaSdando_execsql_test 5.5 { 203dc62dacaSdan SELECT rowid FROM t5 WHERE t5 MATCH 'x OR y NEAR/3 b NEAR/3 c' 204dc62dacaSdan} {1 2 3} 205dc62dacaSdan 206dc62dacaSdan#------------------------------------------------------------------------- 207dc62dacaSdan# 208dc62dacaSdanreset_db 209dc62dacaSdando_execsql_test 6.0 { 210dc62dacaSdan CREATE VIRTUAL TABLE t6 USING fts4; 211dc62dacaSdan 212dc62dacaSdan BEGIN; 213dc62dacaSdan WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000) 214dc62dacaSdan INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s; 215dc62dacaSdan 216dc62dacaSdan INSERT INTO t6 VALUES('x x x x x x x x x x x A'); 217dc62dacaSdan INSERT INTO t6 VALUES('x x x x x x x x x x x B'); 218dc62dacaSdan INSERT INTO t6 VALUES('x x x x x x x x x x x A'); 219dc62dacaSdan INSERT INTO t6 VALUES('x x x x x x x x x x x B'); 220dc62dacaSdan 221dc62dacaSdan WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000) 222dc62dacaSdan INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s; 223dc62dacaSdan COMMIT; 224dc62dacaSdan} 225dc62dacaSdando_execsql_test 6.1 { 226dc62dacaSdan SELECT rowid FROM t6 WHERE t6 MATCH 'b OR "x a"' 227dc62dacaSdan} {50001 50002 50003 50004} 228dc62dacaSdan 229cd790109Sdan#------------------------------------------------------------------------- 230cd790109Sdan# 231cd790109Sdanreset_db 232cd790109Sdando_execsql_test 7.0 { 233cd790109Sdan CREATE VIRTUAL TABLE vt0 USING fts3(c0); 234cd790109Sdan INSERT INTO vt0 VALUES (x'00'); 235cd790109Sdan} 236cd790109Sdando_execsql_test 7.1 { 237cd790109Sdan INSERT INTO vt0(vt0) VALUES('integrity-check'); 238cd790109Sdan} 239cd790109Sdan 2409613c9f4Sdan#------------------------------------------------------------------------- 2418b4d0e2cSdan# Ticket [8a6fa2bb]. 2429613c9f4Sdan# 2439613c9f4Sdanreset_db 2449613c9f4Sdando_execsql_test 7.0.1 { 2459613c9f4Sdan CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=DESC); 2469613c9f4Sdan INSERT INTO vt0(c0) VALUES (0), (0); 2479613c9f4Sdan} 2489613c9f4Sdando_execsql_test 7.0.2 { 2499613c9f4Sdan INSERT INTO vt0(vt0) VALUES('integrity-check'); 2509613c9f4Sdan} 2519613c9f4Sdanreset_db 2529613c9f4Sdando_execsql_test 7.1.1 { 2539613c9f4Sdan CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=ASC); 2549613c9f4Sdan INSERT INTO vt0(c0) VALUES (0), (0); 2559613c9f4Sdan} 2569613c9f4Sdando_execsql_test 7.1.2 { 2579613c9f4Sdan INSERT INTO vt0(vt0) VALUES('integrity-check'); 2589613c9f4Sdan} 2599613c9f4Sdando_execsql_test 7.2.1 { 2609613c9f4Sdan CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1); 2619613c9f4Sdan INSERT INTO ft VALUES('a b c d', 'hello world'); 2629613c9f4Sdan INSERT INTO ft VALUES('negative', 'positive'); 2639613c9f4Sdan INSERT INTO ft VALUES('hello world', 'a b c d'); 2649613c9f4Sdan} 2659613c9f4Sdando_execsql_test 7.2.2 { 2669613c9f4Sdan INSERT INTO vt0(vt0) VALUES('integrity-check'); 2679613c9f4Sdan} 2689613c9f4Sdan 2698b4d0e2cSdan#------------------------------------------------------------------------- 2708b4d0e2cSdan# Ticket [745f1abc]. 2718b4d0e2cSdan# 2728b4d0e2cSdanreset_db 2738b4d0e2cSdando_execsql_test 8.1 { 2748b4d0e2cSdan CREATE VIRTUAL TABLE vt0 USING fts4(c0, prefix=1); 2758b4d0e2cSdan} 2768b4d0e2cSdando_execsql_test 8.2 { 2778b4d0e2cSdan BEGIN; 2788b4d0e2cSdan INSERT INTO vt0 VALUES (0); 2798b4d0e2cSdan INSERT INTO vt0(vt0) VALUES('optimize'); 2808b4d0e2cSdan COMMIT; 2818b4d0e2cSdan} 2828b4d0e2cSdando_execsql_test 8.3 { 2838b4d0e2cSdan INSERT INTO vt0(vt0) VALUES('integrity-check'); 2848b4d0e2cSdan} 285624edacfSdan 2869930cfe8Sdan#------------------------------------------------------------------------- 2879930cfe8Sdan# 2889930cfe8Sdanreset_db 2899930cfe8Sdando_execsql_test 9.0 { 2909930cfe8Sdan CREATE VIRTUAL TABLE t1 using fts4(mailcontent); 2919930cfe8Sdan insert into t1(rowid, mailcontent) values 2929930cfe8Sdan (-4764623217061966105, 'we are going to upgrade'), 2939930cfe8Sdan (8324454597464624651, 'we are going to upgrade'); 2949930cfe8Sdan} 2959930cfe8Sdan 2969930cfe8Sdando_execsql_test 9.1 { 2979930cfe8Sdan INSERT INTO t1(t1) VALUES('integrity-check'); 2989930cfe8Sdan} 2999930cfe8Sdan 3009930cfe8Sdando_execsql_test 9.2 { 3019930cfe8Sdan SELECT rowid FROM t1 WHERE t1 MATCH 'upgrade'; 3029930cfe8Sdan} { 3039930cfe8Sdan -4764623217061966105 8324454597464624651 3049930cfe8Sdan} 3059930cfe8Sdan 306ec8e689aSdan#------------------------------------------------------------------------- 307ec8e689aSdanreset_db 308ec8e689aSdando_execsql_test 10.0 { 309ec8e689aSdan CREATE VIRTUAL TABLE f USING fts3(a,b); 310ec8e689aSdan CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB); 311ec8e689aSdan INSERT INTO f_stat VALUES (1,x'3b3b3b3b3b3b3b28ffffffffffffffffff1807f9073481f1d43bc93b3b3b3b3b3b3b3b3b3b18073b3b3b3b3b3b3b9b003b'); 312ec8e689aSdan} {} 313ec8e689aSdan 314ec8e689aSdando_catchsql_test 10.1 { 315ec8e689aSdan INSERT INTO f(f) VALUES ('merge=69,59'); 316ec8e689aSdan} {1 {database disk image is malformed}} 317ec8e689aSdan 318*fc7f3174Sdan#------------------------------------------------------------------------- 319*fc7f3174Sdando_execsql_test 11.0 { 320*fc7f3174Sdan CREATE VIRTUAL TABLE xyz USING fts3(); 321*fc7f3174Sdan} 322*fc7f3174Sdando_execsql_test 11.1 { 323*fc7f3174Sdan SELECT * FROM xyz WHERE xyz MATCH 'a NEAR/4294836224 a'; 324*fc7f3174Sdan} 325*fc7f3174Sdan 326624edacfSdanfinish_test 327