dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 1 | # 2010 January 07 |
| 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 | # |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 12 | # The tests in this file test the FTS3 auxillary functions offsets(), |
| 13 | # snippet() and matchinfo() work. At time of writing, running this file |
| 14 | # provides full coverage of fts3_snippet.c. |
| 15 | # |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 16 | |
| 17 | set testdir [file dirname $argv0] |
| 18 | source $testdir/tester.tcl |
dan | 1f03e60 | 2013-09-30 18:14:45 +0000 | [diff] [blame] | 19 | set testprefix fts3snippet |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 20 | |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 21 | # If SQLITE_ENABLE_FTS3 is not defined, omit this file. |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 22 | ifcapable !fts3 { finish_test ; return } |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 23 | source $testdir/fts3_common.tcl |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 24 | |
| 25 | set sqlite_fts3_enable_parentheses 1 |
| 26 | set DO_MALLOC_TEST 0 |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 27 | |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 28 | # Transform the list $L to its "normal" form. So that it can be compared to |
| 29 | # another list with the same set of elements using [string compare]. |
| 30 | # |
| 31 | proc normalize {L} { |
| 32 | set ret [list] |
| 33 | foreach l $L {lappend ret $l} |
| 34 | return $ret |
| 35 | } |
| 36 | |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 37 | proc do_offsets_test {name expr args} { |
| 38 | set result [list] |
| 39 | foreach a $args { |
| 40 | lappend result [normalize $a] |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 41 | } |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 42 | do_select_test $name { |
| 43 | SELECT offsets(ft) FROM ft WHERE ft MATCH $expr |
| 44 | } $result |
| 45 | } |
| 46 | |
| 47 | # Document text used by a few tests. Contains the English names of all |
| 48 | # integers between 1 and 300. |
| 49 | # |
| 50 | set numbers [normalize { |
| 51 | one two three four five six seven eight nine ten eleven twelve thirteen |
| 52 | fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone |
| 53 | twentytwo twentythree twentyfour twentyfive twentysix twentyseven |
| 54 | twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour |
| 55 | thirtyfive thirtysix thirtyseven thirtyeight thirtynine forty fortyone |
| 56 | fortytwo fortythree fortyfour fortyfive fortysix fortyseven fortyeight |
| 57 | fortynine fifty fiftyone fiftytwo fiftythree fiftyfour fiftyfive fiftysix |
| 58 | fiftyseven fiftyeight fiftynine sixty sixtyone sixtytwo sixtythree sixtyfour |
| 59 | sixtyfive sixtysix sixtyseven sixtyeight sixtynine seventy seventyone |
| 60 | seventytwo seventythree seventyfour seventyfive seventysix seventyseven |
| 61 | seventyeight seventynine eighty eightyone eightytwo eightythree eightyfour |
| 62 | eightyfive eightysix eightyseven eightyeight eightynine ninety ninetyone |
| 63 | ninetytwo ninetythree ninetyfour ninetyfive ninetysix ninetyseven |
| 64 | ninetyeight ninetynine onehundred onehundredone onehundredtwo |
| 65 | onehundredthree onehundredfour onehundredfive onehundredsix onehundredseven |
| 66 | onehundredeight onehundrednine onehundredten onehundredeleven |
| 67 | onehundredtwelve onehundredthirteen onehundredfourteen onehundredfifteen |
| 68 | onehundredsixteen onehundredseventeen onehundredeighteen onehundrednineteen |
| 69 | onehundredtwenty onehundredtwentyone onehundredtwentytwo |
| 70 | onehundredtwentythree onehundredtwentyfour onehundredtwentyfive |
| 71 | onehundredtwentysix onehundredtwentyseven onehundredtwentyeight |
| 72 | onehundredtwentynine onehundredthirty onehundredthirtyone |
| 73 | onehundredthirtytwo onehundredthirtythree onehundredthirtyfour |
| 74 | onehundredthirtyfive onehundredthirtysix onehundredthirtyseven |
| 75 | onehundredthirtyeight onehundredthirtynine onehundredforty |
| 76 | onehundredfortyone onehundredfortytwo onehundredfortythree |
| 77 | onehundredfortyfour onehundredfortyfive onehundredfortysix |
| 78 | onehundredfortyseven onehundredfortyeight onehundredfortynine |
| 79 | onehundredfifty onehundredfiftyone onehundredfiftytwo onehundredfiftythree |
| 80 | onehundredfiftyfour onehundredfiftyfive onehundredfiftysix |
| 81 | onehundredfiftyseven onehundredfiftyeight onehundredfiftynine |
| 82 | onehundredsixty onehundredsixtyone onehundredsixtytwo onehundredsixtythree |
| 83 | onehundredsixtyfour onehundredsixtyfive onehundredsixtysix |
| 84 | onehundredsixtyseven onehundredsixtyeight onehundredsixtynine |
| 85 | onehundredseventy onehundredseventyone onehundredseventytwo |
| 86 | onehundredseventythree onehundredseventyfour onehundredseventyfive |
| 87 | onehundredseventysix onehundredseventyseven onehundredseventyeight |
| 88 | onehundredseventynine onehundredeighty onehundredeightyone |
| 89 | onehundredeightytwo onehundredeightythree onehundredeightyfour |
| 90 | onehundredeightyfive onehundredeightysix onehundredeightyseven |
| 91 | onehundredeightyeight onehundredeightynine onehundredninety |
| 92 | onehundredninetyone onehundredninetytwo onehundredninetythree |
| 93 | onehundredninetyfour onehundredninetyfive onehundredninetysix |
| 94 | onehundredninetyseven onehundredninetyeight onehundredninetynine twohundred |
| 95 | twohundredone twohundredtwo twohundredthree twohundredfour twohundredfive |
| 96 | twohundredsix twohundredseven twohundredeight twohundrednine twohundredten |
| 97 | twohundredeleven twohundredtwelve twohundredthirteen twohundredfourteen |
| 98 | twohundredfifteen twohundredsixteen twohundredseventeen twohundredeighteen |
| 99 | twohundrednineteen twohundredtwenty twohundredtwentyone twohundredtwentytwo |
| 100 | twohundredtwentythree twohundredtwentyfour twohundredtwentyfive |
| 101 | twohundredtwentysix twohundredtwentyseven twohundredtwentyeight |
| 102 | twohundredtwentynine twohundredthirty twohundredthirtyone |
| 103 | twohundredthirtytwo twohundredthirtythree twohundredthirtyfour |
| 104 | twohundredthirtyfive twohundredthirtysix twohundredthirtyseven |
| 105 | twohundredthirtyeight twohundredthirtynine twohundredforty |
| 106 | twohundredfortyone twohundredfortytwo twohundredfortythree |
| 107 | twohundredfortyfour twohundredfortyfive twohundredfortysix |
| 108 | twohundredfortyseven twohundredfortyeight twohundredfortynine |
| 109 | twohundredfifty twohundredfiftyone twohundredfiftytwo twohundredfiftythree |
| 110 | twohundredfiftyfour twohundredfiftyfive twohundredfiftysix |
| 111 | twohundredfiftyseven twohundredfiftyeight twohundredfiftynine |
| 112 | twohundredsixty twohundredsixtyone twohundredsixtytwo twohundredsixtythree |
| 113 | twohundredsixtyfour twohundredsixtyfive twohundredsixtysix |
| 114 | twohundredsixtyseven twohundredsixtyeight twohundredsixtynine |
| 115 | twohundredseventy twohundredseventyone twohundredseventytwo |
| 116 | twohundredseventythree twohundredseventyfour twohundredseventyfive |
| 117 | twohundredseventysix twohundredseventyseven twohundredseventyeight |
| 118 | twohundredseventynine twohundredeighty twohundredeightyone |
| 119 | twohundredeightytwo twohundredeightythree twohundredeightyfour |
| 120 | twohundredeightyfive twohundredeightysix twohundredeightyseven |
| 121 | twohundredeightyeight twohundredeightynine twohundredninety |
| 122 | twohundredninetyone twohundredninetytwo twohundredninetythree |
| 123 | twohundredninetyfour twohundredninetyfive twohundredninetysix |
| 124 | twohundredninetyseven twohundredninetyeight twohundredninetynine |
| 125 | threehundred |
| 126 | }] |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 127 | |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 128 | foreach {DO_MALLOC_TEST enc} { |
| 129 | 0 utf8 |
| 130 | 1 utf8 |
| 131 | 1 utf16 |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 132 | } { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 133 | |
| 134 | db close |
mistachkin | fda06be | 2011-08-02 00:57:34 +0000 | [diff] [blame] | 135 | forcedelete test.db |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 136 | sqlite3 db test.db |
dan | 14d4cc4 | 2010-01-20 14:25:37 +0000 | [diff] [blame] | 137 | sqlite3_db_config_lookaside db 0 0 0 |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 138 | db eval "PRAGMA encoding = \"$enc\"" |
| 139 | |
| 140 | # Set variable $T to the test name prefix for this iteration of the loop. |
| 141 | # |
dan | 1f03e60 | 2013-09-30 18:14:45 +0000 | [diff] [blame] | 142 | set T "fts3snippet-1.$enc" |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 143 | |
| 144 | ########################################################################## |
| 145 | # Test the offset function. |
| 146 | # |
| 147 | do_test $T.1.1 { |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 148 | execsql { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 149 | CREATE VIRTUAL TABLE ft USING fts3; |
| 150 | INSERT INTO ft VALUES('xxx xxx xxx xxx'); |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 151 | } |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 152 | } {} |
| 153 | do_offsets_test $T.1.2 {xxx} {0 0 0 3 0 0 4 3 0 0 8 3 0 0 12 3} |
| 154 | do_offsets_test $T.1.3 {"xxx xxx"} { |
| 155 | 0 0 0 3 0 0 4 3 0 1 4 3 0 0 8 3 |
| 156 | 0 1 8 3 0 1 12 3 |
| 157 | } |
| 158 | do_offsets_test $T.1.4 {"xxx xxx" xxx} { |
| 159 | 0 0 0 3 0 2 0 3 0 0 4 3 0 1 4 3 |
| 160 | 0 2 4 3 0 0 8 3 0 1 8 3 0 2 8 3 |
| 161 | 0 1 12 3 0 2 12 3 |
| 162 | } |
| 163 | do_offsets_test $T.1.5 {xxx "xxx xxx"} { |
| 164 | 0 0 0 3 0 1 0 3 0 0 4 3 0 1 4 3 |
| 165 | 0 2 4 3 0 0 8 3 0 1 8 3 0 2 8 3 |
| 166 | 0 0 12 3 0 2 12 3 |
| 167 | } |
| 168 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 169 | do_test $T.2.1 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 170 | set v1 [lrange $numbers 0 99] |
| 171 | execsql { |
| 172 | DROP TABLE IF EXISTS ft; |
| 173 | CREATE VIRTUAL TABLE ft USING fts3(a, b); |
| 174 | INSERT INTO ft VALUES($v1, $numbers); |
| 175 | INSERT INTO ft VALUES($v1, NULL); |
| 176 | } |
| 177 | } {} |
| 178 | |
| 179 | set off [string first "twohundred " $numbers] |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 180 | do_offsets_test $T.2.1 {twohundred} [list 1 0 $off 10] |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 181 | |
| 182 | set off [string first "onehundred " $numbers] |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 183 | do_offsets_test $T.2.2 {onehundred} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 184 | [list 0 0 $off 10 1 0 $off 10] [list 0 0 $off 10] |
| 185 | |
| 186 | # Test a corruption case: |
| 187 | execsql { UPDATE ft_content SET c1b = 'hello world' WHERE c1b = $numbers } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 188 | do_error_test $T.2.3 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 189 | SELECT offsets(ft) FROM ft WHERE ft MATCH 'onehundred' |
| 190 | } {database disk image is malformed} |
| 191 | |
| 192 | ########################################################################## |
| 193 | # Test the snippet function. |
| 194 | # |
| 195 | proc do_snippet_test {name expr iCol nTok args} { |
| 196 | set res [list] |
| 197 | foreach a $args { lappend res [string trim $a] } |
| 198 | do_select_test $name { |
| 199 | SELECT snippet(ft,'{','}','...',$iCol,$nTok) FROM ft WHERE ft MATCH $expr |
| 200 | } $res |
| 201 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 202 | do_test $T.3.1 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 203 | execsql { |
| 204 | DROP TABLE IF EXISTS ft; |
| 205 | CREATE VIRTUAL TABLE ft USING fts3; |
| 206 | INSERT INTO ft VALUES('one two three four five six seven eight nine ten'); |
| 207 | } |
| 208 | } {} |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 209 | do_snippet_test $T.3.2 one 0 5 "{one} two three four five..." |
| 210 | do_snippet_test $T.3.3 two 0 5 "one {two} three four five..." |
| 211 | do_snippet_test $T.3.4 three 0 5 "one two {three} four five..." |
| 212 | do_snippet_test $T.3.5 four 0 5 "...two three {four} five six..." |
| 213 | do_snippet_test $T.3.6 five 0 5 "...three four {five} six seven..." |
| 214 | do_snippet_test $T.3.7 six 0 5 "...four five {six} seven eight..." |
| 215 | do_snippet_test $T.3.8 seven 0 5 "...five six {seven} eight nine..." |
| 216 | do_snippet_test $T.3.9 eight 0 5 "...six seven {eight} nine ten" |
| 217 | do_snippet_test $T.3.10 nine 0 5 "...six seven eight {nine} ten" |
| 218 | do_snippet_test $T.3.11 ten 0 5 "...six seven eight nine {ten}" |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 219 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 220 | do_test $T.4.1 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 221 | execsql { |
| 222 | INSERT INTO ft VALUES( |
| 223 | 'one two three four five ' |
| 224 | || 'six seven eight nine ten ' |
| 225 | || 'eleven twelve thirteen fourteen fifteen ' |
| 226 | || 'sixteen seventeen eighteen nineteen twenty ' |
| 227 | || 'one two three four five ' |
| 228 | || 'six seven eight nine ten ' |
| 229 | || 'eleven twelve thirteen fourteen fifteen ' |
| 230 | || 'sixteen seventeen eighteen nineteen twenty' |
| 231 | ); |
| 232 | } |
| 233 | } {} |
| 234 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 235 | do_snippet_test $T.4.2 {one nine} 0 5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 236 | {one} two three...eight {nine} ten |
| 237 | } { |
| 238 | {one} two three...eight {nine} ten... |
| 239 | } |
| 240 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 241 | do_snippet_test $T.4.3 {one nine} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 242 | {one} two three four five...six seven eight {nine} ten |
| 243 | } { |
| 244 | {one} two three four five...seven eight {nine} ten eleven... |
| 245 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 246 | do_snippet_test $T.4.3 {one nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 247 | ...eighteen {nineteen} twenty {one} two... |
| 248 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 249 | do_snippet_test $T.4.4 {two nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 250 | ...eighteen {nineteen} twenty one {two}... |
| 251 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 252 | do_snippet_test $T.4.5 {three nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 253 | ...{nineteen} twenty one two {three}... |
| 254 | } |
| 255 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 256 | do_snippet_test $T.4.6 {four nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 257 | ...two three {four} five six...seventeen eighteen {nineteen} twenty one... |
| 258 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 259 | do_snippet_test $T.4.7 {four NEAR nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 260 | ...seventeen eighteen {nineteen} twenty one...two three {four} five six... |
| 261 | } |
| 262 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 263 | do_snippet_test $T.4.8 {four nineteen} 0 5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 264 | ...three {four} five...eighteen {nineteen} twenty... |
| 265 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 266 | do_snippet_test $T.4.9 {four NEAR nineteen} 0 5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 267 | ...eighteen {nineteen} twenty...three {four} five... |
| 268 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 269 | do_snippet_test $T.4.10 {four NEAR nineteen} 0 -5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 270 | ...seventeen eighteen {nineteen} twenty one...two three {four} five six... |
| 271 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 272 | do_snippet_test $T.4.11 {four NOT (nineteen twentyone)} 0 5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 273 | ...two three {four} five six... |
| 274 | } { |
| 275 | ...two three {four} five six... |
| 276 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 277 | do_snippet_test $T.4.12 {four OR nineteen NEAR twentyone} 0 5 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 278 | ...two three {four} five six... |
| 279 | } { |
| 280 | ...two three {four} five six... |
| 281 | } |
| 282 | |
| 283 | do_test $T.5.1 { |
| 284 | execsql { |
| 285 | DROP TABLE IF EXISTS ft; |
| 286 | CREATE VIRTUAL TABLE ft USING fts3(a, b, c); |
| 287 | INSERT INTO ft VALUES( |
| 288 | 'one two three four five', |
| 289 | 'four five six seven eight', |
| 290 | 'seven eight nine ten eleven' |
| 291 | ); |
| 292 | } |
| 293 | } {} |
| 294 | |
| 295 | do_snippet_test $T.5.2 {five} -1 3 {...three four {five}} |
| 296 | do_snippet_test $T.5.3 {five} 0 3 {...three four {five}} |
| 297 | do_snippet_test $T.5.4 {five} 1 3 {four {five} six...} |
| 298 | do_snippet_test $T.5.5 {five} 2 3 {seven eight nine...} |
| 299 | |
| 300 | do_test $T.5.6 { |
| 301 | execsql { UPDATE ft SET b = NULL } |
| 302 | } {} |
| 303 | |
| 304 | do_snippet_test $T.5.7 {five} -1 3 {...three four {five}} |
| 305 | do_snippet_test $T.5.8 {five} 0 3 {...three four {five}} |
| 306 | do_snippet_test $T.5.9 {five} 1 3 {} |
| 307 | do_snippet_test $T.5.10 {five} 2 3 {seven eight nine...} |
| 308 | |
| 309 | do_snippet_test $T.5.11 {one "seven eight nine"} -1 -3 { |
| 310 | {one} two three...{seven} {eight} {nine}... |
| 311 | } |
| 312 | |
| 313 | do_test $T.6.1 { |
| 314 | execsql { |
| 315 | DROP TABLE IF EXISTS ft; |
| 316 | CREATE VIRTUAL TABLE ft USING fts3(x); |
| 317 | INSERT INTO ft VALUES($numbers); |
| 318 | } |
| 319 | } {} |
| 320 | do_snippet_test $T.6.2 { |
| 321 | one fifty onehundred onehundredfifty twohundredfifty threehundred |
| 322 | } -1 4 { |
| 323 | {one}...{fifty}...{onehundred}...{onehundredfifty}... |
| 324 | } |
| 325 | do_snippet_test $T.6.3 { |
| 326 | one fifty onehundred onehundredfifty twohundredfifty threehundred |
| 327 | } -1 -4 { |
| 328 | {one} two three four...fortyeight fortynine {fifty} fiftyone...ninetyeight ninetynine {onehundred} onehundredone...onehundredfortyeight onehundredfortynine {onehundredfifty} onehundredfiftyone... |
| 329 | } |
| 330 | |
| 331 | do_test $T.7.1 { |
| 332 | execsql { |
| 333 | BEGIN; |
| 334 | DROP TABLE IF EXISTS ft; |
| 335 | CREATE VIRTUAL TABLE ft USING fts3(x); |
| 336 | } |
| 337 | set testresults [list] |
| 338 | for {set i 1} {$i < 150} {incr i} { |
| 339 | set commas [string repeat , $i] |
| 340 | execsql {INSERT INTO ft VALUES('one' || $commas || 'two')} |
| 341 | lappend testresults "{one}$commas{two}" |
| 342 | } |
| 343 | execsql COMMIT |
| 344 | } {} |
dan | da730f6 | 2010-02-18 08:19:19 +0000 | [diff] [blame] | 345 | eval [list do_snippet_test $T.7.2 {one two} -1 3] $testresults |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 346 | |
| 347 | ########################################################################## |
| 348 | # Test the matchinfo function. |
| 349 | # |
| 350 | proc mit {blob} { |
| 351 | set scan(littleEndian) i* |
| 352 | set scan(bigEndian) I* |
| 353 | binary scan $blob $scan($::tcl_platform(byteOrder)) r |
| 354 | return $r |
| 355 | } |
| 356 | db func mit mit |
| 357 | proc do_matchinfo_test {name expr args} { |
| 358 | set res [list] |
| 359 | foreach a $args { lappend res [normalize $a] } |
| 360 | do_select_test $name { |
| 361 | SELECT mit(matchinfo(ft)) FROM ft WHERE ft MATCH $expr |
| 362 | } $res |
| 363 | } |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 364 | do_test $T.8.1 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 365 | set ten {one two three four five six seven eight nine ten} |
| 366 | execsql { |
| 367 | DROP TABLE IF EXISTS ft; |
| 368 | CREATE VIRTUAL TABLE ft USING fts3; |
| 369 | INSERT INTO ft VALUES($ten); |
| 370 | INSERT INTO ft VALUES($ten || ' ' || $ten); |
| 371 | } |
| 372 | } {} |
| 373 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 374 | do_matchinfo_test $T.8.2 "one" {1 1 1 3 2} {1 1 2 3 2} |
| 375 | do_matchinfo_test $T.8.3 "one NEAR/3 ten" {2 1 1 1 1 1 1 1} |
| 376 | do_matchinfo_test $T.8.4 "five NEAR/4 ten" \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 377 | {2 1 1 3 2 1 3 2} {2 1 2 3 2 2 3 2} |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 378 | do_matchinfo_test $T.8.5 "six NEAR/3 ten NEAR/3 two" \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 379 | {3 1 1 1 1 1 1 1 1 1 1} |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 380 | do_matchinfo_test $T.8.6 "five NEAR/4 ten NEAR/3 two" \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 381 | {3 1 2 2 1 1 1 1 1 1 1} |
| 382 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 383 | do_test $T.9.1 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 384 | execsql { |
| 385 | DROP TABLE IF EXISTS ft; |
| 386 | CREATE VIRTUAL TABLE ft USING fts3(x, y); |
| 387 | } |
| 388 | foreach n {1 2 3} { |
| 389 | set v1 [lrange $numbers 0 [expr $n*100]] |
| 390 | set v2 [string trim [string repeat "$numbers " $n]] |
| 391 | set docid [expr $n * 1000000] |
| 392 | execsql { INSERT INTO ft(docid, x, y) VALUES($docid, $v1, $v2) } |
| 393 | } |
| 394 | } {} |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 395 | do_matchinfo_test $T.9.2 {two*} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 396 | { 1 2 1 105 3 101 606 3} \ |
| 397 | { 1 2 3 105 3 202 606 3} \ |
| 398 | { 1 2 101 105 3 303 606 3} |
| 399 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 400 | do_matchinfo_test $T.9.4 {"one* two*"} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 401 | { 1 2 1 5 3 2 12 3} \ |
| 402 | { 1 2 2 5 3 4 12 3} \ |
| 403 | { 1 2 2 5 3 6 12 3} |
| 404 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 405 | do_matchinfo_test $T.9.5 {twohundredfifty} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 406 | { 1 2 0 1 1 1 6 3} \ |
| 407 | { 1 2 0 1 1 2 6 3} \ |
| 408 | { 1 2 1 1 1 3 6 3} |
| 409 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 410 | do_matchinfo_test $T.9.6 {"threehundred one"} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 411 | { 1 2 0 0 0 1 3 2} \ |
| 412 | { 1 2 0 0 0 2 3 2} |
| 413 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 414 | do_matchinfo_test $T.9.7 {one OR fivehundred} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 415 | { 2 2 1 3 3 1 6 3 0 0 0 0 0 0 } \ |
| 416 | { 2 2 1 3 3 2 6 3 0 0 0 0 0 0 } \ |
| 417 | { 2 2 1 3 3 3 6 3 0 0 0 0 0 0 } |
| 418 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 419 | do_matchinfo_test $T.9.8 {two OR "threehundred one"} \ |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 420 | { 2 2 1 3 3 1 6 3 0 0 0 0 3 2 } \ |
| 421 | { 2 2 1 3 3 2 6 3 0 0 0 1 3 2 } \ |
| 422 | { 2 2 1 3 3 3 6 3 0 0 0 2 3 2 } |
| 423 | |
dan | 1d0f43f | 2010-01-15 17:33:49 +0000 | [diff] [blame] | 424 | do_select_test $T.9.9 { |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 425 | SELECT mit(matchinfo(ft)), mit(matchinfo(ft)) |
| 426 | FROM ft WHERE ft MATCH 'two OR "threehundred one"' |
| 427 | } [normalize { |
| 428 | {2 2 1 3 3 1 6 3 0 0 0 0 3 2} |
| 429 | {2 2 1 3 3 1 6 3 0 0 0 0 3 2} |
| 430 | {2 2 1 3 3 2 6 3 0 0 0 1 3 2} |
| 431 | {2 2 1 3 3 2 6 3 0 0 0 1 3 2} |
| 432 | {2 2 1 3 3 3 6 3 0 0 0 2 3 2} |
| 433 | {2 2 1 3 3 3 6 3 0 0 0 2 3 2} |
| 434 | }] |
dan | 56f2996 | 2010-02-10 05:33:17 +0000 | [diff] [blame] | 435 | |
drh | 5822d6f | 2013-06-10 23:30:09 +0000 | [diff] [blame] | 436 | # EVIDENCE-OF: R-40630-02268 If used within a SELECT that uses the |
| 437 | # "query by rowid" or "linear scan" strategies, then the snippet and |
| 438 | # offsets both return an empty string, and the matchinfo function |
| 439 | # returns a blob value zero bytes in size. |
dan | 56f2996 | 2010-02-10 05:33:17 +0000 | [diff] [blame] | 440 | # |
| 441 | set r 1000000 ;# A rowid that exists in table ft |
| 442 | do_select_test $T.10.0 { SELECT rowid FROM ft WHERE rowid = $r } $r |
| 443 | do_select_test $T.10.1 { |
| 444 | SELECT length(offsets(ft)), typeof(offsets(ft)) FROM ft; |
| 445 | } {0 text 0 text 0 text} |
| 446 | do_select_test $T.10.2 { |
| 447 | SELECT length(offsets(ft)), typeof(offsets(ft)) FROM ft WHERE rowid = $r |
| 448 | } {0 text} |
| 449 | do_select_test $T.10.3 { |
| 450 | SELECT length(snippet(ft)), typeof(snippet(ft)) FROM ft; |
| 451 | } {0 text 0 text 0 text} |
| 452 | do_select_test $T.10.4 { |
| 453 | SELECT length(snippet(ft)), typeof(snippet(ft)) FROM ft WHERE rowid = $r; |
| 454 | } {0 text} |
| 455 | do_select_test $T.10.5 { |
| 456 | SELECT length(matchinfo(ft)), typeof(matchinfo(ft)) FROM ft; |
| 457 | } {0 blob 0 blob 0 blob} |
| 458 | do_select_test $T.10.6 { |
| 459 | SELECT length(matchinfo(ft)), typeof(matchinfo(ft)) FROM ft WHERE rowid = $r |
| 460 | } {0 blob} |
dan | 3174598 | 2010-01-07 10:54:28 +0000 | [diff] [blame] | 461 | } |
| 462 | |
dan | 1f03e60 | 2013-09-30 18:14:45 +0000 | [diff] [blame] | 463 | #------------------------------------------------------------------------- |
| 464 | # Test an interaction between the snippet() function and OR clauses. |
| 465 | # |
| 466 | do_execsql_test 2.1 { |
| 467 | CREATE VIRTUAL TABLE t2 USING fts4; |
| 468 | INSERT INTO t2 VALUES('one two three four five'); |
| 469 | INSERT INTO t2 VALUES('two three four five one'); |
| 470 | INSERT INTO t2 VALUES('three four five one two'); |
| 471 | INSERT INTO t2 VALUES('four five one two three'); |
| 472 | INSERT INTO t2 VALUES('five one two three four'); |
| 473 | } |
| 474 | |
| 475 | do_execsql_test 2.2 { |
| 476 | SELECT snippet(t2, '[', ']') FROM t2 WHERE t2 MATCH 'one OR (four AND six)' |
| 477 | } { |
| 478 | {[one] two three [four] five} |
| 479 | {two three [four] five [one]} |
| 480 | {three [four] five [one] two} |
| 481 | {[four] five [one] two three} |
| 482 | {five [one] two three [four]} |
| 483 | } |
| 484 | |
| 485 | do_execsql_test 2.3 { |
| 486 | SELECT snippet(t2, '[', ']') FROM t2 |
| 487 | WHERE t2 MATCH 'one OR (four AND six)' |
| 488 | ORDER BY docid DESC |
| 489 | } { |
| 490 | {five [one] two three [four]} |
| 491 | {[four] five [one] two three} |
| 492 | {three [four] five [one] two} |
| 493 | {two three [four] five [one]} |
| 494 | {[one] two three [four] five} |
| 495 | } |
| 496 | |
| 497 | do_execsql_test 2.4 { |
| 498 | INSERT INTO t2 VALUES('six'); |
| 499 | } |
| 500 | |
| 501 | do_execsql_test 2.5 { |
| 502 | SELECT snippet(t2, '[', ']') FROM t2 WHERE t2 MATCH 'one OR (four AND six)' |
| 503 | } { |
| 504 | {[one] two three [four] five} |
| 505 | {two three [four] five [one]} |
| 506 | {three [four] five [one] two} |
| 507 | {[four] five [one] two three} |
| 508 | {five [one] two three [four]} |
| 509 | } |
| 510 | |
| 511 | do_execsql_test 2.6 { |
| 512 | SELECT snippet(t2, '[', ']') FROM t2 |
| 513 | WHERE t2 MATCH 'one OR (four AND six)' |
| 514 | ORDER BY docid DESC |
| 515 | } { |
| 516 | {five [one] two three [four]} |
| 517 | {[four] five [one] two three} |
| 518 | {three [four] five [one] two} |
| 519 | {two three [four] five [one]} |
| 520 | {[one] two three [four] five} |
| 521 | } |
| 522 | |
dan | 6f0138e | 2015-01-27 19:01:26 +0000 | [diff] [blame] | 523 | #------------------------------------------------------------------------- |
| 524 | do_execsql_test 3 { |
| 525 | CREATE VIRTUAL TABLE t3 USING fts4; |
| 526 | INSERT INTO t3 VALUES('[one two three]'); |
| 527 | } |
| 528 | do_execsql_test 3.1 { |
| 529 | SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'one'; |
| 530 | } {{[<b>one</b> two three]}} |
| 531 | do_execsql_test 3.2 { |
| 532 | SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'two'; |
| 533 | } {{[one <b>two</b> three]}} |
| 534 | do_execsql_test 3.3 { |
| 535 | SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'three'; |
| 536 | } {{[one two <b>three</b>]}} |
| 537 | do_execsql_test 3.4 { |
| 538 | SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'one OR two OR three'; |
| 539 | } {{[<b>one</b> <b>two</b> <b>three</b>]}} |
| 540 | |
dan | 2deb12b | 2015-04-15 08:20:50 +0000 | [diff] [blame] | 541 | #------------------------------------------------------------------------- |
| 542 | # Request a snippet 0 tokens in size. This is always an empty string. |
| 543 | do_execsql_test 4.1 { |
| 544 | CREATE VIRTUAL TABLE t4 USING fts4; |
| 545 | INSERT INTO t4 VALUES('a b c d'); |
| 546 | SELECT snippet(t4, '[', ']', '...', 0, 0) FROM t4 WHERE t4 MATCH 'b'; |
| 547 | } {{}} |
| 548 | |
| 549 | do_test 4.2 { |
| 550 | set x35 [string trim [string repeat "x " 35]] |
| 551 | execsql "INSERT INTO t4 VALUES('$x35 E $x35 F $x35 G $x35');" |
| 552 | llength [db one { |
| 553 | SELECT snippet(t4, '', '', '', 0, 64) FROM t4 WHERE t4 MATCH 'E' |
| 554 | }] |
| 555 | } {64} |
| 556 | |
| 557 | |
| 558 | |
| 559 | |
dan | 3996a06 | 2010-01-15 17:25:52 +0000 | [diff] [blame] | 560 | set sqlite_fts3_enable_parentheses 0 |
dan | b023b04 | 2010-01-06 17:19:21 +0000 | [diff] [blame] | 561 | finish_test |