1# 2015 September 05 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# 12 13source [file join [file dirname [info script]] fts5_common.tcl] 14set testprefix fts5simple3 15 16# If SQLITE_ENABLE_FTS5 is defined, omit this file. 17ifcapable !fts5 { 18 finish_test 19 return 20} 21 22fts5_aux_test_functions db 23 24do_execsql_test 1.0 { 25 CREATE VIRTUAL TABLE t1 USING fts5(a, b, c, detail=col); 26 INSERT INTO t1 VALUES('a', 'b', 'c'); 27 INSERT INTO t1 VALUES('x', 'x', 'x'); 28} 29 30do_execsql_test 1.1 { 31 SELECT rowid, fts5_test_collist(t1) FROM t1('a:a'); 32} {1 0.0} 33 34do_execsql_test 1.2 { 35 SELECT rowid, fts5_test_collist(t1) FROM t1('b:x'); 36} {2 0.1} 37 38do_execsql_test 1.3 { 39 SELECT rowid, fts5_test_collist(t1) FROM t1('b:a'); 40} {} 41 42#------------------------------------------------------------------------- 43# Create detail=col and detail=full tables with 998 columns. 44# 45foreach_detail_mode $testprefix { 46 if {[detail_is_none]} continue 47 48 do_test 2.1 { 49 execsql { DROP TABLE IF EXISTS t2 } 50 set cols [list] 51 set vals [list] 52 for {set i 1} {$i <= 998} {incr i} { 53 lappend cols "c$i" 54 lappend vals "'val$i'" 55 } 56 execsql "CREATE VIRTUAL TABLE t2 USING fts5(detail=%DETAIL%,[join $cols ,])" 57 } {} 58 59 do_test 2.2 { 60 execsql "INSERT INTO t2 VALUES([join $vals ,])" 61 } {} 62 63 foreach {tn q res} { 64 1 { c1:val1 } 1 65 2 { c300:val300 } 1 66 3 { c300:val1 } {} 67 4 { c1:val300 } {} 68 } { 69 do_execsql_test 2.3.$tn { 70 SELECT rowid FROM t2($q) 71 } $res 72 } 73} 74 75do_execsql_test 3.0 { 76 CREATE VIRTUAL TABLE x3 USING fts5(one); 77 INSERT INTO x3 VALUES('a b c'); 78 INSERT INTO x3 VALUES('c b a'); 79 INSERT INTO x3 VALUES('o t t'); 80 SELECT * FROM x3('x OR y OR z'); 81} 82 83#------------------------------------------------------------------------- 84# Test that a crash occuring when the second or subsequent tokens in a 85# phrase matched zero rows has been fixed. 86# 87do_execsql_test 4.0 { 88 CREATE VIRTUAL TABLE t1 USING fts5(x); 89 INSERT INTO t1 VALUES('ab'); 90 INSERT INTO t1 VALUES('cd'); 91 INSERT INTO t1 VALUES('ab cd'); 92 INSERT INTO t1 VALUES('ab cdXXX'); 93 INSERT INTO t1 VALUES('abXXX cd'); 94} 95do_execsql_test 4.1 { 96 SELECT * FROM t1('"ab cd" OR "ab cd" *'); 97} {{ab cd} {ab cdXXX}} 98do_execsql_test 4.2 { 99 SELECT * FROM t1('"xy zz" OR "ab cd" *'); 100} {{ab cd} {ab cdXXX}} 101do_execsql_test 4.3 { 102 SELECT * FROM t1('"xy zz" OR "xy zz" *'); 103} 104do_execsql_test 4.4 { 105 SELECT * FROM t1('"ab cd" OR "xy zz" *'); 106} {{ab cd}} 107do_execsql_test 4.5 { 108 CREATE VIRTUAL TABLE t2 USING fts5(x); 109 INSERT INTO t2 VALUES('ab'); 110 INSERT INTO t2 VALUES('cd'); 111 INSERT INTO t2 VALUES('ef'); 112} 113do_execsql_test 4.6 { 114 SELECT * FROM t2('ab + xyz'); 115} 116 117 118finish_test 119