modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/fts3snippet.test (about) 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 # 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 # 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 set testprefix fts3snippet 20 21 # If SQLITE_ENABLE_FTS3 is not defined, omit this file. 22 ifcapable !fts3 { finish_test ; return } 23 source $testdir/fts3_common.tcl 24 25 set sqlite_fts3_enable_parentheses 1 26 set DO_MALLOC_TEST 0 27 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 37 proc do_offsets_test {name expr args} { 38 set result [list] 39 foreach a $args { 40 lappend result [normalize $a] 41 } 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 }] 127 128 foreach {DO_MALLOC_TEST enc} { 129 0 utf8 130 1 utf8 131 1 utf16 132 } { 133 134 db close 135 forcedelete test.db 136 sqlite3 db test.db 137 sqlite3_db_config_lookaside db 0 0 0 138 db eval "PRAGMA encoding = \"$enc\"" 139 140 # Set variable $T to the test name prefix for this iteration of the loop. 141 # 142 set T "fts3snippet-1.$enc" 143 144 ########################################################################## 145 # Test the offset function. 146 # 147 do_test $T.1.1 { 148 execsql { 149 CREATE VIRTUAL TABLE ft USING fts3; 150 INSERT INTO ft VALUES('xxx xxx xxx xxx'); 151 } 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 169 do_test $T.2.1 { 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] 180 do_offsets_test $T.2.1 {twohundred} [list 1 0 $off 10] 181 182 set off [string first "onehundred " $numbers] 183 do_offsets_test $T.2.2 {onehundred} \ 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 } 188 do_error_test $T.2.3 { 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 } 202 do_test $T.3.1 { 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 } {} 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}" 219 220 do_test $T.4.1 { 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 235 do_snippet_test $T.4.2 {one nine} 0 5 { 236 {one} two three...eight {nine} ten 237 } { 238 {one} two three...eight {nine} ten... 239 } 240 241 do_snippet_test $T.4.3 {one nine} 0 -5 { 242 {one} two three four five...six seven eight {nine} ten 243 } { 244 {one} two three four five...seven eight {nine} ten eleven... 245 } 246 do_snippet_test $T.4.3 {one nineteen} 0 -5 { 247 ...eighteen {nineteen} twenty {one} two... 248 } 249 do_snippet_test $T.4.4 {two nineteen} 0 -5 { 250 ...eighteen {nineteen} twenty one {two}... 251 } 252 do_snippet_test $T.4.5 {three nineteen} 0 -5 { 253 ...{nineteen} twenty one two {three}... 254 } 255 256 do_snippet_test $T.4.6 {four nineteen} 0 -5 { 257 ...two three {four} five six...seventeen eighteen {nineteen} twenty one... 258 } 259 do_snippet_test $T.4.7 {four NEAR nineteen} 0 -5 { 260 ...seventeen eighteen {nineteen} twenty one...two three {four} five six... 261 } 262 263 do_snippet_test $T.4.8 {four nineteen} 0 5 { 264 ...three {four} five...eighteen {nineteen} twenty... 265 } 266 do_snippet_test $T.4.9 {four NEAR nineteen} 0 5 { 267 ...eighteen {nineteen} twenty...three {four} five... 268 } 269 do_snippet_test $T.4.10 {four NEAR nineteen} 0 -5 { 270 ...seventeen eighteen {nineteen} twenty one...two three {four} five six... 271 } 272 do_snippet_test $T.4.11 {four NOT (nineteen twentyone)} 0 5 { 273 ...two three {four} five six... 274 } { 275 ...two three {four} five six... 276 } 277 do_snippet_test $T.4.12 {four OR nineteen NEAR twentyone} 0 5 { 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 } {} 345 eval [list do_snippet_test $T.7.2 {one two} -1 3] $testresults 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 } 364 do_test $T.8.1 { 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 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" \ 377 {2 1 1 3 2 1 3 2} {2 1 2 3 2 2 3 2} 378 do_matchinfo_test $T.8.5 "six NEAR/3 ten NEAR/3 two" \ 379 {3 1 1 1 1 1 1 1 1 1 1} 380 do_matchinfo_test $T.8.6 "five NEAR/4 ten NEAR/3 two" \ 381 {3 1 2 2 1 1 1 1 1 1 1} 382 383 do_test $T.9.1 { 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 } {} 395 do_matchinfo_test $T.9.2 {two*} \ 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 400 do_matchinfo_test $T.9.4 {"one* two*"} \ 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 405 do_matchinfo_test $T.9.5 {twohundredfifty} \ 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 410 do_matchinfo_test $T.9.6 {"threehundred one"} \ 411 { 1 2 0 0 0 1 3 2} \ 412 { 1 2 0 0 0 2 3 2} 413 414 do_matchinfo_test $T.9.7 {one OR fivehundred} \ 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 419 do_matchinfo_test $T.9.8 {two OR "threehundred one"} \ 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 424 do_select_test $T.9.9 { 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 }] 435 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. 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} 461 } 462 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 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 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 560 set sqlite_fts3_enable_parentheses 0 561 finish_test