1# 2014 June 17 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# This file implements regression tests for SQLite library. The 12# focus of this script is testing the FTS5 module. 13# 14# More specifically, the tests in this file focus on the built-in 15# snippet() function. 16# 17 18source [file join [file dirname [info script]] fts5_common.tcl] 19set testprefix fts5af 20 21# If SQLITE_ENABLE_FTS5 is defined, omit this file. 22ifcapable !fts5 { 23 finish_test 24 return 25} 26 27foreach_detail_mode $testprefix { 28 29do_execsql_test 1.0 { 30 CREATE VIRTUAL TABLE t1 USING fts5(x, y, detail=%DETAIL%); 31} 32 33proc do_snippet_test {tn doc match res} { 34 35 uplevel #0 [list set v1 $doc] 36 uplevel #0 [list set v2 $match] 37 38 do_execsql_test $tn.1 { 39 DELETE FROM t1; 40 INSERT INTO t1 VALUES($v1, NULL); 41 SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2; 42 } [list $res] 43 44 do_execsql_test $tn.2 { 45 DELETE FROM t1; 46 INSERT INTO t1 VALUES(NULL, $v1); 47 SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2; 48 } [list $res] 49 50 do_execsql_test $tn.3 { 51 DELETE FROM t1; 52 INSERT INTO t1 VALUES($v1, NULL); 53 SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2 54 ORDER BY rank DESC; 55 } [list $res] 56 57 58} 59 60 61foreach {tn doc res} { 62 63 1.1 {X o o o o o o} {[X] o o o o o o} 64 1.2 {o X o o o o o} {o [X] o o o o o} 65 1.3 {o o X o o o o} {o o [X] o o o o} 66 1.4 {o o o X o o o} {o o o [X] o o o} 67 1.5 {o o o o X o o} {o o o o [X] o o} 68 1.6 {o o o o o X o} {o o o o o [X] o} 69 1.7 {o o o o o o X} {o o o o o o [X]} 70 71 2.1 {X o o o o o o o} {[X] o o o o o o...} 72 2.2 {o X o o o o o o} {o [X] o o o o o...} 73 2.3 {o o X o o o o o} {o o [X] o o o o...} 74 2.4 {o o o X o o o o} {o o o [X] o o o...} 75 2.5 {o o o o X o o o} {o o o o [X] o o...} 76 2.6 {o o o o o X o o} {o o o o o [X] o...} 77 2.7 {o o o o o o X o} {o o o o o o [X]...} 78 2.8 {o o o o o o o X} {...o o o o o o [X]} 79 80 2.9 {o o o o o o o X o} {...o o o o o [X] o} 81 2.10 {o o o o o o o X o o} {...o o o o [X] o o} 82 2.11 {o o o o o o o X o o o} {...o o o [X] o o o} 83 2.12 {o o o o o o o X o o o o} {...o o o [X] o o o...} 84 85 86 3.1 {X o o o o o o o o} {[X] o o o o o o...} 87 3.2 {o X o o o o o o o} {o [X] o o o o o...} 88 3.3 {o o X o o o o o o} {o o [X] o o o o...} 89 3.4 {o o o X o o o o o} {o o o [X] o o o...} 90 91 3.5 {o o o o o o o X o o o o} {...o o o [X] o o o...} 92 3.6 {o o o o o o o o X o o o} {...o o o [X] o o o} 93 3.7 {o o o o o o o o o X o o} {...o o o o [X] o o} 94 3.8 {o o o o o o o o o o X o} {...o o o o o [X] o} 95 3.9 {o o o o o o o o o o o X} {...o o o o o o [X]} 96 97 4.1 {X o o o o o X o o} {[X] o o o o o [X]...} 98 4.2 {o o o o o o o X o o o o o X o} {...[X] o o o o o [X]...} 99 4.3 {o o o o o o o o X o o o o o X} {...[X] o o o o o [X]} 100 101 5.1 {X o o o o X o o o} {[X] o o o o [X] o...} 102 5.2 {o o o o o o o X o o o o X o o} {...[X] o o o o [X] o...} 103 5.3 {o o o o o o o o X o o o o X o} {...[X] o o o o [X] o} 104 5.4 {o o o o o o o o o X o o o o X} {...o [X] o o o o [X]} 105 106 6.1 {X o o o X o o o} {[X] o o o [X] o o...} 107 6.2 {o X o o o X o o o} {o [X] o o o [X] o...} 108 6.3 {o o o o o o o X o o o X o o} {...o [X] o o o [X] o...} 109 6.4 {o o o o o o o o X o o o X o} {...o [X] o o o [X] o} 110 6.5 {o o o o o o o o o X o o o X} {...o o [X] o o o [X]} 111 112 7.1 {X o o X o o o o o} {[X] o o [X] o o o...} 113 7.2 {o X o o X o o o o} {o [X] o o [X] o o...} 114 7.3 {o o o o o o o X o o X o o o} {...o [X] o o [X] o o...} 115 7.4 {o o o o o o o o X o o X o o} {...o [X] o o [X] o o} 116 7.5 {o o o o o o o o o X o o X o} {...o o [X] o o [X] o} 117 7.6 {o o o o o o o o o o X o o X} {...o o o [X] o o [X]} 118 119 8.1 {o o o o o o o o o X o o o o o o o o o o o o o o o o X X X o o o} 120 {...o o [X] [X] [X] o o...} 121 8.2 {o o o o o o o. o o X o o o o o o o o o o o o o o o o X X X o o o} 122 {...o o [X] o o o o...} 123 8.3 {o o o o X o o o o o o o o o o o o o o o o o o o o o X X X o o o} 124 {o o o o [X] o o...} 125} { 126 do_snippet_test 1.$tn $doc X $res 127} 128 129if {[detail_is_full]} { 130 foreach {tn doc res} { 131 1.1 {X Y o o o o o} {[X Y] o o o o o} 132 1.2 {o X Y o o o o} {o [X Y] o o o o} 133 1.3 {o o X Y o o o} {o o [X Y] o o o} 134 1.4 {o o o X Y o o} {o o o [X Y] o o} 135 1.5 {o o o o X Y o} {o o o o [X Y] o} 136 1.6 {o o o o o X Y} {o o o o o [X Y]} 137 138 2.1 {X Y o o o o o o} {[X Y] o o o o o...} 139 2.2 {o X Y o o o o o} {o [X Y] o o o o...} 140 2.3 {o o X Y o o o o} {o o [X Y] o o o...} 141 2.4 {o o o o o o o X Y o o o} {...o o [X Y] o o o} 142 2.5 {o o o o o o o o X Y o o} {...o o o [X Y] o o} 143 2.6 {o o o o o o o o o X Y o} {...o o o o [X Y] o} 144 2.7 {o o o o o o o o o o X Y} {...o o o o o [X Y]} 145 146 3.1 {X Y o o o o o o o} {[X Y] o o o o o...} 147 3.2 {o X Y o o o o o o} {o [X Y] o o o o...} 148 3.3 {o o X Y o o o o o} {o o [X Y] o o o...} 149 3.4 {o o o o o o o X Y o o o o} {...o o [X Y] o o o...} 150 3.5 {o o o o o o o o X Y o o o} {...o o [X Y] o o o} 151 3.6 {o o o o o o o o o X Y o o} {...o o o [X Y] o o} 152 3.7 {o o o o o o o o o o X Y o} {...o o o o [X Y] o} 153 3.8 {o o o o o o o o o o o X Y} {...o o o o o [X Y]} 154 } { 155 do_snippet_test 2.$tn $doc "X + Y" $res 156 } 157} 158 159do_execsql_test 4.0 { 160 CREATE VIRTUAL TABLE x1 USING fts5(a, b); 161 INSERT INTO x1 VALUES('xyz', '1 2 3 4 5 6 7 8 9 10 11 12 13'); 162 SELECT snippet(x1, 1, '[', ']', '...', 5) FROM x1('xyz'); 163} { 164 {1 2 3 4 5...} 165} 166 167do_execsql_test 5.0 { 168 CREATE VIRTUAL TABLE p1 USING fts5(a, b, detail=%DETAIL%); 169 INSERT INTO p1 VALUES( 170 'x a a a a a a a a a a', 171 'a a a a a a a a a a a a a a a a a a a x' 172 ); 173} 174do_execsql_test 5.1 { 175 SELECT snippet(p1, 0, '[', ']', '...', 6) FROM p1('x'); 176} {{[x] a a a a a...}} 177 178do_execsql_test 5.2 { 179 SELECT snippet(p1, 0, '[', ']', NULL, 6) FROM p1('x'); 180} {{[x] a a a a a}} 181do_execsql_test 5.3 { 182 SELECT snippet(p1, 0, NULL, ']', '...', 6) FROM p1('x'); 183} {{x] a a a a a...}} 184do_execsql_test 5.4 { 185 SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x'); 186} {{[x a a a a a...}} 187do_execsql_test 5.5 { 188 SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ""'); 189} {{[x a a a a a...}} 190do_execsql_test 5.6 { 191 SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ' || x'DB'); 192} {{[x a a a a a...}} 193 194} ;# foreach_detail_mode 195 196finish_test 197