/ Hex Artifact Content
Login

Artifact 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2:


0000: 23 20 32 30 31 31 20 4a 75 6e 65 20 31 30 0a 23  # 2011 June 10.#
0010: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0020: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
0030: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
0040: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
0050: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
0060: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
0070: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
0080: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0090: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
00a0: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
00b0: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
00c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74  *********.#..set
0100: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
0110: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
0120: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
0130: 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20  ester.tcl..# If 
0140: 74 68 69 73 20 62 75 69 6c 64 20 64 6f 65 73 20  this build does 
0150: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 46 54 53 33  not include FTS3
0160: 2c 20 73 6b 69 70 20 74 68 65 20 74 65 73 74 73  , skip the tests
0170: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 23   in this file..#
0180: 0a 69 66 63 61 70 61 62 6c 65 20 21 66 74 73 33  .ifcapable !fts3
0190: 20 7b 20 66 69 6e 69 73 68 5f 74 65 73 74 20 3b   { finish_test ;
01a0: 20 72 65 74 75 72 6e 20 7d 0a 73 6f 75 72 63 65   return }.source
01b0: 20 24 74 65 73 74 64 69 72 2f 66 74 73 33 5f 63   $testdir/fts3_c
01c0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65  ommon.tcl.source
01d0: 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63   $testdir/malloc
01e0: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74  _common.tcl..set
01f0: 20 74 65 73 74 70 72 65 66 69 78 20 66 74 73 33   testprefix fts3
0200: 61 75 74 6f 0a 73 65 74 20 73 66 65 70 20 24 73  auto.set sfep $s
0210: 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c  qlite_fts3_enabl
0220: 65 5f 70 61 72 65 6e 74 68 65 73 65 73 0a 73 65  e_parentheses.se
0230: 74 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e  t sqlite_fts3_en
0240: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
0250: 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   1..#-----------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
02a0: 23 20 53 74 61 72 74 20 6f 66 20 54 63 6c 20 69  # Start of Tcl i
02b0: 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 75 73  nfrastructure us
02c0: 65 64 20 62 79 20 74 65 73 74 73 2e 20 54 68 65  ed by tests. The
02d0: 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 61 72   entry points ar
02e0: 65 3a 0a 23 0a 23 20 20 20 64 6f 5f 66 74 73 33  e:.#.#   do_fts3
02f0: 71 75 65 72 79 5f 74 65 73 74 0a 23 20 20 20 66  query_test.#   f
0300: 74 73 33 5f 6d 61 6b 65 5f 64 65 66 65 72 72 61  ts3_make_deferra
0310: 62 6c 65 0a 23 20 20 20 66 74 73 33 5f 7a 65 72  ble.#   fts3_zer
0320: 6f 5f 6c 6f 6e 67 5f 73 65 67 6d 65 6e 74 73 20  o_long_segments 
0330: 0a 23 0a 0a 23 0a 23 20 20 20 20 64 6f 5f 66 74  .#..#.#    do_ft
0340: 73 33 71 75 65 72 79 5f 74 65 73 74 20 54 45 53  s3query_test TES
0350: 54 4e 41 4d 45 20 3f 4f 50 54 49 4f 4e 53 3f 20  TNAME ?OPTIONS? 
0360: 54 41 42 4c 45 20 4d 41 54 43 48 45 58 50 52 0a  TABLE MATCHEXPR.
0370: 23 0a 23 20 54 68 69 73 20 70 72 6f 63 20 72 75  #.# This proc ru
0380: 6e 73 20 73 65 76 65 72 61 6c 20 74 65 73 74 20  ns several test 
0390: 63 61 73 65 73 20 6f 6e 20 46 54 53 33 2f 34 20  cases on FTS3/4 
03a0: 74 61 62 6c 65 20 24 54 41 42 4c 45 20 75 73 69  table $TABLE usi
03b0: 6e 67 20 6d 61 74 63 68 0a 23 20 65 78 70 72 65  ng match.# expre
03c0: 73 73 69 6f 6e 20 24 4d 41 54 43 48 45 58 50 52  ssion $MATCHEXPR
03d0: 2e 20 41 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  . All documents 
03e0: 69 6e 20 24 54 41 42 4c 45 20 6d 75 73 74 20 62  in $TABLE must b
03f0: 65 20 66 6f 72 6d 61 74 74 65 64 20 73 6f 20 74  e formatted so t
0400: 68 61 74 0a 23 20 74 68 65 79 20 63 61 6e 20 62  hat.# they can b
0410: 65 20 22 74 6f 6b 65 6e 69 7a 65 64 22 20 75 73  e "tokenized" us
0420: 69 6e 67 20 74 68 65 20 54 63 6c 20 6c 69 73 74  ing the Tcl list
0430: 20 63 6f 6d 6d 61 6e 64 73 20 28 6c 6c 65 6e 67   commands (lleng
0440: 74 68 2c 20 6c 69 6e 64 65 78 20 65 74 63 2e 29  th, lindex etc.)
0450: 2e 0a 23 20 54 68 65 20 6e 61 6d 65 20 61 6e 64  ..# The name and
0460: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 75 73   column names us
0470: 65 64 20 62 79 20 24 54 41 42 4c 45 20 6d 75 73  ed by $TABLE mus
0480: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  t not require an
0490: 79 20 71 75 6f 74 69 6e 67 20 6f 72 0a 23 20 65  y quoting or.# e
04a0: 73 63 61 70 69 6e 67 20 77 68 65 6e 20 75 73 65  scaping when use
04b0: 64 20 69 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  d in SQL stateme
04c0: 6e 74 73 2e 0a 23 0a 23 20 24 4d 41 54 43 48 49  nts..#.# $MATCHI
04d0: 4e 46 4f 20 6d 61 79 20 62 65 20 61 6e 79 20 65  NFO may be any e
04e0: 78 70 72 65 73 73 69 6f 6e 20 61 63 63 65 70 74  xpression accept
04f0: 65 64 20 62 79 20 74 68 65 20 46 54 53 34 20 4d  ed by the FTS4 M
0500: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2c 20 0a  ATCH operator, .
0510: 23 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  # except that th
0520: 65 20 22 3c 63 6f 6c 75 6d 6e 2d 6e 61 6d 65 3e  e "<column-name>
0530: 3a 74 6f 6b 65 6e 22 20 73 79 6e 74 61 78 20 69  :token" syntax i
0540: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e  s not supported.
0550: 20 54 63 6c 20 6c 69 73 74 0a 23 20 63 6f 6d 6d   Tcl list.# comm
0560: 61 6e 64 73 20 61 72 65 20 75 73 65 64 20 74 6f  ands are used to
0570: 20 74 6f 6b 65 6e 69 7a 65 20 74 68 65 20 65 78   tokenize the ex
0580: 70 72 65 73 73 69 6f 6e 2e 20 41 6e 79 20 70 61  pression. Any pa
0590: 72 65 6e 74 68 65 73 69 73 20 6d 75 73 74 20 61  renthesis must a
05a0: 70 70 65 61 72 0a 23 20 65 69 74 68 65 72 20 61  ppear.# either a
05b0: 73 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  s separate list 
05c0: 65 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 61 73 20  elements, or as 
05d0: 74 68 65 20 66 69 72 73 74 20 28 66 6f 72 20 6f  the first (for o
05e0: 70 65 6e 69 6e 67 29 20 6f 72 20 6c 61 73 74 0a  pening) or last.
05f0: 23 20 28 66 6f 72 20 63 6c 6f 73 69 6e 67 29 20  # (for closing) 
0600: 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 20 6c  character of a l
0610: 69 73 74 20 65 6c 65 6d 65 6e 74 2e 20 69 2e 65  ist element. i.e
0620: 2e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  . the expression
0630: 20 22 28 61 20 4f 52 20 62 29 63 22 0a 23 20 77   "(a OR b)c".# w
0640: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 61 72 73 65  ill not be parse
0650: 64 20 63 6f 72 72 65 63 74 6c 79 2c 20 62 75 74  d correctly, but
0660: 20 22 28 20 61 20 4f 52 20 62 29 20 63 22 20 77   "( a OR b) c" w
0670: 69 6c 6c 2e 0a 23 0a 23 20 41 76 61 69 6c 61 62  ill..#.# Availab
0680: 6c 65 20 4f 50 54 49 4f 4e 53 20 61 72 65 3a 0a  le OPTIONS are:.
0690: 23 0a 23 20 20 20 20 20 2d 64 65 66 65 72 72 65  #.#     -deferre
06a0: 64 20 54 4f 4b 45 4e 4c 49 53 54 0a 23 0a 23 20  d TOKENLIST.#.# 
06b0: 49 66 20 74 68 65 20 22 64 65 66 65 72 72 65 64  If the "deferred
06c0: 22 20 6f 70 74 69 6f 6e 20 69 73 20 73 75 70 70  " option is supp
06d0: 6c 69 65 64 2c 20 69 74 20 69 73 20 70 61 73 73  lied, it is pass
06e0: 65 64 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b  ed a list of tok
06f0: 65 6e 73 20 74 68 61 74 0a 23 20 61 72 65 20 64  ens that.# are d
0700: 65 66 65 72 72 65 64 20 62 79 20 46 54 53 20 61  eferred by FTS a
0710: 6e 64 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  nd result in the
0720: 20 72 65 6c 65 76 61 6e 74 20 6d 61 74 63 68 69   relevant matchi
0730: 6e 66 6f 28 29 20 73 74 61 74 73 20 62 65 69 6e  nfo() stats bein
0740: 67 20 61 6e 0a 23 20 61 70 70 72 6f 78 69 6d 61  g an.# approxima
0750: 74 69 6f 6e 2e 20 0a 23 0a 73 65 74 20 73 71 6c  tion. .#.set sql
0760: 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  ite_fts3_enable_
0770: 70 61 72 65 6e 74 68 65 73 65 73 20 31 0a 70 72  parentheses 1.pr
0780: 6f 63 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  oc do_fts3query_
0790: 74 65 73 74 20 7b 74 6e 20 61 72 67 73 7d 20 7b  test {tn args} {
07a0: 0a 0a 20 20 73 65 74 20 6e 41 72 67 20 5b 6c 6c  ..  set nArg [ll
07b0: 65 6e 67 74 68 20 24 61 72 67 73 5d 0a 20 20 69  ength $args].  i
07c0: 66 20 7b 24 6e 41 72 67 20 3c 20 32 20 7c 7c 20  f {$nArg < 2 || 
07d0: 28 24 6e 41 72 67 20 25 20 32 29 7d 20 7b 0a 20  ($nArg % 2)} {. 
07e0: 20 20 20 73 65 74 20 63 6d 64 20 64 6f 5f 66 74     set cmd do_ft
07f0: 73 33 71 75 65 72 79 5f 74 65 73 74 0a 20 20 20  s3query_test.   
0800: 20 65 72 72 6f 72 20 22 77 72 6f 6e 67 20 23 20   error "wrong # 
0810: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
0820: 5c 22 24 63 6d 64 20 3f 2d 64 65 66 65 72 72 65  \"$cmd ?-deferre
0830: 64 20 4c 49 53 54 3f 20 54 41 42 4c 45 20 4d 41  d LIST? TABLE MA
0840: 54 43 48 45 58 50 52 5c 22 22 0a 20 20 7d 0a 20  TCHEXPR\"".  }. 
0850: 20 73 65 74 20 74 62 6c 20 20 20 5b 6c 69 6e 64   set tbl   [lind
0860: 65 78 20 24 61 72 67 73 20 5b 65 78 70 72 20 24  ex $args [expr $
0870: 6e 41 72 67 2d 32 5d 5d 0a 20 20 73 65 74 20 6d  nArg-2]].  set m
0880: 61 74 63 68 20 5b 6c 69 6e 64 65 78 20 24 61 72  atch [lindex $ar
0890: 67 73 20 5b 65 78 70 72 20 24 6e 41 72 67 2d 31  gs [expr $nArg-1
08a0: 5d 5d 0a 20 20 73 65 74 20 64 65 66 65 72 72 65  ]].  set deferre
08b0: 64 20 5b 6c 69 73 74 5d 0a 0a 20 20 66 6f 72 65  d [list]..  fore
08c0: 61 63 68 20 7b 6b 20 76 7d 20 5b 6c 72 61 6e 67  ach {k v} [lrang
08d0: 65 20 24 61 72 67 73 20 30 20 5b 65 78 70 72 20  e $args 0 [expr 
08e0: 24 6e 41 72 67 2d 33 5d 5d 20 7b 0a 20 20 20 20  $nArg-3]] {.    
08f0: 73 77 69 74 63 68 20 2d 2d 20 24 6b 20 7b 0a 20  switch -- $k {. 
0900: 20 20 20 20 20 2d 64 65 66 65 72 72 65 64 20 7b       -deferred {
0910: 0a 20 20 20 20 20 20 20 20 69 66 63 61 70 61 62  .        ifcapab
0920: 6c 65 20 66 74 73 34 5f 64 65 66 65 72 72 65 64  le fts4_deferred
0930: 20 7b 20 73 65 74 20 64 65 66 65 72 72 65 64 20   { set deferred 
0940: 24 76 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  $v }.      }.   
0950: 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20     default {.   
0960: 20 20 20 20 20 65 72 72 6f 72 20 22 62 61 64 20       error "bad 
0970: 6f 70 74 69 6f 6e 20 5c 22 24 6b 5c 22 3a 20 6d  option \"$k\": m
0980: 75 73 74 20 62 65 20 2d 64 65 66 65 72 72 65 64  ust be -deferred
0990: 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ".      }.    }.
09a0: 20 20 7d 0a 0a 20 20 67 65 74 5f 6e 65 61 72 5f    }..  get_near_
09b0: 72 65 73 75 6c 74 73 20 24 74 62 6c 20 24 6d 61  results $tbl $ma
09c0: 74 63 68 20 24 64 65 66 65 72 72 65 64 20 61 48  tch $deferred aH
09d0: 69 74 0a 20 20 67 65 74 5f 6e 65 61 72 5f 72 65  it.  get_near_re
09e0: 73 75 6c 74 73 20 24 74 62 6c 20 5b 73 74 72 69  sults $tbl [stri
09f0: 6e 67 20 6d 61 70 20 7b 41 4e 44 20 4f 52 7d 20  ng map {AND OR} 
0a00: 24 6d 61 74 63 68 5d 20 24 64 65 66 65 72 72 65  $match] $deferre
0a10: 64 20 61 4d 61 74 63 68 69 6e 66 6f 0a 0a 20 20  d aMatchinfo..  
0a20: 73 65 74 20 6d 61 74 63 68 69 6e 66 6f 5f 61 73  set matchinfo_as
0a30: 63 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  c [list].  forea
0a40: 63 68 20 64 6f 63 69 64 20 5b 6c 73 6f 72 74 20  ch docid [lsort 
0a50: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 20 5b  -integer -incr [
0a60: 61 72 72 61 79 20 6e 61 6d 65 73 20 61 48 69 74  array names aHit
0a70: 5d 5d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64  ]] {.    lappend
0a80: 20 6d 61 74 63 68 69 6e 66 6f 5f 61 73 63 20 24   matchinfo_asc $
0a90: 64 6f 63 69 64 20 24 61 4d 61 74 63 68 69 6e 66  docid $aMatchinf
0aa0: 6f 28 24 64 6f 63 69 64 29 0a 20 20 7d 0a 20 20  o($docid).  }.  
0ab0: 73 65 74 20 6d 61 74 63 68 69 6e 66 6f 5f 64 65  set matchinfo_de
0ac0: 73 63 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65  sc [list].  fore
0ad0: 61 63 68 20 64 6f 63 69 64 20 5b 6c 73 6f 72 74  ach docid [lsort
0ae0: 20 2d 69 6e 74 65 67 65 72 20 2d 64 65 63 72 20   -integer -decr 
0af0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61 48 69  [array names aHi
0b00: 74 5d 5d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  t]] {.    lappen
0b10: 64 20 6d 61 74 63 68 69 6e 66 6f 5f 64 65 73 63  d matchinfo_desc
0b20: 20 24 64 6f 63 69 64 20 24 61 4d 61 74 63 68 69   $docid $aMatchi
0b30: 6e 66 6f 28 24 64 6f 63 69 64 29 0a 20 20 7d 0a  nfo($docid).  }.
0b40: 0a 20 20 73 65 74 20 74 69 74 6c 65 20 22 28 5c  .  set title "(\
0b50: 22 24 6d 61 74 63 68 5c 22 20 2d 3e 20 5b 6c 6c  "$match\" -> [ll
0b60: 65 6e 67 74 68 20 5b 61 72 72 61 79 20 6e 61 6d  ength [array nam
0b70: 65 73 20 61 48 69 74 5d 5d 20 72 6f 77 73 29 22  es aHit]] rows)"
0b80: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
0b90: 65 73 74 20 24 74 6e 24 74 69 74 6c 65 2e 31 20  est $tn$title.1 
0ba0: 22 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  ".    SELECT doc
0bb0: 69 64 20 46 52 4f 4d 20 24 74 62 6c 20 57 48 45  id FROM $tbl WHE
0bc0: 52 45 20 24 74 62 6c 20 4d 41 54 43 48 20 27 24  RE $tbl MATCH '$
0bd0: 6d 61 74 63 68 27 20 4f 52 44 45 52 20 42 59 20  match' ORDER BY 
0be0: 64 6f 63 69 64 20 41 53 43 0a 20 20 22 20 5b 6c  docid ASC.  " [l
0bf0: 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69  sort -integer -i
0c00: 6e 63 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  ncr [array names
0c10: 20 61 48 69 74 5d 5d 20 0a 0a 20 20 64 6f 5f 65   aHit]] ..  do_e
0c20: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 24  xecsql_test $tn$
0c30: 74 69 74 6c 65 2e 32 20 22 0a 20 20 20 20 53 45  title.2 ".    SE
0c40: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
0c50: 24 74 62 6c 20 57 48 45 52 45 20 24 74 62 6c 20  $tbl WHERE $tbl 
0c60: 4d 41 54 43 48 20 27 24 6d 61 74 63 68 27 20 4f  MATCH '$match' O
0c70: 52 44 45 52 20 42 59 20 64 6f 63 69 64 20 44 45  RDER BY docid DE
0c80: 53 43 0a 20 20 22 20 5b 6c 73 6f 72 74 20 2d 69  SC.  " [lsort -i
0c90: 6e 74 65 67 65 72 20 2d 64 65 63 72 20 5b 61 72  nteger -decr [ar
0ca0: 72 61 79 20 6e 61 6d 65 73 20 61 48 69 74 5d 5d  ray names aHit]]
0cb0: 20 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   ..  do_execsql_
0cc0: 74 65 73 74 20 24 74 6e 24 74 69 74 6c 65 2e 33  test $tn$title.3
0cd0: 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f   ".    SELECT do
0ce0: 63 69 64 2c 20 6d 69 74 28 6d 61 74 63 68 69 6e  cid, mit(matchin
0cf0: 66 6f 28 24 74 62 6c 2c 20 27 78 27 29 29 20 46  fo($tbl, 'x')) F
0d00: 52 4f 4d 20 24 74 62 6c 20 0a 20 20 20 20 57 48  ROM $tbl .    WH
0d10: 45 52 45 20 24 74 62 6c 20 4d 41 54 43 48 20 27  ERE $tbl MATCH '
0d20: 24 6d 61 74 63 68 27 20 4f 52 44 45 52 20 42 59  $match' ORDER BY
0d30: 20 64 6f 63 69 64 20 44 45 53 43 0a 20 20 22 20   docid DESC.  " 
0d40: 24 6d 61 74 63 68 69 6e 66 6f 5f 64 65 73 63 0a  $matchinfo_desc.
0d50: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0d60: 73 74 20 24 74 6e 24 74 69 74 6c 65 2e 34 20 22  st $tn$title.4 "
0d70: 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69  .    SELECT doci
0d80: 64 2c 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f  d, mit(matchinfo
0d90: 28 24 74 62 6c 2c 20 27 78 27 29 29 20 46 52 4f  ($tbl, 'x')) FRO
0da0: 4d 20 24 74 62 6c 20 0a 20 20 20 20 57 48 45 52  M $tbl .    WHER
0db0: 45 20 24 74 62 6c 20 4d 41 54 43 48 20 27 24 6d  E $tbl MATCH '$m
0dc0: 61 74 63 68 27 20 4f 52 44 45 52 20 42 59 20 64  atch' ORDER BY d
0dd0: 6f 63 69 64 20 41 53 43 0a 20 20 22 20 24 6d 61  ocid ASC.  " $ma
0de0: 74 63 68 69 6e 66 6f 5f 61 73 63 0a 7d 0a 0a 23  tchinfo_asc.}..#
0df0: 20 20 20 20 66 74 73 33 5f 6d 61 6b 65 5f 64 65      fts3_make_de
0e00: 66 65 72 72 61 62 6c 65 20 54 41 42 4c 45 20 54  ferrable TABLE T
0e10: 4f 4b 45 4e 20 3f 4e 52 4f 57 3f 0a 23 0a 70 72  OKEN ?NROW?.#.pr
0e20: 6f 63 20 66 74 73 33 5f 6d 61 6b 65 5f 64 65 66  oc fts3_make_def
0e30: 65 72 72 61 62 6c 65 20 7b 74 62 6c 20 74 6f 6b  errable {tbl tok
0e40: 65 6e 20 7b 6e 52 6f 77 20 30 7d 7d 20 7b 0a 0a  en {nRow 0}} {..
0e50: 20 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69    set stmt [sqli
0e60: 74 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22  te3_prepare db "
0e70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 24 74  SELECT * FROM $t
0e80: 62 6c 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20  bl" -1 dummy].  
0e90: 73 65 74 20 6e 61 6d 65 20 5b 73 71 6c 69 74 65  set name [sqlite
0ea0: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 24 73  3_column_name $s
0eb0: 74 6d 74 20 30 5d 0a 20 20 73 71 6c 69 74 65 33  tmt 0].  sqlite3
0ec0: 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 0a  _finalize $stmt.
0ed0: 0a 20 20 69 66 20 7b 24 6e 52 6f 77 3d 3d 30 7d  .  if {$nRow==0}
0ee0: 20 7b 0a 20 20 20 20 73 65 74 20 6e 52 6f 77 20   {.    set nRow 
0ef0: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
0f00: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 24 74  count(*) FROM $t
0f10: 62 6c 22 5d 0a 20 20 7d 0a 20 20 73 65 74 20 70  bl"].  }.  set p
0f20: 67 73 7a 20 5b 64 62 20 6f 6e 65 20 22 50 52 41  gsz [db one "PRA
0f30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 5d 0a  GMA page_size"].
0f40: 20 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a    execsql BEGIN.
0f50: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
0f60: 7b 24 69 20 3c 20 28 24 6e 52 6f 77 20 2a 20 24  {$i < ($nRow * $
0f70: 70 67 73 7a 20 2a 20 31 2e 32 29 2f 31 30 30 7d  pgsz * 1.2)/100}
0f80: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
0f90: 73 65 74 20 64 6f 63 20 5b 73 74 72 69 6e 67 20  set doc [string 
0fa0: 72 65 70 65 61 74 20 22 24 74 6f 6b 65 6e 20 22  repeat "$token "
0fb0: 20 31 30 30 5d 0a 20 20 20 20 65 78 65 63 73 71   100].    execsq
0fc0: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24  l "INSERT INTO $
0fd0: 74 62 6c 20 28 24 6e 61 6d 65 29 20 56 41 4c 55  tbl ($name) VALU
0fe0: 45 53 28 5c 24 64 6f 63 29 22 0a 20 20 7d 0a 20  ES(\$doc)".  }. 
0ff0: 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54   execsql "INSERT
1000: 20 49 4e 54 4f 20 24 74 62 6c 20 28 24 6e 61 6d   INTO $tbl ($nam
1010: 65 29 20 56 41 4c 55 45 53 28 27 61 61 61 61 61  e) VALUES('aaaaa
1020: 61 61 20 24 7b 74 6f 6b 65 6e 7d 61 61 61 61 61  aa ${token}aaaaa
1030: 27 29 22 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  ')".  execsql CO
1040: 4d 4d 49 54 0a 0a 20 20 72 65 74 75 72 6e 20 5b  MMIT..  return [
1050: 65 78 70 72 20 24 6e 52 6f 77 2a 24 70 67 73 7a  expr $nRow*$pgsz
1060: 5d 0a 7d 0a 0a 23 20 20 20 20 66 74 73 33 5f 7a  ].}..#    fts3_z
1070: 65 72 6f 5f 6c 6f 6e 67 5f 73 65 67 6d 65 6e 74  ero_long_segment
1080: 73 20 54 41 42 4c 45 20 3f 4c 49 4d 49 54 3f 0a  s TABLE ?LIMIT?.
1090: 23 0a 70 72 6f 63 20 66 74 73 33 5f 7a 65 72 6f  #.proc fts3_zero
10a0: 5f 6c 6f 6e 67 5f 73 65 67 6d 65 6e 74 73 20 7b  _long_segments {
10b0: 74 62 6c 20 6c 69 6d 69 74 7d 20 7b 0a 20 20 73  tbl limit} {.  s
10c0: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
10d0: 20 64 62 20 44 45 46 45 4e 53 49 56 45 20 30 0a   db DEFENSIVE 0.
10e0: 20 20 65 78 65 63 73 71 6c 20 22 20 0a 20 20 20    execsql " .   
10f0: 20 55 50 44 41 54 45 20 24 7b 74 62 6c 7d 5f 73   UPDATE ${tbl}_s
1100: 65 67 6d 65 6e 74 73 20 0a 20 20 20 20 53 45 54  egments .    SET
1110: 20 62 6c 6f 63 6b 20 3d 20 7a 65 72 6f 62 6c 6f   block = zeroblo
1120: 62 28 6c 65 6e 67 74 68 28 62 6c 6f 63 6b 29 29  b(length(block))
1130: 20 0a 20 20 20 20 57 48 45 52 45 20 6c 65 6e 67   .    WHERE leng
1140: 74 68 28 62 6c 6f 63 6b 29 3e 24 6c 69 6d 69 74  th(block)>$limit
1150: 0a 20 20 22 0a 20 20 72 65 74 75 72 6e 20 5b 64  .  ".  return [d
1160: 62 20 63 68 61 6e 67 65 73 5d 0a 7d 0a 0a 0a 70  b changes].}...p
1170: 72 6f 63 20 6d 69 74 20 7b 62 6c 6f 62 7d 20 7b  roc mit {blob} {
1180: 0a 20 20 73 65 74 20 73 63 61 6e 28 6c 69 74 74  .  set scan(litt
1190: 6c 65 45 6e 64 69 61 6e 29 20 69 2a 0a 20 20 73  leEndian) i*.  s
11a0: 65 74 20 73 63 61 6e 28 62 69 67 45 6e 64 69 61  et scan(bigEndia
11b0: 6e 29 20 49 2a 0a 20 20 62 69 6e 61 72 79 20 73  n) I*.  binary s
11c0: 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61 6e 28  can $blob $scan(
11d0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
11e0: 62 79 74 65 4f 72 64 65 72 29 29 20 72 0a 20 20  byteOrder)) r.  
11f0: 72 65 74 75 72 6e 20 24 72 0a 7d 0a 64 62 20 66  return $r.}.db f
1200: 75 6e 63 20 6d 69 74 20 6d 69 74 0a 0a 70 72 6f  unc mit mit..pro
1210: 63 20 66 69 78 5f 70 68 72 61 73 65 5f 65 78 70  c fix_phrase_exp
1220: 72 20 7b 63 6f 6c 73 20 65 78 70 72 20 63 6f 6c  r {cols expr col
1230: 66 69 6c 74 65 72 76 61 72 7d 20 7b 0a 20 20 75  filtervar} {.  u
1240: 70 76 61 72 20 24 63 6f 6c 66 69 6c 74 65 72 76  pvar $colfilterv
1250: 61 72 20 69 43 6f 6c 46 69 6c 74 65 72 0a 0a 20  ar iColFilter.. 
1260: 20 73 65 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a   set out [list].
1270: 20 20 66 6f 72 65 61 63 68 20 74 20 24 65 78 70    foreach t $exp
1280: 72 20 7b 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  r {.    if {[str
1290: 69 6e 67 20 6d 61 74 63 68 20 2a 3a 2a 20 24 74  ing match *:* $t
12a0: 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63  ]} {.      set c
12b0: 6f 6c 20 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69  ol [lindex [spli
12c0: 74 20 24 74 20 3a 5d 20 30 5d 0a 20 20 20 20 20  t $t :] 0].     
12d0: 20 73 65 74 20 74 20 20 20 5b 6c 69 6e 64 65 78   set t   [lindex
12e0: 20 5b 73 70 6c 69 74 20 24 74 20 3a 5d 20 31 5d   [split $t :] 1]
12f0: 0a 20 20 20 20 20 20 73 65 74 20 69 43 6f 6c 20  .      set iCol 
1300: 5b 6c 73 65 61 72 63 68 20 24 63 6f 6c 73 20 24  [lsearch $cols $
1310: 63 6f 6c 5d 0a 20 20 20 20 20 20 69 66 20 7b 24  col].      if {$
1320: 69 43 6f 6c 3c 30 7d 20 7b 20 65 72 72 6f 72 20  iCol<0} { error 
1330: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 3a  "unknown column:
1340: 20 24 63 6f 6c 22 20 7d 0a 20 20 20 20 20 20 69   $col" }.      i
1350: 66 20 7b 24 69 43 6f 6c 46 69 6c 74 65 72 20 3c  f {$iColFilter <
1360: 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65   0} {.        se
1370: 74 20 69 43 6f 6c 46 69 6c 74 65 72 20 24 69 43  t iColFilter $iC
1380: 6f 6c 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ol.      } elsei
1390: 66 20 7b 24 69 43 6f 6c 46 69 6c 74 65 72 20 21  f {$iColFilter !
13a0: 3d 20 24 69 43 6f 6c 7d 20 7b 0a 20 20 20 20 20  = $iCol} {.     
13b0: 20 20 20 73 65 74 20 69 43 6f 6c 46 69 6c 74 65     set iColFilte
13c0: 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63 6f 6c 73  r [llength $cols
13d0: 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ].      }.    }.
13e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 75 74 20      lappend out 
13f0: 24 74 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  $t.  }..  return
1400: 20 24 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20 66 69   $out.}..proc fi
1410: 78 5f 6e 65 61 72 5f 65 78 70 72 20 7b 63 6f 6c  x_near_expr {col
1420: 73 20 65 78 70 72 20 63 6f 6c 66 69 6c 74 65 72  s expr colfilter
1430: 76 61 72 7d 20 7b 20 0a 20 20 75 70 76 61 72 20  var} { .  upvar 
1440: 24 63 6f 6c 66 69 6c 74 65 72 76 61 72 20 69 43  $colfiltervar iC
1450: 6f 6c 46 69 6c 74 65 72 0a 20 0a 20 20 73 65 74  olFilter. .  set
1460: 20 69 43 6f 6c 46 69 6c 74 65 72 20 2d 31 0a 0a   iColFilter -1..
1470: 20 20 73 65 74 20 6f 75 74 20 5b 6c 69 73 74 5d    set out [list]
1480: 0a 20 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b  .  lappend out [
1490: 66 69 78 5f 70 68 72 61 73 65 5f 65 78 70 72 20  fix_phrase_expr 
14a0: 24 63 6f 6c 73 20 5b 6c 69 6e 64 65 78 20 24 65  $cols [lindex $e
14b0: 78 70 72 20 30 5d 20 69 43 6f 6c 46 69 6c 74 65  xpr 0] iColFilte
14c0: 72 5d 0a 20 20 66 6f 72 65 61 63 68 20 7b 61 20  r].  foreach {a 
14d0: 62 7d 20 5b 6c 72 61 6e 67 65 20 24 65 78 70 72  b} [lrange $expr
14e0: 20 31 20 65 6e 64 5d 20 7b 0a 20 20 20 20 69 66   1 end] {.    if
14f0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1500: 2d 6e 6f 63 61 73 65 20 6e 65 61 72 20 24 61 5d  -nocase near $a]
1510: 7d 20 20 20 7b 20 73 65 74 20 61 20 31 30 20 7d  }   { set a 10 }
1520: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
1530: 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65 20 6e   match -nocase n
1540: 65 61 72 2f 2a 20 24 61 5d 7d 20 7b 20 73 65 74  ear/* $a]} { set
1550: 20 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65   a [string range
1560: 20 24 61 20 35 20 65 6e 64 5d 20 7d 0a 20 20 20   $a 5 end] }.   
1570: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 24 61 0a   lappend out $a.
1580: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 75 74 20      lappend out 
1590: 5b 66 69 78 5f 70 68 72 61 73 65 5f 65 78 70 72  [fix_phrase_expr
15a0: 20 24 63 6f 6c 73 20 24 62 20 69 43 6f 6c 46 69   $cols $b iColFi
15b0: 6c 74 65 72 5d 0a 20 20 7d 0a 20 20 72 65 74 75  lter].  }.  retu
15c0: 72 6e 20 24 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20  rn $out.}..proc 
15d0: 67 65 74 5f 73 69 6e 67 6c 65 5f 6e 65 61 72 5f  get_single_near_
15e0: 72 65 73 75 6c 74 73 20 7b 74 62 6c 20 65 78 70  results {tbl exp
15f0: 72 20 64 65 66 65 72 72 65 64 20 61 72 72 61 79  r deferred array
1600: 76 61 72 20 6e 75 6c 6c 76 61 72 7d 20 7b 0a 20  var nullvar} {. 
1610: 20 75 70 76 61 72 20 24 61 72 72 61 79 76 61 72   upvar $arrayvar
1620: 20 61 4d 61 74 63 68 69 6e 66 6f 0a 20 20 75 70   aMatchinfo.  up
1630: 76 61 72 20 24 6e 75 6c 6c 76 61 72 20 6e 75 6c  var $nullvar nul
1640: 6c 65 6e 74 72 79 0a 20 20 63 61 74 63 68 20 7b  lentry.  catch {
1650: 61 72 72 61 79 20 75 6e 73 65 74 20 61 4d 61 74  array unset aMat
1660: 63 68 69 6e 66 6f 7d 0a 0a 20 20 73 65 74 20 63  chinfo}..  set c
1670: 6f 6c 73 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74  ols [list].  set
1680: 20 6d 69 73 73 20 5b 6c 69 73 74 5d 0a 20 20 64   miss [list].  d
1690: 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 74  b eval "PRAGMA t
16a0: 61 62 6c 65 5f 69 6e 66 6f 28 24 74 62 6c 29 22  able_info($tbl)"
16b0: 20 41 20 7b 20 6c 61 70 70 65 6e 64 20 63 6f 6c   A { lappend col
16c0: 73 20 24 41 28 6e 61 6d 65 29 20 3b 20 6c 61 70  s $A(name) ; lap
16d0: 70 65 6e 64 20 6d 69 73 73 20 30 20 7d 0a 20 20  pend miss 0 }.  
16e0: 73 65 74 20 65 78 70 72 20 5b 66 69 78 5f 6e 65  set expr [fix_ne
16f0: 61 72 5f 65 78 70 72 20 24 63 6f 6c 73 20 24 65  ar_expr $cols $e
1700: 78 70 72 20 69 43 6f 6c 46 69 6c 74 65 72 5d 0a  xpr iColFilter].
1710: 0a 20 20 23 20 43 61 6c 63 75 6c 61 74 65 20 74  .  # Calculate t
1720: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 73 75  he expected resu
1730: 6c 74 73 20 75 73 69 6e 67 20 5b 66 74 73 33 5f  lts using [fts3_
1740: 6e 65 61 72 5f 6d 61 74 63 68 5d 2e 20 54 68 65  near_match]. The
1750: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 23 20 6c   following.  # l
1760: 6f 6f 70 20 70 6f 70 75 6c 61 74 65 73 20 74 68  oop populates th
1770: 65 20 22 68 69 74 73 22 20 61 6e 64 20 22 63 6f  e "hits" and "co
1780: 75 6e 74 73 22 20 61 72 72 61 79 73 20 61 73 20  unts" arrays as 
1790: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 23 20 0a 20 20  follows:.  # .  
17a0: 23 20 20 20 31 2e 20 46 6f 72 20 65 61 63 68 20  #   1. For each 
17b0: 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68 65 20  document in the 
17c0: 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
17d0: 65 73 20 74 68 65 20 4e 45 41 52 20 65 78 70 72  es the NEAR expr
17e0: 65 73 73 69 6f 6e 2c 0a 20 20 23 20 20 20 20 20  ession,.  #     
17f0: 20 68 69 74 73 28 24 64 6f 63 69 64 29 20 69 73   hits($docid) is
1800: 20 73 65 74 20 74 6f 20 31 2e 20 54 68 65 20 73   set to 1. The s
1810: 65 74 20 6f 66 20 64 6f 63 69 64 73 20 74 68 61  et of docids tha
1820: 74 20 6d 61 74 63 68 20 74 68 65 20 65 78 70 72  t match the expr
1830: 65 73 73 69 6f 6e 0a 20 20 23 20 20 20 20 20 20  ession.  #      
1840: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
1850: 20 66 6f 75 6e 64 20 75 73 69 6e 67 20 5b 61 72   found using [ar
1860: 72 61 79 20 6e 61 6d 65 73 20 68 69 74 73 5d 2e  ray names hits].
1870: 0a 20 20 23 0a 20 20 23 20 20 20 32 2e 20 46 6f  .  #.  #   2. Fo
1880: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
1890: 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69   each document i
18a0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 6f 75  n the table, cou
18b0: 6e 74 73 28 24 64 6f 63 69 64 2c 24 69 43 6f 6c  nts($docid,$iCol
18c0: 29 0a 20 20 23 20 20 20 20 20 20 69 73 20 73 65  ).  #      is se
18d0: 74 20 74 6f 20 74 68 65 20 2d 70 68 72 61 73 65  t to the -phrase
18e0: 63 6f 75 6e 74 76 61 72 20 6f 75 74 70 75 74 2e  countvar output.
18f0: 0a 20 20 23 0a 20 20 73 65 74 20 72 65 73 20 5b  .  #.  set res [
1900: 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b 20  list].  catch { 
1910: 61 72 72 61 79 20 75 6e 73 65 74 20 68 69 74 73  array unset hits
1920: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 22 53 45   }.  db eval "SE
1930: 4c 45 43 54 20 64 6f 63 69 64 2c 20 2a 20 46 52  LECT docid, * FR
1940: 4f 4d 20 24 74 62 6c 22 20 64 20 7b 0a 20 20 20  OM $tbl" d {.   
1950: 20 73 65 74 20 69 43 6f 6c 20 30 0a 20 20 20 20   set iCol 0.    
1960: 66 6f 72 65 61 63 68 20 63 6f 6c 20 5b 6c 72 61  foreach col [lra
1970: 6e 67 65 20 24 64 28 2a 29 20 31 20 65 6e 64 5d  nge $d(*) 1 end]
1980: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 64 6f 63   {.      set doc
1990: 69 64 20 24 64 28 64 6f 63 69 64 29 0a 20 20 20  id $d(docid).   
19a0: 20 20 20 69 66 20 7b 24 69 43 6f 6c 46 69 6c 74     if {$iColFilt
19b0: 65 72 3c 30 20 7c 7c 20 24 69 43 6f 6c 3d 3d 24  er<0 || $iCol==$
19c0: 69 43 6f 6c 46 69 6c 74 65 72 7d 20 7b 0a 20 20  iColFilter} {.  
19d0: 20 20 20 20 20 20 73 65 74 20 68 69 74 20 5b 66        set hit [f
19e0: 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 24  ts3_near_match $
19f0: 64 28 24 63 6f 6c 29 20 24 65 78 70 72 20 2d 70  d($col) $expr -p
1a00: 20 63 6f 75 6e 74 73 28 24 64 6f 63 69 64 2c 24   counts($docid,$
1a10: 69 43 6f 6c 29 5d 0a 20 20 20 20 20 20 20 20 69  iCol)].        i
1a20: 66 20 7b 24 68 69 74 7d 20 7b 20 73 65 74 20 68  f {$hit} { set h
1a30: 69 74 73 28 24 64 6f 63 69 64 29 20 31 20 7d 0a  its($docid) 1 }.
1a40: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1a50: 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74         set count
1a60: 73 28 24 64 6f 63 69 64 2c 24 69 43 6f 6c 29 20  s($docid,$iCol) 
1a70: 24 6d 69 73 73 0a 20 20 20 20 20 20 7d 0a 20 20  $miss.      }.  
1a80: 20 20 20 20 69 6e 63 72 20 69 43 6f 6c 0a 20 20      incr iCol.  
1a90: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 6e 50    }.  }.  set nP
1aa0: 68 72 61 73 65 20 5b 65 78 70 72 20 28 5b 6c 6c  hrase [expr ([ll
1ab0: 65 6e 67 74 68 20 24 65 78 70 72 5d 2b 31 29 2f  ength $expr]+1)/
1ac0: 32 5d 0a 20 20 73 65 74 20 6e 43 6f 6c 20 24 69  2].  set nCol $i
1ad0: 43 6f 6c 0a 0a 20 20 23 20 54 68 69 73 20 62 6c  Col..  # This bl
1ae0: 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68  ock populates th
1af0: 65 20 6e 48 69 74 20 61 6e 64 20 6e 44 6f 63 20  e nHit and nDoc 
1b00: 61 72 72 61 79 73 2e 20 46 6f 72 20 65 61 63 68  arrays. For each
1b10: 20 70 68 72 61 73 65 2f 63 6f 6c 75 6d 6e 0a 20   phrase/column. 
1b20: 20 23 20 69 6e 20 74 68 65 20 71 75 65 72 79 2f   # in the query/
1b30: 74 61 62 6c 65 2c 20 61 72 72 61 79 20 65 6c 65  table, array ele
1b40: 6d 65 6e 74 73 20 61 72 65 20 73 65 74 20 61 73  ments are set as
1b50: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 23 0a 20 20   follows:.  #.  
1b60: 23 20 20 20 6e 48 69 74 28 24 69 50 68 72 61 73  #   nHit($iPhras
1b70: 65 2c 24 69 43 6f 6c 29 20 2d 20 54 6f 74 61 6c  e,$iCol) - Total
1b80: 20 6e 75 6d 62 65 72 20 6f 66 20 68 69 74 73 20   number of hits 
1b90: 66 6f 72 20 70 68 72 61 73 65 20 24 69 50 68 72  for phrase $iPhr
1ba0: 61 73 65 20 69 6e 20 0a 20 20 23 20 20 20 20 20  ase in .  #     
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 24 69 43 6f       column $iCo
1bd0: 6c 2e 0a 20 20 23 0a 20 20 23 20 20 20 6e 44 6f  l..  #.  #   nDo
1be0: 63 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c  c($iPhrase,$iCol
1bf0: 29 20 2d 20 4e 75 6d 62 65 72 20 6f 66 20 64 6f  ) - Number of do
1c00: 63 75 6d 65 6e 74 73 20 77 69 74 68 20 61 74 20  cuments with at 
1c10: 6c 65 61 73 74 20 6f 6e 65 20 68 69 74 20 66 6f  least one hit fo
1c20: 72 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20  r.  #           
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c40: 68 72 61 73 65 20 24 69 50 68 72 61 73 65 20 69  hrase $iPhrase i
1c50: 6e 20 63 6f 6c 75 6d 6e 20 24 69 43 6f 6c 2e 0a  n column $iCol..
1c60: 20 20 23 0a 20 20 66 6f 72 20 7b 73 65 74 20 69    #.  for {set i
1c70: 50 68 72 61 73 65 20 30 7d 20 7b 24 69 50 68 72  Phrase 0} {$iPhr
1c80: 61 73 65 20 3c 20 24 6e 50 68 72 61 73 65 7d 20  ase < $nPhrase} 
1c90: 7b 69 6e 63 72 20 69 50 68 72 61 73 65 7d 20 7b  {incr iPhrase} {
1ca0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 43  .    for {set iC
1cb0: 6f 6c 20 30 7d 20 7b 24 69 43 6f 6c 20 3c 20 24  ol 0} {$iCol < $
1cc0: 6e 43 6f 6c 7d 20 7b 69 6e 63 72 20 69 43 6f 6c  nCol} {incr iCol
1cd0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 48  } {.      set nH
1ce0: 69 74 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f  it($iPhrase,$iCo
1cf0: 6c 29 20 30 0a 20 20 20 20 20 20 73 65 74 20 6e  l) 0.      set n
1d00: 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24 69 43  Doc($iPhrase,$iC
1d10: 6f 6c 29 20 30 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol) 0.    }.  }.
1d20: 20 20 66 6f 72 65 61 63 68 20 6b 65 79 20 5b 61    foreach key [a
1d30: 72 72 61 79 20 6e 61 6d 65 73 20 63 6f 75 6e 74  rray names count
1d40: 73 5d 20 7b 0a 20 20 20 20 73 65 74 20 69 43 6f  s] {.    set iCo
1d50: 6c 20 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74  l [lindex [split
1d60: 20 24 6b 65 79 20 2c 5d 20 31 5d 0a 20 20 20 20   $key ,] 1].    
1d70: 73 65 74 20 69 50 68 72 61 73 65 20 30 0a 20 20  set iPhrase 0.  
1d80: 20 20 66 6f 72 65 61 63 68 20 63 20 24 63 6f 75    foreach c $cou
1d90: 6e 74 73 28 24 6b 65 79 29 20 7b 0a 20 20 20 20  nts($key) {.    
1da0: 20 20 69 66 20 7b 24 63 3e 30 7d 20 7b 20 69 6e    if {$c>0} { in
1db0: 63 72 20 6e 44 6f 63 28 24 69 50 68 72 61 73 65  cr nDoc($iPhrase
1dc0: 2c 24 69 43 6f 6c 29 20 31 20 7d 0a 20 20 20 20  ,$iCol) 1 }.    
1dd0: 20 20 69 6e 63 72 20 6e 48 69 74 28 24 69 50 68    incr nHit($iPh
1de0: 72 61 73 65 2c 24 69 43 6f 6c 29 20 24 63 0a 20  rase,$iCol) $c. 
1df0: 20 20 20 20 20 69 6e 63 72 20 69 50 68 72 61 73       incr iPhras
1e00: 65 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  e.    }.  }..  i
1e10: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 64 65 66  f {[llength $def
1e20: 65 72 72 65 64 5d 20 26 26 20 5b 6c 6c 65 6e 67  erred] && [lleng
1e30: 74 68 20 24 65 78 70 72 5d 3d 3d 31 7d 20 7b 0a  th $expr]==1} {.
1e40: 20 20 20 20 73 65 74 20 70 68 72 61 73 65 20 5b      set phrase [
1e50: 6c 69 6e 64 65 78 20 24 65 78 70 72 20 30 5d 0a  lindex $expr 0].
1e60: 20 20 20 20 73 65 74 20 72 65 77 72 69 74 74 65      set rewritte
1e70: 6e 20 5b 6c 69 73 74 5d 0a 20 20 20 20 73 65 74  n [list].    set
1e80: 20 70 61 72 74 69 61 6c 20 30 0a 20 20 20 20 66   partial 0.    f
1e90: 6f 72 65 61 63 68 20 74 6f 6b 20 24 70 68 72 61  oreach tok $phra
1ea0: 73 65 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b  se {.      if {[
1eb0: 6c 73 65 61 72 63 68 20 24 64 65 66 65 72 72 65  lsearch $deferre
1ec0: 64 20 24 74 6f 6b 5d 3e 3d 30 7d 20 7b 0a 20 20  d $tok]>=0} {.  
1ed0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
1ee0: 77 72 69 74 74 65 6e 20 2a 0a 20 20 20 20 20 20  written *.      
1ef0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
1f00: 20 6c 61 70 70 65 6e 64 20 72 65 77 72 69 74 74   lappend rewritt
1f10: 65 6e 20 24 74 6f 6b 0a 20 20 20 20 20 20 20 20  en $tok.        
1f20: 73 65 74 20 70 61 72 74 69 61 6c 20 31 0a 20 20  set partial 1.  
1f30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f40: 69 66 20 7b 24 70 61 72 74 69 61 6c 3d 3d 30 7d  if {$partial==0}
1f50: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74 62 6c   {.      set tbl
1f60: 73 69 7a 65 20 5b 64 62 20 6f 6e 65 20 22 53 45  size [db one "SE
1f70: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1f80: 4f 4d 20 24 74 62 6c 22 5d 0a 20 20 20 20 20 20  OM $tbl"].      
1f90: 66 6f 72 20 7b 73 65 74 20 69 43 6f 6c 20 30 7d  for {set iCol 0}
1fa0: 20 7b 24 69 43 6f 6c 20 3c 20 24 6e 43 6f 6c 7d   {$iCol < $nCol}
1fb0: 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20 7b 0a 20   {incr iCol} {. 
1fc0: 20 20 20 20 20 20 20 73 65 74 20 6e 48 69 74 28         set nHit(
1fd0: 30 2c 24 69 43 6f 6c 29 20 24 74 62 6c 73 69 7a  0,$iCol) $tblsiz
1fe0: 65 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 44  e.        set nD
1ff0: 6f 63 28 30 2c 24 69 43 6f 6c 29 20 24 74 62 6c  oc(0,$iCol) $tbl
2000: 73 69 7a 65 0a 20 20 20 20 20 20 7d 0a 20 20 20  size.      }.   
2010: 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 77 72   } elseif {$rewr
2020: 69 74 74 65 6e 20 21 3d 20 24 70 68 72 61 73 65  itten != $phrase
2030: 7d 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 20  } {.      while 
2040: 7b 5b 6c 69 6e 64 65 78 20 24 72 65 77 72 69 74  {[lindex $rewrit
2050: 74 65 6e 20 65 6e 64 5d 20 3d 3d 20 22 2a 22 7d  ten end] == "*"}
2060: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 72   {.        set r
2070: 65 77 72 69 74 74 65 6e 20 5b 6c 72 61 6e 67 65  ewritten [lrange
2080: 20 24 72 65 77 72 69 74 74 65 6e 20 30 20 65 6e   $rewritten 0 en
2090: 64 2d 31 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20  d-1].      }.   
20a0: 20 20 20 77 68 69 6c 65 20 7b 5b 6c 69 6e 64 65     while {[linde
20b0: 78 20 24 72 65 77 72 69 74 74 65 6e 20 30 5d 20  x $rewritten 0] 
20c0: 3d 3d 20 22 2a 22 7d 20 7b 0a 20 20 20 20 20 20  == "*"} {.      
20d0: 20 20 73 65 74 20 72 65 77 72 69 74 74 65 6e 20    set rewritten 
20e0: 5b 6c 72 61 6e 67 65 20 24 72 65 77 72 69 74 74  [lrange $rewritt
20f0: 65 6e 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20  en 1 end].      
2100: 7d 0a 20 20 20 20 20 20 67 65 74 5f 73 69 6e 67  }.      get_sing
2110: 6c 65 5f 6e 65 61 72 5f 72 65 73 75 6c 74 73 20  le_near_results 
2120: 24 74 62 6c 20 5b 6c 69 73 74 20 24 72 65 77 72  $tbl [list $rewr
2130: 69 74 74 65 6e 5d 20 7b 7d 20 61 52 65 77 72 69  itten] {} aRewri
2140: 74 65 20 6e 75 6c 6c 65 6e 74 72 79 0a 20 20 20  te nullentry.   
2150: 20 20 20 66 6f 72 65 61 63 68 20 64 6f 63 69 64     foreach docid
2160: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 68 69   [array names hi
2170: 74 73 5d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ts] {.        se
2180: 74 20 61 4d 61 74 63 68 69 6e 66 6f 28 24 64 6f  t aMatchinfo($do
2190: 63 69 64 29 20 24 61 52 65 77 72 69 74 65 28 24  cid) $aRewrite($
21a0: 64 6f 63 69 64 29 0a 20 20 20 20 20 20 7d 0a 20  docid).      }. 
21b0: 20 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20       return.    
21c0: 7d 0a 20 20 7d 0a 0a 20 20 23 20 53 65 74 20 75  }.  }..  # Set u
21d0: 70 20 74 68 65 20 61 4d 61 74 63 68 69 6e 66 6f  p the aMatchinfo
21e0: 20 61 72 72 61 79 2e 20 46 6f 72 20 65 61 63 68   array. For each
21f0: 20 64 6f 63 75 6d 65 6e 74 2c 20 73 65 74 20 61   document, set a
2200: 4d 61 74 63 68 69 6e 66 6f 28 24 64 6f 63 69 64  Matchinfo($docid
2210: 29 20 74 6f 0a 20 20 23 20 63 6f 6e 74 61 69 6e  ) to.  # contain
2220: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6d   the output of m
2230: 61 74 63 68 69 6e 66 6f 28 27 78 27 29 20 66 6f  atchinfo('x') fo
2240: 72 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 0a  r the document..
2250: 20 20 23 0a 20 20 66 6f 72 65 61 63 68 20 64 6f    #.  foreach do
2260: 63 69 64 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  cid [array names
2270: 20 68 69 74 73 5d 20 7b 0a 20 20 20 20 73 65 74   hits] {.    set
2280: 20 6d 69 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66   mi [list].    f
2290: 6f 72 20 7b 73 65 74 20 69 50 68 72 61 73 65 20  or {set iPhrase 
22a0: 30 7d 20 7b 24 69 50 68 72 61 73 65 3c 24 6e 50  0} {$iPhrase<$nP
22b0: 68 72 61 73 65 7d 20 7b 69 6e 63 72 20 69 50 68  hrase} {incr iPh
22c0: 72 61 73 65 7d 20 7b 0a 20 20 20 20 20 20 66 6f  rase} {.      fo
22d0: 72 20 7b 73 65 74 20 69 43 6f 6c 20 30 7d 20 7b  r {set iCol 0} {
22e0: 24 69 43 6f 6c 3c 24 6e 43 6f 6c 7d 20 7b 69 6e  $iCol<$nCol} {in
22f0: 63 72 20 69 43 6f 6c 7d 20 7b 0a 20 20 20 20 20  cr iCol} {.     
2300: 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 20 5b 6c     lappend mi [l
2310: 69 6e 64 65 78 20 24 63 6f 75 6e 74 73 28 24 64  index $counts($d
2320: 6f 63 69 64 2c 24 69 43 6f 6c 29 20 24 69 50 68  ocid,$iCol) $iPh
2330: 72 61 73 65 5d 0a 20 20 20 20 20 20 20 20 6c 61  rase].        la
2340: 70 70 65 6e 64 20 6d 69 20 24 6e 48 69 74 28 24  ppend mi $nHit($
2350: 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 0a 20  iPhrase,$iCol). 
2360: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d         lappend m
2370: 69 20 24 6e 44 6f 63 28 24 69 50 68 72 61 73 65  i $nDoc($iPhrase
2380: 2c 24 69 43 6f 6c 29 0a 20 20 20 20 20 20 7d 0a  ,$iCol).      }.
2390: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 61 4d      }.    set aM
23a0: 61 74 63 68 69 6e 66 6f 28 24 64 6f 63 69 64 29  atchinfo($docid)
23b0: 20 24 6d 69 0a 20 20 7d 0a 0a 20 20 23 20 53 65   $mi.  }..  # Se
23c0: 74 20 75 70 20 74 68 65 20 6e 75 6c 6c 65 6e 74  t up the nullent
23d0: 72 79 20 6f 75 74 70 75 74 2e 0a 20 20 23 0a 20  ry output..  #. 
23e0: 20 73 65 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b   set nullentry [
23f0: 6c 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74  list].  for {set
2400: 20 69 50 68 72 61 73 65 20 30 7d 20 7b 24 69 50   iPhrase 0} {$iP
2410: 68 72 61 73 65 3c 24 6e 50 68 72 61 73 65 7d 20  hrase<$nPhrase} 
2420: 7b 69 6e 63 72 20 69 50 68 72 61 73 65 7d 20 7b  {incr iPhrase} {
2430: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 43  .    for {set iC
2440: 6f 6c 20 30 7d 20 7b 24 69 43 6f 6c 3c 24 6e 43  ol 0} {$iCol<$nC
2450: 6f 6c 7d 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20  ol} {incr iCol} 
2460: 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  {.      lappend 
2470: 6e 75 6c 6c 65 6e 74 72 79 20 30 20 24 6e 48 69  nullentry 0 $nHi
2480: 74 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c  t($iPhrase,$iCol
2490: 29 20 24 6e 44 6f 63 28 24 69 50 68 72 61 73 65  ) $nDoc($iPhrase
24a0: 2c 24 69 43 6f 6c 29 0a 20 20 20 20 7d 0a 20 20  ,$iCol).    }.  
24b0: 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 6d 61 74 63 68  }.}...proc match
24c0: 69 6e 67 5f 62 72 61 63 6b 65 74 73 20 7b 65 78  ing_brackets {ex
24d0: 70 72 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  pr} {.  if {[str
24e0: 69 6e 67 20 72 61 6e 67 65 20 24 65 78 70 72 20  ing range $expr 
24f0: 30 20 30 5d 21 3d 22 28 22 20 7c 7c 20 5b 73 74  0 0]!="(" || [st
2500: 72 69 6e 67 20 72 61 6e 67 65 20 24 65 78 70 72  ring range $expr
2510: 20 65 6e 64 20 65 6e 64 5d 20 21 3d 22 29 22 7d   end end] !=")"}
2520: 20 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 30   { .    return 0
2530: 20 0a 20 20 7d 0a 0a 20 20 73 65 74 20 69 42 72   .  }..  set iBr
2540: 61 63 6b 65 74 20 31 0a 20 20 73 65 74 20 6e 45  acket 1.  set nE
2550: 78 70 72 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  xpr [string leng
2560: 74 68 20 24 65 78 70 72 5d 0a 20 20 66 6f 72 20  th $expr].  for 
2570: 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 42 72 61  {set i 1} {$iBra
2580: 63 6b 65 74 20 26 26 20 24 69 20 3c 20 24 6e 45  cket && $i < $nE
2590: 78 70 72 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  xpr} {incr i} {.
25a0: 20 20 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e      set c [strin
25b0: 67 20 72 61 6e 67 65 20 24 65 78 70 72 20 24 69  g range $expr $i
25c0: 20 24 69 5d 0a 20 20 20 20 69 66 20 7b 24 63 20   $i].    if {$c 
25d0: 3d 3d 20 22 28 22 7d 20 7b 69 6e 63 72 20 69 42  == "("} {incr iB
25e0: 72 61 63 6b 65 74 7d 0a 20 20 20 20 69 66 20 7b  racket}.    if {
25f0: 24 63 20 3d 3d 20 22 29 22 7d 20 7b 69 6e 63 72  $c == ")"} {incr
2600: 20 69 42 72 61 63 6b 65 74 20 2d 31 7d 0a 20 20   iBracket -1}.  
2610: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70  }..  return [exp
2620: 72 20 28 24 69 42 72 61 63 6b 65 74 3d 3d 30 20  r ($iBracket==0 
2630: 26 26 20 24 69 3d 3d 24 6e 45 78 70 72 29 5d 0a  && $i==$nExpr)].
2640: 7d 0a 0a 70 72 6f 63 20 67 65 74 5f 6e 65 61 72  }..proc get_near
2650: 5f 72 65 73 75 6c 74 73 20 7b 74 62 6c 20 65 78  _results {tbl ex
2660: 70 72 20 64 65 66 65 72 72 65 64 20 61 72 72 61  pr deferred arra
2670: 79 76 61 72 20 7b 6e 75 6c 6c 76 61 72 20 22 22  yvar {nullvar ""
2680: 7d 7d 20 7b 0a 20 20 75 70 76 61 72 20 24 61 72  }} {.  upvar $ar
2690: 72 61 79 76 61 72 20 61 4d 61 74 63 68 69 6e 66  rayvar aMatchinf
26a0: 6f 0a 20 20 69 66 20 7b 24 6e 75 6c 6c 76 61 72  o.  if {$nullvar
26b0: 20 21 3d 20 22 22 7d 20 7b 20 75 70 76 61 72 20   != ""} { upvar 
26c0: 24 6e 75 6c 6c 76 61 72 20 6e 75 6c 6c 65 6e 74  $nullvar nullent
26d0: 72 79 20 7d 0a 0a 20 20 73 65 74 20 65 78 70 72  ry }..  set expr
26e0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 65   [string trim $e
26f0: 78 70 72 5d 0a 20 20 77 68 69 6c 65 20 7b 20 5b  xpr].  while { [
2700: 6d 61 74 63 68 69 6e 67 5f 62 72 61 63 6b 65 74  matching_bracket
2710: 73 20 24 65 78 70 72 5d 20 7d 20 7b 0a 20 20 20  s $expr] } {.   
2720: 20 73 65 74 20 65 78 70 72 20 5b 73 74 72 69 6e   set expr [strin
2730: 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72  g trim [string r
2740: 61 6e 67 65 20 24 65 78 70 72 20 31 20 65 6e 64  ange $expr 1 end
2750: 2d 31 5d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  -1]].  }..  set 
2760: 70 72 65 63 28 4e 4f 54 29 20 31 0a 20 20 73 65  prec(NOT) 1.  se
2770: 74 20 70 72 65 63 28 41 4e 44 29 20 32 0a 20 20  t prec(AND) 2.  
2780: 73 65 74 20 70 72 65 63 28 4f 52 29 20 20 33 0a  set prec(OR)  3.
2790: 0a 20 20 73 65 74 20 63 75 72 72 65 6e 74 70 72  .  set currentpr
27a0: 65 63 20 30 0a 20 20 73 65 74 20 69 42 72 61 63  ec 0.  set iBrac
27b0: 6b 65 74 20 30 0a 20 20 73 65 74 20 65 78 70 72  ket 0.  set expr
27c0: 5f 6c 65 6e 67 74 68 20 5b 6c 6c 65 6e 67 74 68  _length [llength
27d0: 20 24 65 78 70 72 5d 0a 20 20 66 6f 72 20 7b 73   $expr].  for {s
27e0: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 65  et i 0} {$i < $e
27f0: 78 70 72 5f 6c 65 6e 67 74 68 7d 20 7b 69 6e 63  xpr_length} {inc
2800: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 6f  r i} {.    set o
2810: 70 20 5b 6c 69 6e 64 65 78 20 24 65 78 70 72 20  p [lindex $expr 
2820: 24 69 5d 0a 20 20 20 20 69 66 20 7b 24 69 42 72  $i].    if {$iBr
2830: 61 63 6b 65 74 3d 3d 30 20 26 26 20 5b 69 6e 66  acket==0 && [inf
2840: 6f 20 65 78 69 73 74 73 20 70 72 65 63 28 24 6f  o exists prec($o
2850: 70 29 5d 20 26 26 20 24 70 72 65 63 28 24 6f 70  p)] && $prec($op
2860: 29 3e 3d 24 63 75 72 72 65 6e 74 70 72 65 63 20  )>=$currentprec 
2870: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6f 70  } {.      set op
2880: 69 64 78 20 24 69 0a 20 20 20 20 20 20 73 65 74  idx $i.      set
2890: 20 63 75 72 72 65 6e 74 70 72 65 63 20 24 70 72   currentprec $pr
28a0: 65 63 28 24 6f 70 29 0a 20 20 20 20 7d 20 65 6c  ec($op).    } el
28b0: 73 65 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b  se {.      for {
28c0: 73 65 74 20 6a 20 30 7d 20 7b 24 6a 20 3c 20 5b  set j 0} {$j < [
28d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6f  string length $o
28e0: 70 5d 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20  p]} {incr j} {. 
28f0: 20 20 20 20 20 20 20 73 65 74 20 63 20 5b 73 74         set c [st
2900: 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70 20 24  ring range $op $
2910: 6a 20 24 6a 5d 0a 20 20 20 20 20 20 20 20 69 66  j $j].        if
2920: 20 7b 24 63 20 3d 3d 20 22 28 22 7d 20 7b 20 69   {$c == "("} { i
2930: 6e 63 72 20 69 42 72 61 63 6b 65 74 20 2b 31 20  ncr iBracket +1 
2940: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 63  }.        if {$c
2950: 20 3d 3d 20 22 29 22 7d 20 7b 20 69 6e 63 72 20   == ")"} { incr 
2960: 69 42 72 61 63 6b 65 74 20 2d 31 20 7d 0a 20 20  iBracket -1 }.  
2970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2980: 20 20 69 66 20 7b 24 69 42 72 61 63 6b 65 74 21    if {$iBracket!
2990: 3d 30 7d 20 7b 20 65 72 72 6f 72 20 22 6d 69 73  =0} { error "mis
29a0: 6d 61 74 63 68 65 64 20 62 72 61 63 6b 65 74 73  matched brackets
29b0: 20 69 6e 3a 20 24 65 78 70 72 22 20 7d 0a 0a 20   in: $expr" }.. 
29c0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
29d0: 73 20 6f 70 69 64 78 5d 3d 3d 30 7d 20 7b 0a 20  s opidx]==0} {. 
29e0: 20 20 20 67 65 74 5f 73 69 6e 67 6c 65 5f 6e 65     get_single_ne
29f0: 61 72 5f 72 65 73 75 6c 74 73 20 24 74 62 6c 20  ar_results $tbl 
2a00: 24 65 78 70 72 20 24 64 65 66 65 72 72 65 64 20  $expr $deferred 
2a10: 61 4d 61 74 63 68 69 6e 66 6f 20 6e 75 6c 6c 65  aMatchinfo nulle
2a20: 6e 74 72 79 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ntry.  } else {.
2a30: 20 20 20 20 73 65 74 20 65 4c 65 66 74 20 20 5b      set eLeft  [
2a40: 6c 72 61 6e 67 65 20 24 65 78 70 72 20 30 20 5b  lrange $expr 0 [
2a50: 65 78 70 72 20 24 6f 70 69 64 78 2d 31 5d 5d 0a  expr $opidx-1]].
2a60: 20 20 20 20 73 65 74 20 65 52 69 67 68 74 20 5b      set eRight [
2a70: 6c 72 61 6e 67 65 20 24 65 78 70 72 20 5b 65 78  lrange $expr [ex
2a80: 70 72 20 24 6f 70 69 64 78 2b 31 5d 20 65 6e 64  pr $opidx+1] end
2a90: 5d 0a 0a 20 20 20 20 67 65 74 5f 6e 65 61 72 5f  ]..    get_near_
2aa0: 72 65 73 75 6c 74 73 20 24 74 62 6c 20 24 65 4c  results $tbl $eL
2ab0: 65 66 74 20 20 24 64 65 66 65 72 72 65 64 20 61  eft  $deferred a
2ac0: 4c 65 66 74 20 20 6e 75 6c 6c 6c 65 66 74 0a 20  Left  nullleft. 
2ad0: 20 20 20 67 65 74 5f 6e 65 61 72 5f 72 65 73 75     get_near_resu
2ae0: 6c 74 73 20 24 74 62 6c 20 24 65 52 69 67 68 74  lts $tbl $eRight
2af0: 20 24 64 65 66 65 72 72 65 64 20 61 52 69 67 68   $deferred aRigh
2b00: 74 20 6e 75 6c 6c 72 69 67 68 74 0a 0a 20 20 20  t nullright..   
2b10: 20 73 77 69 74 63 68 20 2d 2d 20 5b 6c 69 6e 64   switch -- [lind
2b20: 65 78 20 24 65 78 70 72 20 24 6f 70 69 64 78 5d  ex $expr $opidx]
2b30: 20 7b 0a 20 20 20 20 20 20 22 4e 4f 54 22 20 7b   {.      "NOT" {
2b40: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
2b50: 20 68 69 74 20 5b 61 72 72 61 79 20 6e 61 6d 65   hit [array name
2b60: 73 20 61 4c 65 66 74 5d 20 7b 0a 20 20 20 20 20  s aLeft] {.     
2b70: 20 20 20 20 20 69 66 20 7b 30 3d 3d 5b 69 6e 66       if {0==[inf
2b80: 6f 20 65 78 69 73 74 73 20 61 52 69 67 68 74 28  o exists aRight(
2b90: 24 68 69 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20  $hit)]} {.      
2ba0: 20 20 20 20 20 20 73 65 74 20 61 4d 61 74 63 68        set aMatch
2bb0: 69 6e 66 6f 28 24 68 69 74 29 20 24 61 4c 65 66  info($hit) $aLef
2bc0: 74 28 24 68 69 74 29 0a 20 20 20 20 20 20 20 20  t($hit).        
2bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2be0: 20 20 20 20 20 20 73 65 74 20 6e 75 6c 6c 65 6e        set nullen
2bf0: 74 72 79 20 24 6e 75 6c 6c 6c 65 66 74 0a 20 20  try $nullleft.  
2c00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 22 41 4e      }..      "AN
2c10: 44 22 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  D" {.        for
2c20: 65 61 63 68 20 68 69 74 20 5b 61 72 72 61 79 20  each hit [array 
2c30: 6e 61 6d 65 73 20 61 4c 65 66 74 5d 20 7b 0a 20  names aLeft] {. 
2c40: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
2c50: 66 6f 20 65 78 69 73 74 73 20 61 52 69 67 68 74  fo exists aRight
2c60: 28 24 68 69 74 29 5d 7d 20 7b 0a 20 20 20 20 20  ($hit)]} {.     
2c70: 20 20 20 20 20 20 20 73 65 74 20 61 4d 61 74 63         set aMatc
2c80: 68 69 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e  hinfo($hit) [con
2c90: 63 61 74 20 24 61 4c 65 66 74 28 24 68 69 74 29  cat $aLeft($hit)
2ca0: 20 24 61 52 69 67 68 74 28 24 68 69 74 29 5d 0a   $aRight($hit)].
2cb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65      }.        se
2cd0: 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b 63 6f 6e  t nullentry [con
2ce0: 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74 20 24 6e  cat $nullleft $n
2cf0: 75 6c 6c 72 69 67 68 74 5d 0a 20 20 20 20 20 20  ullright].      
2d00: 7d 0a 0a 20 20 20 20 20 20 22 4f 52 22 20 7b 0a  }..      "OR" {.
2d10: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2d20: 68 69 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  hit [array names
2d30: 20 61 4c 65 66 74 5d 20 7b 0a 20 20 20 20 20 20   aLeft] {.      
2d40: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2d50: 69 73 74 73 20 61 52 69 67 68 74 28 24 68 69 74  ists aRight($hit
2d60: 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  )]} {.          
2d70: 20 20 73 65 74 20 61 4d 61 74 63 68 69 6e 66 6f    set aMatchinfo
2d80: 28 24 68 69 74 29 20 5b 63 6f 6e 63 61 74 20 24  ($hit) [concat $
2d90: 61 4c 65 66 74 28 24 68 69 74 29 20 24 61 52 69  aLeft($hit) $aRi
2da0: 67 68 74 28 24 68 69 74 29 5d 0a 20 20 20 20 20  ght($hit)].     
2db0: 20 20 20 20 20 20 20 75 6e 73 65 74 20 61 52 69         unset aRi
2dc0: 67 68 74 28 24 68 69 74 29 0a 20 20 20 20 20 20  ght($hit).      
2dd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2de0: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 4d 61           set aMa
2df0: 74 63 68 69 6e 66 6f 28 24 68 69 74 29 20 5b 63  tchinfo($hit) [c
2e00: 6f 6e 63 61 74 20 24 61 4c 65 66 74 28 24 68 69  oncat $aLeft($hi
2e10: 74 29 20 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20  t) $nullright]. 
2e20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
2e40: 65 61 63 68 20 68 69 74 20 5b 61 72 72 61 79 20  each hit [array 
2e50: 6e 61 6d 65 73 20 61 52 69 67 68 74 5d 20 7b 0a  names aRight] {.
2e60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 4d            set aM
2e70: 61 74 63 68 69 6e 66 6f 28 24 68 69 74 29 20 5b  atchinfo($hit) [
2e80: 63 6f 6e 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74  concat $nullleft
2e90: 20 24 61 52 69 67 68 74 28 24 68 69 74 29 5d 0a   $aRight($hit)].
2ea0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2eb0: 20 20 20 73 65 74 20 6e 75 6c 6c 65 6e 74 72 79     set nullentry
2ec0: 20 5b 63 6f 6e 63 61 74 20 24 6e 75 6c 6c 6c 65   [concat $nullle
2ed0: 66 74 20 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20  ft $nullright]. 
2ee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ef0: 0a 7d 0a 0a 0a 23 20 45 6e 64 20 6f 66 20 74 65  .}...# End of te
2f00: 73 74 20 70 72 6f 63 73 2e 20 41 63 74 75 61 6c  st procs. Actual
2f10: 20 74 65 73 74 73 20 61 72 65 20 62 65 6c 6f 77   tests are below
2f20: 20 74 68 69 73 20 6c 69 6e 65 2e 0a 23 2d 2d 2d   this line..#---
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d  -------..#------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
2fd0: 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 73 20  wing test cases 
2fe0: 2d 20 66 74 73 33 61 75 74 6f 2d 31 2e 2a 20 2d  - fts3auto-1.* -
2ff0: 20 66 6f 63 75 73 20 6f 6e 20 74 65 73 74 69 6e   focus on testin
3000: 67 20 74 68 65 20 54 63 6c 20 0a 23 20 63 6f 6d  g the Tcl .# com
3010: 6d 61 6e 64 20 5b 66 74 73 33 5f 6e 65 61 72 5f  mand [fts3_near_
3020: 6d 61 74 63 68 5d 2c 20 77 68 69 63 68 20 69 73  match], which is
3030: 20 75 73 65 64 20 62 79 20 6f 74 68 65 72 20 74   used by other t
3040: 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
3050: 65 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 66  e..#.proc test_f
3060: 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 7b  ts3_near_match {
3070: 74 6e 20 64 6f 63 20 65 78 70 72 20 72 65 73 7d  tn doc expr res}
3080: 20 7b 0a 20 20 66 74 73 33 5f 6e 65 61 72 5f 6d   {.  fts3_near_m
3090: 61 74 63 68 20 24 64 6f 63 20 24 65 78 70 72 20  atch $doc $expr 
30a0: 2d 70 68 72 61 73 65 63 6f 75 6e 74 76 61 72 20  -phrasecountvar 
30b0: 70 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 74  p.  uplevel do_t
30c0: 65 73 74 20 5b 6c 69 73 74 20 24 74 6e 5d 20 5b  est [list $tn] [
30d0: 6c 69 73 74 20 5b 6c 69 73 74 20 73 65 74 20 7b  list [list set {
30e0: 7d 20 24 70 5d 5d 20 5b 6c 69 73 74 20 24 72 65  } $p]] [list $re
30f0: 73 5d 0a 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f  s].}..test_fts3_
3100: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 31  near_match 1.1.1
3110: 20 7b 61 20 62 20 63 20 61 20 62 7d 20 61 20 20   {a b c a b} a  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 7b 32 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e   {2}.test_fts3_n
3140: 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 32 20  ear_match 1.1.2 
3150: 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 61 20 35  {a b c a b} {a 5
3160: 20 62 20 36 20 63 7d 20 20 20 20 20 20 20 20 20   b 6 c}         
3170: 7b 32 20 32 20 31 7d 0a 74 65 73 74 5f 66 74 73  {2 2 1}.test_fts
3180: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 31  3_near_match 1.1
3190: 2e 33 20 7b 61 20 62 20 63 20 61 20 62 7d 20 7b  .3 {a b c a b} {
31a0: 22 61 20 62 22 7d 20 20 20 20 20 20 20 20 20 20  "a b"}          
31b0: 20 20 20 7b 32 7d 0a 74 65 73 74 5f 66 74 73 33     {2}.test_fts3
31c0: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e  _near_match 1.1.
31d0: 34 20 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 22  4 {a b c a b} {"
31e0: 62 20 63 22 7d 20 20 20 20 20 20 20 20 20 20 20  b c"}           
31f0: 20 20 7b 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f    {1}.test_fts3_
3200: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 35  near_match 1.1.5
3210: 20 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 22 63   {a b c a b} {"c
3220: 20 63 22 7d 20 20 20 20 20 20 20 20 20 20 20 20   c"}            
3230: 20 7b 30 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f   {0}..test_fts3_
3240: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 31  near_match 1.2.1
3250: 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67 22   "a b c d e f g"
3260: 20 7b 62 20 32 20 66 7d 20 20 20 20 20 20 20 20   {b 2 f}        
3270: 20 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74 73 33   {0 0}.test_fts3
3280: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e  _near_match 1.2.
3290: 32 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67  2 "a b c d e f g
32a0: 22 20 7b 62 20 33 20 66 7d 20 20 20 20 20 20 20  " {b 3 f}       
32b0: 20 20 7b 31 20 31 7d 0a 74 65 73 74 5f 66 74 73    {1 1}.test_fts
32c0: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32  3_near_match 1.2
32d0: 2e 33 20 22 61 20 62 20 63 20 64 20 65 20 66 20  .3 "a b c d e f 
32e0: 67 22 20 7b 66 20 32 20 62 7d 20 20 20 20 20 20  g" {f 2 b}      
32f0: 20 20 20 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74     {0 0}.test_ft
3300: 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e  s3_near_match 1.
3310: 32 2e 34 20 22 61 20 62 20 63 20 64 20 65 20 66  2.4 "a b c d e f
3320: 20 67 22 20 7b 66 20 33 20 62 7d 20 20 20 20 20   g" {f 3 b}     
3330: 20 20 20 20 7b 31 20 31 7d 0a 74 65 73 74 5f 66      {1 1}.test_f
3340: 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31  ts3_near_match 1
3350: 2e 32 2e 35 20 22 61 20 62 20 63 20 64 20 65 20  .2.5 "a b c d e 
3360: 66 20 67 22 20 7b 22 61 20 62 22 20 32 20 22 66  f g" {"a b" 2 "f
3370: 20 67 22 7d 20 7b 30 20 30 7d 0a 74 65 73 74 5f   g"} {0 0}.test_
3380: 66 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20  fts3_near_match 
3390: 31 2e 32 2e 36 20 22 61 20 62 20 63 20 64 20 65  1.2.6 "a b c d e
33a0: 20 66 20 67 22 20 7b 22 61 20 62 22 20 33 20 22   f g" {"a b" 3 "
33b0: 66 20 67 22 7d 20 7b 31 20 31 7d 0a 0a 73 65 74  f g"} {1 1}..set
33c0: 20 41 20 22 61 20 62 20 63 20 64 20 65 20 66 20   A "a b c d e f 
33d0: 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20  g h i j k l m n 
33e0: 6f 20 70 20 71 20 72 20 73 20 74 20 75 20 76 20  o p q r s t u v 
33f0: 77 20 78 20 79 20 7a 22 0a 74 65 73 74 5f 66 74  w x y z".test_ft
3400: 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e  s3_near_match 1.
3410: 33 2e 31 20 24 41 20 7b 22 63 20 64 22 20 35 20  3.1 $A {"c d" 5 
3420: 22 69 20 6a 22 20 31 20 22 65 20 66 22 7d 20 20  "i j" 1 "e f"}  
3430: 20 20 20 20 7b 30 20 30 20 30 7d 0a 74 65 73 74      {0 0 0}.test
3440: 5f 66 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68  _fts3_near_match
3450: 20 31 2e 33 2e 32 20 24 41 20 7b 22 63 20 64 22   1.3.2 $A {"c d"
3460: 20 35 20 22 69 20 6a 22 20 32 20 22 65 20 66 22   5 "i j" 2 "e f"
3470: 7d 20 20 20 20 20 20 7b 31 20 31 20 31 7d 0a 0a  }      {1 1 1}..
3480: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
34d0: 73 74 20 63 61 73 65 73 20 66 74 73 33 61 75 74  st cases fts3aut
34e0: 6f 2d 32 2e 2a 20 72 75 6e 20 73 6f 6d 65 20 73  o-2.* run some s
34f0: 69 6d 70 6c 65 20 74 65 73 74 73 20 75 73 69 6e  imple tests usin
3500: 67 20 74 68 65 20 0a 23 20 5b 64 6f 5f 66 74 73  g the .# [do_fts
3510: 33 71 75 65 72 79 5f 74 65 73 74 5d 20 70 72 6f  3query_test] pro
3520: 63 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  c..#.foreach {tn
3530: 20 63 72 65 61 74 65 7d 20 7b 0a 20 20 31 20 20   create} {.  1  
3540: 20 20 22 66 74 73 34 28 61 2c 20 62 29 22 0a 20    "fts4(a, b)". 
3550: 20 32 20 20 20 20 22 66 74 73 34 28 61 2c 20 62   2    "fts4(a, b
3560: 2c 20 6f 72 64 65 72 3d 44 45 53 43 29 22 0a 20  , order=DESC)". 
3570: 20 33 20 20 20 20 22 66 74 73 34 28 61 2c 20 62   3    "fts4(a, b
3580: 2c 20 6f 72 64 65 72 3d 41 53 43 29 22 0a 20 20  , order=ASC)".  
3590: 34 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c  4    "fts4(a, b,
35a0: 20 70 72 65 66 69 78 3d 31 29 22 0a 20 20 35 20   prefix=1)".  5 
35b0: 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f     "fts4(a, b, o
35c0: 72 64 65 72 3d 44 45 53 43 2c 20 70 72 65 66 69  rder=DESC, prefi
35d0: 78 3d 31 29 22 0a 20 20 36 20 20 20 20 22 66 74  x=1)".  6    "ft
35e0: 73 34 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d 41  s4(a, b, order=A
35f0: 53 43 2c 20 70 72 65 66 69 78 3d 31 29 22 0a 7d  SC, prefix=1)".}
3600: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24   {.  do_test 2.$
3610: 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.1 {.    catch
3620: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
3630: 20 74 31 20 7d 0a 20 20 20 20 65 78 65 63 73 71   t1 }.    execsq
3640: 6c 20 20 22 43 52 45 41 54 45 20 56 49 52 54 55  l  "CREATE VIRTU
3650: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
3660: 47 20 24 63 72 65 61 74 65 22 0a 20 20 20 20 66  G $create".    f
3670: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
3680: 3c 33 32 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  <32} {incr i} {.
3690: 20 20 20 20 20 20 73 65 74 20 64 6f 63 20 5b 6c        set doc [l
36a0: 69 73 74 5d 0a 20 20 20 20 20 20 69 66 20 7b 24  ist].      if {$
36b0: 69 26 30 78 30 31 7d 20 7b 6c 61 70 70 65 6e 64  i&0x01} {lappend
36c0: 20 64 6f 63 20 6f 6e 65 7d 0a 20 20 20 20 20 20   doc one}.      
36d0: 69 66 20 7b 24 69 26 30 78 30 32 7d 20 7b 6c 61  if {$i&0x02} {la
36e0: 70 70 65 6e 64 20 64 6f 63 20 74 77 6f 7d 0a 20  ppend doc two}. 
36f0: 20 20 20 20 20 69 66 20 7b 24 69 26 30 78 30 34       if {$i&0x04
3700: 7d 20 7b 6c 61 70 70 65 6e 64 20 64 6f 63 20 74  } {lappend doc t
3710: 68 72 65 65 7d 0a 20 20 20 20 20 20 69 66 20 7b  hree}.      if {
3720: 24 69 26 30 78 30 38 7d 20 7b 6c 61 70 70 65 6e  $i&0x08} {lappen
3730: 64 20 64 6f 63 20 66 6f 75 72 7d 0a 20 20 20 20  d doc four}.    
3740: 20 20 69 66 20 7b 24 69 26 30 78 31 30 7d 20 7b    if {$i&0x10} {
3750: 6c 61 70 70 65 6e 64 20 64 6f 63 20 66 69 76 65  lappend doc five
3760: 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  }.      execsql 
3770: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3780: 20 56 41 4c 55 45 53 28 24 64 6f 63 2c 20 6e 75   VALUES($doc, nu
3790: 6c 6c 29 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20  ll) }.    }.  } 
37a0: 7b 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  {}..  foreach {t
37b0: 6e 32 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31  n2 expr} {.    1
37c0: 20 20 20 20 20 7b 6f 6e 65 7d 0a 20 20 20 20 32       {one}.    2
37d0: 20 20 20 20 20 7b 6f 6e 65 20 4e 45 41 52 2f 31       {one NEAR/1
37e0: 20 66 69 76 65 7d 0a 20 20 20 20 33 20 20 20 20   five}.    3    
37f0: 20 7b 74 2a 7d 0a 20 20 20 20 34 20 20 20 20 20   {t*}.    4     
3800: 7b 74 2a 20 4e 45 41 52 2f 30 20 66 69 76 65 7d  {t* NEAR/0 five}
3810: 0a 20 20 20 20 35 20 20 20 20 20 7b 6f 2a 20 4e  .    5     {o* N
3820: 45 41 52 2f 31 20 66 2a 7d 0a 20 20 20 20 36 20  EAR/1 f*}.    6 
3830: 20 20 20 20 7b 6f 6e 65 20 4e 45 41 52 20 66 69      {one NEAR fi
3840: 76 65 20 4e 45 41 52 20 74 77 6f 20 4e 45 41 52  ve NEAR two NEAR
3850: 20 66 6f 75 72 20 4e 45 41 52 20 74 68 72 65 65   four NEAR three
3860: 7d 0a 20 20 20 20 37 20 20 20 20 20 7b 6f 6e 65  }.    7     {one
3870: 20 4e 45 41 52 20 78 79 7a 7d 0a 20 20 20 20 38   NEAR xyz}.    8
3880: 20 20 20 20 20 7b 6f 6e 65 20 4f 52 20 74 77 6f       {one OR two
3890: 7d 0a 20 20 20 20 39 20 20 20 20 20 7b 6f 6e 65  }.    9     {one
38a0: 20 41 4e 44 20 74 77 6f 7d 0a 20 20 20 20 31 30   AND two}.    10
38b0: 20 20 20 20 7b 6f 6e 65 20 4e 4f 54 20 74 77 6f      {one NOT two
38c0: 7d 0a 20 20 20 20 31 31 20 20 20 20 7b 6f 6e 65  }.    11    {one
38d0: 20 41 4e 44 20 74 77 6f 20 4f 52 20 74 68 72 65   AND two OR thre
38e0: 65 7d 0a 20 20 20 20 31 32 20 20 20 20 7b 74 68  e}.    12    {th
38f0: 72 65 65 20 4f 52 20 6f 6e 65 20 41 4e 44 20 74  ree OR one AND t
3900: 77 6f 7d 0a 20 20 20 20 31 33 20 20 20 20 7b 28  wo}.    13    {(
3910: 74 68 72 65 65 20 4f 52 20 6f 6e 65 29 20 41 4e  three OR one) AN
3920: 44 20 74 77 6f 7d 0a 20 20 20 20 31 34 20 20 20  D two}.    14   
3930: 20 7b 28 74 68 72 65 65 20 4f 52 20 6f 6e 65 29   {(three OR one)
3940: 20 41 4e 44 20 74 77 6f 20 4e 4f 54 20 28 66 69   AND two NOT (fi
3950: 76 65 20 4e 4f 54 20 66 6f 75 72 29 7d 0a 20 20  ve NOT four)}.  
3960: 20 20 31 35 20 20 20 20 7b 22 6f 6e 65 20 74 77    15    {"one tw
3970: 6f 22 7d 0a 20 20 20 20 31 36 20 20 20 20 7b 22  o"}.    16    {"
3980: 6f 6e 65 20 74 77 6f 22 20 4e 4f 54 20 22 74 68  one two" NOT "th
3990: 72 65 65 20 66 6f 75 72 22 7d 0a 20 20 7d 20 7b  ree four"}.  } {
39a0: 0a 20 20 20 20 64 6f 5f 66 74 73 33 71 75 65 72  .    do_fts3quer
39b0: 79 5f 74 65 73 74 20 32 2e 24 74 6e 2e 32 2e 24  y_test 2.$tn.2.$
39c0: 74 6e 32 20 74 31 20 24 65 78 70 72 0a 20 20 7d  tn2 t1 $expr.  }
39d0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3a20: 23 20 53 6f 6d 65 20 74 65 73 74 20 63 61 73 65  # Some test case
3a30: 73 20 69 6e 76 6f 6c 76 69 6e 67 20 64 65 66 65  s involving defe
3a40: 72 72 65 64 20 74 6f 6b 65 6e 73 2e 0a 23 0a 0a  rred tokens..#..
3a50: 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 72 65 61  foreach {tn crea
3a60: 74 65 7d 20 7b 0a 20 20 31 20 20 20 20 22 66 74  te} {.  1    "ft
3a70: 73 34 28 78 29 22 0a 20 20 32 20 20 20 20 22 66  s4(x)".  2    "f
3a80: 74 73 34 28 78 2c 20 6f 72 64 65 72 3d 44 45 53  ts4(x, order=DES
3a90: 43 29 22 0a 7d 20 7b 0a 20 20 63 61 74 63 68 73  C)".} {.  catchs
3aa0: 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
3ab0: 74 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 20  t1 }.  execsql  
3ac0: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
3ad0: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 24  TABLE t1 USING $
3ae0: 63 72 65 61 74 65 22 0a 20 20 64 6f 5f 65 78 65  create".  do_exe
3af0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e  csql_test 3.$tn.
3b00: 31 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1 {.    INSERT I
3b10: 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29  NTO t1(docid, x)
3b20: 20 56 41 4c 55 45 53 28 2d 32 2c 20 27 61 20 62   VALUES(-2, 'a b
3b30: 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a   c d e f g h i j
3b40: 20 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   k');.    INSERT
3b50: 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20   INTO t1(docid, 
3b60: 78 29 20 56 41 4c 55 45 53 28 2d 31 2c 20 27 62  x) VALUES(-1, 'b
3b70: 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a   c d e f g h i j
3b80: 20 6b 20 61 27 29 3b 0a 20 20 20 20 49 4e 53 45   k a');.    INSE
3b90: 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64  RT INTO t1(docid
3ba0: 2c 20 78 29 20 56 41 4c 55 45 53 28 30 2c 20 27  , x) VALUES(0, '
3bb0: 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20  c d e f g h i j 
3bc0: 6b 20 61 20 62 27 29 3b 0a 20 20 20 20 49 4e 53  k a b');.    INS
3bd0: 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69  ERT INTO t1(doci
3be0: 64 2c 20 78 29 20 56 41 4c 55 45 53 28 31 2c 20  d, x) VALUES(1, 
3bf0: 27 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b  'd e f g h i j k
3c00: 20 61 20 62 20 63 27 29 3b 0a 20 20 20 20 49 4e   a b c');.    IN
3c10: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63  SERT INTO t1(doc
3c20: 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 32 2c  id, x) VALUES(2,
3c30: 20 27 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20   'e f g h i j k 
3c40: 61 20 62 20 63 20 64 27 29 3b 0a 20 20 20 20 49  a b c d');.    I
3c50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f  NSERT INTO t1(do
3c60: 63 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 33  cid, x) VALUES(3
3c70: 2c 20 27 66 20 67 20 68 20 69 20 6a 20 6b 20 61  , 'f g h i j k a
3c80: 20 62 20 63 20 64 20 65 27 29 3b 0a 20 20 20 20   b c d e');.    
3c90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 64  INSERT INTO t1(d
3ca0: 6f 63 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28  ocid, x) VALUES(
3cb0: 34 2c 20 27 61 20 63 20 65 20 67 20 69 20 6b 27  4, 'a c e g i k'
3cc0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3cd0: 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20  TO t1(docid, x) 
3ce0: 56 41 4c 55 45 53 28 35 2c 20 27 61 20 64 20 67  VALUES(5, 'a d g
3cf0: 20 6a 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   j');.    INSERT
3d00: 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20   INTO t1(docid, 
3d10: 78 29 20 56 41 4c 55 45 53 28 36 2c 20 27 63 20  x) VALUES(6, 'c 
3d20: 61 20 62 27 29 3b 0a 20 20 7d 0a 0a 20 20 73 65  a b');.  }..  se
3d30: 74 20 6c 69 6d 69 74 20 5b 66 74 73 33 5f 6d 61  t limit [fts3_ma
3d40: 6b 65 5f 64 65 66 65 72 72 61 62 6c 65 20 74 31  ke_deferrable t1
3d50: 20 63 5d 0a 0a 20 20 64 6f 5f 66 74 73 33 71 75   c]..  do_fts3qu
3d60: 65 72 79 5f 74 65 73 74 20 33 2e 24 74 6e 2e 32  ery_test 3.$tn.2
3d70: 2e 31 20 74 31 20 7b 61 20 4f 52 20 63 7d 0a 0a  .1 t1 {a OR c}..
3d80: 20 20 69 66 63 61 70 61 62 6c 65 20 66 74 73 34    ifcapable fts4
3d90: 5f 64 65 66 65 72 72 65 64 20 7b 0a 20 20 20 20  _deferred {.    
3da0: 64 6f 5f 74 65 73 74 20 33 2e 24 74 6e 2e 33 20  do_test 3.$tn.3 
3db0: 7b 20 66 74 73 33 5f 7a 65 72 6f 5f 6c 6f 6e 67  { fts3_zero_long
3dc0: 5f 73 65 67 6d 65 6e 74 73 20 74 31 20 24 6c 69  _segments t1 $li
3dd0: 6d 69 74 20 7d 20 7b 31 7d 0a 20 20 7d 0a 0a 20  mit } {1}.  }.. 
3de0: 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 65 78   foreach {tn2 ex
3df0: 70 72 20 64 65 66 7d 20 7b 0a 20 20 20 20 31 20  pr def} {.    1 
3e00: 20 20 20 20 7b 61 20 4e 45 41 52 20 63 7d 20 20      {a NEAR c}  
3e10: 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 20            {}.   
3e20: 20 32 20 20 20 20 20 7b 61 20 41 4e 44 20 63 7d   2     {a AND c}
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 0a 20               c. 
3e40: 20 20 20 33 20 20 20 20 20 7b 22 61 20 63 22 7d     3     {"a c"}
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
3e60: 0a 20 20 20 20 34 20 20 20 20 20 7b 22 63 20 61  .    4     {"c a
3e70: 22 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "}              
3e80: 20 63 0a 20 20 20 20 35 20 20 20 20 20 7b 22 61   c.    5     {"a
3e90: 20 63 22 20 4e 45 41 52 2f 31 20 67 7d 20 20 20   c" NEAR/1 g}   
3ea0: 20 20 20 7b 7d 0a 20 20 20 20 36 20 20 20 20 20     {}.    6     
3eb0: 7b 22 61 20 63 22 20 4e 45 41 52 2f 30 20 67 7d  {"a c" NEAR/0 g}
3ec0: 20 20 20 20 20 20 7b 7d 0a 20 20 7d 20 7b 0a 20        {}.  } {. 
3ed0: 20 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f     do_fts3query_
3ee0: 74 65 73 74 20 33 2e 24 74 6e 2e 34 2e 24 74 6e  test 3.$tn.4.$tn
3ef0: 32 20 2d 64 65 66 65 72 72 65 64 20 24 64 65 66  2 -deferred $def
3f00: 20 74 31 20 24 65 78 70 72 0a 20 20 7d 0a 7d 0a   t1 $expr.  }.}.
3f10: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 0a  ------------.# .
3f60: 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 72 65 61  foreach {tn crea
3f70: 74 65 7d 20 7b 0a 20 20 31 20 20 20 20 22 66 74  te} {.  1    "ft
3f80: 73 34 28 78 2c 20 79 29 22 0a 20 20 32 20 20 20  s4(x, y)".  2   
3f90: 20 22 66 74 73 34 28 78 2c 20 79 2c 20 6f 72 64   "fts4(x, y, ord
3fa0: 65 72 3d 44 45 53 43 29 22 0a 20 20 33 20 20 20  er=DESC)".  3   
3fb0: 20 22 66 74 73 34 28 78 2c 20 79 2c 20 6f 72 64   "fts4(x, y, ord
3fc0: 65 72 3d 44 45 53 43 2c 20 70 72 65 66 69 78 3d  er=DESC, prefix=
3fd0: 32 29 22 0a 7d 20 7b 0a 0a 20 20 65 78 65 63 73  2)".} {..  execs
3fe0: 71 6c 20 5b 73 75 62 73 74 20 7b 0a 20 20 20 20  ql [subst {.    
3ff0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
4000: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
4010: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
4020: 20 24 63 72 65 61 74 65 3b 0a 20 20 20 20 49 4e   $create;.    IN
4030: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4040: 55 45 53 28 27 6f 6e 65 20 74 77 6f 20 66 69 76  UES('one two fiv
4050: 65 20 66 6f 75 72 20 66 69 76 65 27 2c 20 27 27  e four five', ''
4060: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4070: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 27 2c  TO t1 VALUES('',
4080: 20 27 6f 6e 65 20 74 77 6f 20 66 69 76 65 20 66   'one two five f
4090: 6f 75 72 20 66 69 76 65 27 29 3b 0a 20 20 20 20  our five');.    
40a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
40b0: 41 4c 55 45 53 28 27 6f 6e 65 20 74 77 6f 27 2c  ALUES('one two',
40c0: 20 27 66 69 76 65 20 66 6f 75 72 20 66 69 76 65   'five four five
40d0: 27 29 3b 0a 20 20 7d 5d 0a 0a 20 20 64 6f 5f 66  ');.  }]..  do_f
40e0: 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e  ts3query_test 4.
40f0: 24 74 6e 2e 31 2e 31 20 74 31 20 7b 6f 6e 65 20  $tn.1.1 t1 {one 
4100: 41 4e 44 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66  AND five}.  do_f
4110: 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e  ts3query_test 4.
4120: 24 74 6e 2e 31 2e 32 20 74 31 20 7b 6f 6e 65 20  $tn.1.2 t1 {one 
4130: 4e 45 41 52 20 66 69 76 65 7d 0a 20 20 64 6f 5f  NEAR five}.  do_
4140: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
4150: 2e 24 74 6e 2e 31 2e 33 20 74 31 20 7b 6f 6e 65  .$tn.1.3 t1 {one
4160: 20 4e 45 41 52 2f 31 20 66 69 76 65 7d 0a 20 20   NEAR/1 five}.  
4170: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
4180: 74 20 34 2e 24 74 6e 2e 31 2e 34 20 74 31 20 7b  t 4.$tn.1.4 t1 {
4190: 6f 6e 65 20 4e 45 41 52 2f 32 20 66 69 76 65 7d  one NEAR/2 five}
41a0: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
41b0: 74 65 73 74 20 34 2e 24 74 6e 2e 31 2e 35 20 74  test 4.$tn.1.5 t
41c0: 31 20 7b 6f 6e 65 20 4e 45 41 52 2f 33 20 66 69  1 {one NEAR/3 fi
41d0: 76 65 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 34  ve}..  do_test 4
41e0: 2e 24 74 6e 2e 32 20 7b 20 0a 20 20 20 20 73 65  .$tn.2 { .    se
41f0: 74 20 6c 69 6d 69 74 20 5b 66 74 73 33 5f 6d 61  t limit [fts3_ma
4200: 6b 65 5f 64 65 66 65 72 72 61 62 6c 65 20 74 31  ke_deferrable t1
4210: 20 66 69 76 65 5d 0a 20 20 20 20 65 78 65 63 73   five].    execs
4220: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4230: 20 74 31 28 74 31 29 20 56 41 4c 55 45 53 28 27   t1(t1) VALUES('
4240: 6f 70 74 69 6d 69 7a 65 27 29 20 7d 0a 20 20 20  optimize') }.   
4250: 20 69 66 63 61 70 61 62 6c 65 20 66 74 73 34 5f   ifcapable fts4_
4260: 64 65 66 65 72 72 65 64 20 7b 0a 20 20 20 20 20  deferred {.     
4270: 20 65 78 70 72 20 7b 5b 66 74 73 33 5f 7a 65 72   expr {[fts3_zer
4280: 6f 5f 6c 6f 6e 67 5f 73 65 67 6d 65 6e 74 73 20  o_long_segments 
4290: 74 31 20 24 6c 69 6d 69 74 5d 3e 30 7d 0a 20 20  t1 $limit]>0}.  
42a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
42b0: 20 65 78 70 72 20 31 0a 20 20 20 20 7d 0a 20 20   expr 1.    }.  
42c0: 7d 20 7b 31 7d 0a 0a 20 20 64 6f 5f 66 74 73 33  } {1}..  do_fts3
42d0: 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e  query_test 4.$tn
42e0: 2e 33 2e 31 20 2d 64 65 66 65 72 72 65 64 20 66  .3.1 -deferred f
42f0: 69 76 65 20 74 31 20 7b 6f 6e 65 20 41 4e 44 20  ive t1 {one AND 
4300: 66 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71  five}.  do_fts3q
4310: 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e  uery_test 4.$tn.
4320: 33 2e 32 20 2d 64 65 66 65 72 72 65 64 20 66 69  3.2 -deferred fi
4330: 76 65 20 74 31 20 7b 6f 6e 65 20 4e 45 41 52 20  ve t1 {one NEAR 
4340: 66 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71  five}.  do_fts3q
4350: 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e  uery_test 4.$tn.
4360: 33 2e 33 20 2d 64 65 66 65 72 72 65 64 20 66 69  3.3 -deferred fi
4370: 76 65 20 74 31 20 7b 6f 6e 65 20 4e 45 41 52 2f  ve t1 {one NEAR/
4380: 31 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73  1 five}.  do_fts
4390: 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74  3query_test 4.$t
43a0: 6e 2e 33 2e 34 20 2d 64 65 66 65 72 72 65 64 20  n.3.4 -deferred 
43b0: 66 69 76 65 20 74 31 20 7b 6f 6e 65 20 4e 45 41  five t1 {one NEA
43c0: 52 2f 32 20 66 69 76 65 7d 0a 0a 20 20 64 6f 5f  R/2 five}..  do_
43d0: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
43e0: 2e 24 74 6e 2e 33 2e 35 20 2d 64 65 66 65 72 72  .$tn.3.5 -deferr
43f0: 65 64 20 66 69 76 65 20 74 31 20 7b 6f 6e 65 20  ed five t1 {one 
4400: 4e 45 41 52 2f 33 20 66 69 76 65 7d 0a 0a 20 20  NEAR/3 five}..  
4410: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
4420: 74 20 34 2e 24 74 6e 2e 34 2e 31 20 2d 64 65 66  t 4.$tn.4.1 -def
4430: 65 72 72 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e  erred fi* t1 {on
4440: 2a 20 41 4e 44 20 66 69 2a 7d 0a 20 20 64 6f 5f  * AND fi*}.  do_
4450: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
4460: 2e 24 74 6e 2e 34 2e 32 20 2d 64 65 66 65 72 72  .$tn.4.2 -deferr
4470: 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 4e  ed fi* t1 {on* N
4480: 45 41 52 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74  EAR fi*}.  do_ft
4490: 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24  s3query_test 4.$
44a0: 74 6e 2e 34 2e 33 20 2d 64 65 66 65 72 72 65 64  tn.4.3 -deferred
44b0: 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41   fi* t1 {on* NEA
44c0: 52 2f 31 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74  R/1 fi*}.  do_ft
44d0: 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24  s3query_test 4.$
44e0: 74 6e 2e 34 2e 34 20 2d 64 65 66 65 72 72 65 64  tn.4.4 -deferred
44f0: 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41   fi* t1 {on* NEA
4500: 52 2f 32 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74  R/2 fi*}.  do_ft
4510: 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24  s3query_test 4.$
4520: 74 6e 2e 34 2e 35 20 2d 64 65 66 65 72 72 65 64  tn.4.5 -deferred
4530: 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41   fi* t1 {on* NEA
4540: 52 2f 33 20 66 69 2a 7d 0a 7d 0a 0a 23 2d 2d 2d  R/3 fi*}.}..#---
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
45a0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 63 61 73  llowing test cas
45b0: 65 73 20 2d 20 66 74 73 33 61 75 74 6f 2d 35 2e  es - fts3auto-5.
45c0: 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20 75 73 69  * - focus on usi
45d0: 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ng prefix indexe
45e0: 73 2e 0a 23 0a 73 65 74 20 63 68 75 6e 6b 63 6f  s..#.set chunkco
45f0: 6e 66 69 67 20 5b 66 74 73 33 5f 63 6f 6e 66 69  nfig [fts3_confi
4600: 67 75 72 65 5f 69 6e 63 72 5f 6c 6f 61 64 20 31  gure_incr_load 1
4610: 20 31 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20   1].foreach {tn 
4620: 63 72 65 61 74 65 20 70 65 6e 64 69 6e 67 7d 20  create pending} 
4630: 7b 0a 20 20 31 20 20 20 20 22 66 74 73 34 28 61  {.  1    "fts4(a
4640: 2c 20 62 29 22 20 20 20 20 20 20 20 20 20 20 20  , b)"           
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 31 0a 20 20 32 20 20 20 20         1.  2    
4670: 22 66 74 73 34 28 61 2c 20 62 2c 20 6f 72 64 65  "fts4(a, b, orde
4680: 72 3d 41 53 43 2c 20 70 72 65 66 69 78 3d 31 29  r=ASC, prefix=1)
4690: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a  "             1.
46a0: 20 20 33 20 20 20 20 22 66 74 73 34 28 61 2c 20    3    "fts4(a, 
46b0: 62 2c 20 6f 72 64 65 72 3d 41 53 43 2c 20 20 70  b, order=ASC,  p
46c0: 72 65 66 69 78 3d 5c 22 31 2c 33 5c 22 29 22 20  refix=\"1,3\")" 
46d0: 20 20 20 20 20 30 0a 20 20 34 20 20 20 20 22 66       0.  4    "f
46e0: 74 73 34 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d  ts4(a, b, order=
46f0: 44 45 53 43 2c 20 70 72 65 66 69 78 3d 5c 22 32  DESC, prefix=\"2
4700: 2c 34 5c 22 29 22 20 20 20 20 20 20 30 0a 20 20  ,4\")"      0.  
4710: 35 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c  5    "fts4(a, b,
4720: 20 6f 72 64 65 72 3d 44 45 53 43 2c 20 70 72 65   order=DESC, pre
4730: 66 69 78 3d 5c 22 31 5c 22 29 22 20 20 20 20 20  fix=\"1\")"     
4740: 20 20 20 30 0a 20 20 36 20 20 20 20 22 66 74 73     0.  6    "fts
4750: 34 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d 41 53  4(a, b, order=AS
4760: 43 2c 20 20 70 72 65 66 69 78 3d 5c 22 31 2c 33  C,  prefix=\"1,3
4770: 5c 22 29 22 20 20 20 20 20 20 30 0a 7d 20 7b 0a  \")"      0.} {.
4780: 0a 20 20 65 78 65 63 73 71 6c 20 5b 73 75 62 73  .  execsql [subs
4790: 74 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t {.    DROP TAB
47a0: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b  LE IF EXISTS t1;
47b0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
47c0: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
47d0: 4e 47 20 24 63 72 65 61 74 65 3b 0a 20 20 7d 5d  NG $create;.  }]
47e0: 0a 0a 20 20 69 66 20 7b 24 70 65 6e 64 69 6e 67  ..  if {$pending
47f0: 7d 20 7b 65 78 65 63 73 71 6c 20 42 45 47 49 4e  } {execsql BEGIN
4800: 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 61 20  }..  foreach {a 
4810: 62 7d 20 7b 0a 20 20 20 20 22 74 68 65 20 73 6f  b} {.    "the so
4820: 6e 67 20 6f 66 20 73 6f 6e 67 73 20 77 68 69 63  ng of songs whic
4830: 68 20 69 73 20 73 6f 6c 6f 6d 6f 6e 73 22 0a 20  h is solomons". 
4840: 20 20 20 22 6c 65 74 20 68 69 6d 20 6b 69 73 73     "let him kiss
4850: 20 6d 65 20 77 69 74 68 20 74 68 65 20 6b 69 73   me with the kis
4860: 73 65 73 20 6f 66 20 68 69 73 20 6d 6f 75 74 68  ses of his mouth
4870: 20 66 6f 72 20 74 68 79 20 6c 6f 76 65 20 69 73   for thy love is
4880: 20 62 65 74 74 65 72 20 74 68 61 6e 20 77 69 6e   better than win
4890: 65 22 0a 20 20 20 20 22 62 65 63 61 75 73 65 20  e".    "because 
48a0: 6f 66 20 74 68 65 20 73 61 76 6f 75 72 20 6f 66  of the savour of
48b0: 20 74 68 79 20 67 6f 6f 64 20 6f 69 6e 74 6d 65   thy good ointme
48c0: 6e 74 73 20 74 68 79 20 6e 61 6d 65 20 69 73 20  nts thy name is 
48d0: 61 73 20 6f 69 6e 74 6d 65 6e 74 20 70 6f 75 72  as ointment pour
48e0: 65 64 20 66 6f 72 74 68 20 74 68 65 72 65 66 6f  ed forth therefo
48f0: 72 65 20 64 6f 20 74 68 65 20 76 69 72 67 69 6e  re do the virgin
4900: 73 20 6c 6f 76 65 20 74 68 65 65 22 0a 20 20 20  s love thee".   
4910: 20 22 64 72 61 77 20 6d 65 20 77 65 20 77 69 6c   "draw me we wil
4920: 6c 20 72 75 6e 20 61 66 74 65 72 20 74 68 65 65  l run after thee
4930: 20 74 68 65 20 6b 69 6e 67 20 68 61 74 68 20 62   the king hath b
4940: 72 6f 75 67 68 74 20 6d 65 20 69 6e 74 6f 20 68  rought me into h
4950: 69 73 20 63 68 61 6d 62 65 72 73 20 77 65 20 77  is chambers we w
4960: 69 6c 6c 20 62 65 20 67 6c 61 64 20 61 6e 64 20  ill be glad and 
4970: 72 65 6a 6f 69 63 65 20 69 6e 20 74 68 65 65 20  rejoice in thee 
4980: 77 65 20 77 69 6c 6c 20 72 65 6d 65 6d 62 65 72  we will remember
4990: 20 74 68 79 20 6c 6f 76 65 20 6d 6f 72 65 20 74   thy love more t
49a0: 68 61 6e 20 77 69 6e 65 20 74 68 65 20 75 70 72  han wine the upr
49b0: 69 67 68 74 20 6c 6f 76 65 20 74 68 65 65 22 0a  ight love thee".
49c0: 20 20 20 20 22 69 20 61 6d 20 62 6c 61 63 6b 20      "i am black 
49d0: 62 75 74 20 63 6f 6d 65 6c 79 20 6f 20 79 65 20  but comely o ye 
49e0: 64 61 75 67 68 74 65 72 73 20 6f 66 20 6a 65 72  daughters of jer
49f0: 75 73 61 6c 65 6d 20 61 73 20 74 68 65 20 74 65  usalem as the te
4a00: 6e 74 73 20 6f 66 20 6b 65 64 61 72 20 61 73 20  nts of kedar as 
4a10: 74 68 65 20 63 75 72 74 61 69 6e 73 20 6f 66 20  the curtains of 
4a20: 73 6f 6c 6f 6d 6f 6e 22 0a 20 20 20 20 22 6c 6f  solomon".    "lo
4a30: 6f 6b 20 6e 6f 74 20 75 70 6f 6e 20 6d 65 20 62  ok not upon me b
4a40: 65 63 61 75 73 65 20 69 20 61 6d 20 62 6c 61 63  ecause i am blac
4a50: 6b 20 62 65 63 61 75 73 65 20 74 68 65 20 73 75  k because the su
4a60: 6e 20 68 61 74 68 20 6c 6f 6f 6b 65 64 20 75 70  n hath looked up
4a70: 6f 6e 20 6d 65 20 6d 79 20 6d 6f 74 68 65 72 73  on me my mothers
4a80: 20 63 68 69 6c 64 72 65 6e 20 77 65 72 65 20 61   children were a
4a90: 6e 67 72 79 20 77 69 74 68 20 6d 65 20 74 68 65  ngry with me the
4aa0: 79 20 6d 61 64 65 20 6d 65 20 74 68 65 20 6b 65  y made me the ke
4ab0: 65 70 65 72 20 6f 66 20 74 68 65 20 76 69 6e 65  eper of the vine
4ac0: 79 61 72 64 73 20 62 75 74 20 6d 69 6e 65 20 6f  yards but mine o
4ad0: 77 6e 20 76 69 6e 65 79 61 72 64 20 68 61 76 65  wn vineyard have
4ae0: 20 69 20 6e 6f 74 20 6b 65 70 74 22 0a 20 20 20   i not kept".   
4af0: 20 22 74 65 6c 6c 20 6d 65 20 6f 20 74 68 6f 75   "tell me o thou
4b00: 20 77 68 6f 6d 20 6d 79 20 73 6f 75 6c 20 6c 6f   whom my soul lo
4b10: 76 65 74 68 20 77 68 65 72 65 20 74 68 6f 75 20  veth where thou 
4b20: 66 65 65 64 65 73 74 20 77 68 65 72 65 20 74 68  feedest where th
4b30: 6f 75 20 6d 61 6b 65 73 74 20 74 68 79 20 66 6c  ou makest thy fl
4b40: 6f 63 6b 20 74 6f 20 72 65 73 74 20 61 74 20 6e  ock to rest at n
4b50: 6f 6f 6e 20 66 6f 72 20 77 68 79 20 73 68 6f 75  oon for why shou
4b60: 6c 64 20 69 20 62 65 20 61 73 20 6f 6e 65 20 74  ld i be as one t
4b70: 68 61 74 20 74 75 72 6e 65 74 68 20 61 73 69 64  hat turneth asid
4b80: 65 20 62 79 20 74 68 65 20 66 6c 6f 63 6b 73 20  e by the flocks 
4b90: 6f 66 20 74 68 79 20 63 6f 6d 70 61 6e 69 6f 6e  of thy companion
4ba0: 73 3f 22 0a 20 20 20 20 22 69 66 20 74 68 6f 75  s?".    "if thou
4bb0: 20 6b 6e 6f 77 20 6e 6f 74 20 6f 20 74 68 6f 75   know not o thou
4bc0: 20 66 61 69 72 65 73 74 20 61 6d 6f 6e 67 20 77   fairest among w
4bd0: 6f 6d 65 6e 20 67 6f 20 74 68 79 20 77 61 79 20  omen go thy way 
4be0: 66 6f 72 74 68 20 62 79 20 74 68 65 20 66 6f 6f  forth by the foo
4bf0: 74 73 74 65 70 73 20 6f 66 20 74 68 65 20 66 6c  tsteps of the fl
4c00: 6f 63 6b 20 61 6e 64 20 66 65 65 64 20 74 68 79  ock and feed thy
4c10: 20 6b 69 64 73 20 62 65 73 69 64 65 20 74 68 65   kids beside the
4c20: 20 73 68 65 70 68 65 72 64 73 20 74 65 6e 74 73   shepherds tents
4c30: 22 0a 20 20 20 20 22 69 20 68 61 76 65 20 63 6f  ".    "i have co
4c40: 6d 70 61 72 65 64 20 74 68 65 65 20 6f 20 6d 79  mpared thee o my
4c50: 20 6c 6f 76 65 20 74 6f 20 61 20 63 6f 6d 70 61   love to a compa
4c60: 6e 79 20 6f 66 20 68 6f 72 73 65 73 20 69 6e 20  ny of horses in 
4c70: 70 68 61 72 61 6f 68 73 20 63 68 61 72 69 6f 74  pharaohs chariot
4c80: 73 22 0a 20 20 20 20 22 74 68 79 20 63 68 65 65  s".    "thy chee
4c90: 6b 73 20 61 72 65 20 63 6f 6d 65 6c 79 20 77 69  ks are comely wi
4ca0: 74 68 20 72 6f 77 73 20 6f 66 20 6a 65 77 65 6c  th rows of jewel
4cb0: 73 20 74 68 79 20 6e 65 63 6b 20 77 69 74 68 20  s thy neck with 
4cc0: 63 68 61 69 6e 73 20 6f 66 20 67 6f 6c 64 22 0a  chains of gold".
4cd0: 20 20 20 20 22 77 65 20 77 69 6c 6c 20 6d 61 6b      "we will mak
4ce0: 65 20 74 68 65 65 20 62 6f 72 64 65 72 73 20 6f  e thee borders o
4cf0: 66 20 67 6f 6c 64 20 77 69 74 68 20 73 74 75 64  f gold with stud
4d00: 73 20 6f 66 20 73 69 6c 76 65 72 22 0a 20 20 20  s of silver".   
4d10: 20 22 77 68 69 6c 65 20 74 68 65 20 6b 69 6e 67   "while the king
4d20: 20 73 69 74 74 65 74 68 20 61 74 20 68 69 73 20   sitteth at his 
4d30: 74 61 62 6c 65 20 6d 79 20 73 70 69 6b 65 6e 61  table my spikena
4d40: 72 64 20 73 65 6e 64 65 74 68 20 66 6f 72 74 68  rd sendeth forth
4d50: 20 74 68 65 20 73 6d 65 6c 6c 20 74 68 65 72 65   the smell there
4d60: 6f 66 22 0a 20 20 20 20 22 61 20 62 75 6e 64 6c  of".    "a bundl
4d70: 65 20 6f 66 20 6d 79 72 72 68 20 69 73 20 6d 79  e of myrrh is my
4d80: 20 77 65 6c 6c 62 65 6c 6f 76 65 64 20 75 6e 74   wellbeloved unt
4d90: 6f 20 6d 65 20 68 65 20 73 68 61 6c 6c 20 6c 69  o me he shall li
4da0: 65 20 61 6c 6c 20 6e 69 67 68 74 20 62 65 74 77  e all night betw
4db0: 69 78 74 20 6d 79 20 62 72 65 61 73 74 73 22 0a  ixt my breasts".
4dc0: 20 20 20 20 22 6d 79 20 62 65 6c 6f 76 65 64 20      "my beloved 
4dd0: 69 73 20 75 6e 74 6f 20 6d 65 20 61 73 20 61 20  is unto me as a 
4de0: 63 6c 75 73 74 65 72 20 6f 66 20 63 61 6d 70 68  cluster of camph
4df0: 69 72 65 20 69 6e 20 74 68 65 20 76 69 6e 65 79  ire in the viney
4e00: 61 72 64 73 20 6f 66 20 65 6e 20 67 65 64 69 22  ards of en gedi"
4e10: 0a 20 20 20 20 22 62 65 68 6f 6c 64 20 74 68 6f  .    "behold tho
4e20: 75 20 61 72 74 20 66 61 69 72 20 6d 79 20 6c 6f  u art fair my lo
4e30: 76 65 20 62 65 68 6f 6c 64 20 74 68 6f 75 20 61  ve behold thou a
4e40: 72 74 20 66 61 69 72 20 74 68 6f 75 20 68 61 73  rt fair thou has
4e50: 74 20 64 6f 76 65 73 20 65 79 65 73 22 0a 20 20  t doves eyes".  
4e60: 20 20 22 62 65 68 6f 6c 64 20 74 68 6f 75 20 61    "behold thou a
4e70: 72 74 20 66 61 69 72 20 6d 79 20 62 65 6c 6f 76  rt fair my belov
4e80: 65 64 20 79 65 61 20 70 6c 65 61 73 61 6e 74 20  ed yea pleasant 
4e90: 61 6c 73 6f 20 6f 75 72 20 62 65 64 20 69 73 20  also our bed is 
4ea0: 67 72 65 65 6e 22 0a 20 20 20 20 22 74 68 65 20  green".    "the 
4eb0: 62 65 61 6d 73 20 6f 66 20 6f 75 72 20 68 6f 75  beams of our hou
4ec0: 73 65 20 61 72 65 20 63 65 64 61 72 20 61 6e 64  se are cedar and
4ed0: 20 6f 75 72 20 72 61 66 74 65 72 73 20 6f 66 20   our rafters of 
4ee0: 66 69 72 22 0a 20 20 7d 20 7b 0a 20 20 20 20 65  fir".  } {.    e
4ef0: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
4f00: 4e 54 4f 20 74 31 28 61 2c 20 62 29 20 56 41 4c  NTO t1(a, b) VAL
4f10: 55 45 53 28 24 61 2c 20 24 62 29 7d 0a 20 20 7d  UES($a, $b)}.  }
4f20: 0a 0a 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  ...  do_fts3quer
4f30: 79 5f 74 65 73 74 20 35 2e 24 74 6e 2e 31 2e 31  y_test 5.$tn.1.1
4f40: 20 74 31 20 7b 73 2a 7d 0a 20 20 64 6f 5f 66 74   t1 {s*}.  do_ft
4f50: 73 33 71 75 65 72 79 5f 74 65 73 74 20 35 2e 24  s3query_test 5.$
4f60: 74 6e 2e 31 2e 32 20 74 31 20 7b 73 6f 2a 7d 0a  tn.1.2 t1 {so*}.
4f70: 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74    do_fts3query_t
4f80: 65 73 74 20 35 2e 24 74 6e 2e 31 2e 33 20 74 31  est 5.$tn.1.3 t1
4f90: 20 7b 22 73 2a 20 6f 2a 22 7d 0a 20 20 64 6f 5f   {"s* o*"}.  do_
4fa0: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 35  fts3query_test 5
4fb0: 2e 24 74 6e 2e 31 2e 34 20 74 31 20 7b 62 2a 20  .$tn.1.4 t1 {b* 
4fc0: 4e 45 41 52 2f 33 20 61 2a 7d 0a 20 20 64 6f 5f  NEAR/3 a*}.  do_
4fd0: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 35  fts3query_test 5
4fe0: 2e 24 74 6e 2e 31 2e 35 20 74 31 20 7b 61 2a 7d  .$tn.1.5 t1 {a*}
4ff0: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
5000: 74 65 73 74 20 35 2e 24 74 6e 2e 31 2e 36 20 74  test 5.$tn.1.6 t
5010: 31 20 7b 74 68 2a 20 4e 45 41 52 2f 35 20 61 2a  1 {th* NEAR/5 a*
5020: 20 4e 45 41 52 2f 35 20 77 2a 7d 0a 20 20 64 6f   NEAR/5 w*}.  do
5030: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
5040: 35 2e 24 74 6e 2e 31 2e 37 20 74 31 20 7b 22 62  5.$tn.1.7 t1 {"b
5050: 2a 20 74 68 2a 20 61 72 74 2a 20 66 61 69 72 2a  * th* art* fair*
5060: 22 7d 0a 0a 20 20 69 66 20 7b 24 70 65 6e 64 69  "}..  if {$pendi
5070: 6e 67 7d 20 7b 65 78 65 63 73 71 6c 20 43 4f 4d  ng} {execsql COM
5080: 4d 49 54 7d 0a 7d 0a 65 76 61 6c 20 66 74 73 33  MIT}.}.eval fts3
5090: 5f 63 6f 6e 66 69 67 75 72 65 5f 69 6e 63 72 5f  _configure_incr_
50a0: 6c 6f 61 64 20 24 63 68 75 6e 6b 63 6f 6e 66 69  load $chunkconfi
50b0: 67 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70  g..foreach {tn p
50c0: 65 6e 64 69 6e 67 20 63 72 65 61 74 65 7d 20 7b  ending create} {
50d0: 0a 20 20 31 20 20 20 20 30 20 22 66 74 73 34 28  .  1    0 "fts4(
50e0: 61 2c 20 62 2c 20 63 2c 20 64 29 22 0a 20 20 32  a, b, c, d)".  2
50f0: 20 20 20 20 31 20 22 66 74 73 34 28 61 2c 20 62      1 "fts4(a, b
5100: 2c 20 63 2c 20 64 29 22 0a 20 20 33 20 20 20 20  , c, d)".  3    
5110: 30 20 22 66 74 73 34 28 61 2c 20 62 2c 20 63 2c  0 "fts4(a, b, c,
5120: 20 64 2c 20 6f 72 64 65 72 3d 44 45 53 43 29 22   d, order=DESC)"
5130: 0a 20 20 34 20 20 20 20 31 20 22 66 74 73 34 28  .  4    1 "fts4(
5140: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 6f 72 64 65  a, b, c, d, orde
5150: 72 3d 44 45 53 43 29 22 0a 7d 20 7b 0a 20 20 65  r=DESC)".} {.  e
5160: 78 65 63 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a  xecsql [subst {.
5170: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
5180: 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20  F EXISTS t1;.   
5190: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
51a0: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 24  TABLE t1 USING $
51b0: 63 72 65 61 74 65 3b 0a 20 20 7d 5d 0a 0a 0a 20  create;.  }]... 
51c0: 20 69 66 20 7b 24 70 65 6e 64 69 6e 67 7d 20 7b   if {$pending} {
51d0: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 20 7d   execsql BEGIN }
51e0: 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62  ..  foreach {a b
51f0: 20 63 20 64 7d 20 7b 0a 20 20 20 20 22 41 20 42   c d} {.    "A B
5200: 20 43 22 20 22 44 20 45 20 46 22 20 22 47 20 48   C" "D E F" "G H
5210: 20 49 22 20 22 4a 20 4b 20 4c 22 0a 20 20 20 20   I" "J K L".    
5220: 22 42 20 43 20 44 22 20 22 45 20 46 20 47 22 20  "B C D" "E F G" 
5230: 22 48 20 49 20 4a 22 20 22 4b 20 4c 20 41 22 0a  "H I J" "K L A".
5240: 20 20 20 20 22 43 20 44 20 45 22 20 22 46 20 47      "C D E" "F G
5250: 20 48 22 20 22 49 20 4a 20 4b 22 20 22 4c 20 41   H" "I J K" "L A
5260: 20 42 22 0a 20 20 20 20 22 44 20 45 20 46 22 20   B".    "D E F" 
5270: 22 47 20 48 20 49 22 20 22 4a 20 4b 20 4c 22 20  "G H I" "J K L" 
5280: 22 41 20 42 20 43 22 0a 20 20 20 20 22 45 20 46  "A B C".    "E F
5290: 20 47 22 20 22 48 20 49 20 4a 22 20 22 4b 20 4c   G" "H I J" "K L
52a0: 20 41 22 20 22 42 20 43 20 44 22 0a 20 20 20 20   A" "B C D".    
52b0: 22 46 20 47 20 48 22 20 22 49 20 4a 20 4b 22 20  "F G H" "I J K" 
52c0: 22 4c 20 41 20 42 22 20 22 43 20 44 20 45 22 0a  "L A B" "C D E".
52d0: 20 20 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71    } {.    execsq
52e0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
52f0: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
5300: 2c 20 24 63 2c 20 24 64 29 20 7d 0a 20 20 7d 0a  , $c, $d) }.  }.
5310: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
5320: 74 65 73 74 20 36 2e 24 74 6e 2e 31 20 74 31 20  test 6.$tn.1 t1 
5330: 7b 62 3a 47 7d 0a 20 20 64 6f 5f 66 74 73 33 71  {b:G}.  do_fts3q
5340: 75 65 72 79 5f 74 65 73 74 20 36 2e 24 74 6e 2e  uery_test 6.$tn.
5350: 32 20 74 31 20 7b 62 3a 47 20 41 4e 44 20 63 3a  2 t1 {b:G AND c:
5360: 49 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  I}.  do_fts3quer
5370: 79 5f 74 65 73 74 20 36 2e 24 74 6e 2e 33 20 74  y_test 6.$tn.3 t
5380: 31 20 7b 62 3a 47 20 4e 45 41 52 20 63 3a 49 7d  1 {b:G NEAR c:I}
5390: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
53a0: 74 65 73 74 20 36 2e 24 74 6e 2e 34 20 74 31 20  test 6.$tn.4 t1 
53b0: 7b 61 3a 43 20 4f 52 20 62 3a 47 20 4f 52 20 63  {a:C OR b:G OR c
53c0: 3a 4b 20 4f 52 20 64 3a 43 7d 0a 0a 20 20 64 6f  :K OR d:C}..  do
53d0: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
53e0: 36 2e 24 74 6e 2e 35 20 74 31 20 7b 61 3a 47 20  6.$tn.5 t1 {a:G 
53f0: 4f 52 20 62 3a 47 7d 0a 0a 20 20 63 61 74 63 68  OR b:G}..  catch
5400: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d  sql { COMMIT }.}
5410: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 72  ..foreach {tn cr
5420: 65 61 74 65 7d 20 7b 0a 20 20 31 20 20 20 20 22  eate} {.  1    "
5430: 66 74 73 34 28 78 29 22 0a 20 20 32 20 20 20 20  fts4(x)".  2    
5440: 22 66 74 73 34 28 78 2c 20 6f 72 64 65 72 3d 44  "fts4(x, order=D
5450: 45 53 43 29 22 0a 7d 20 7b 0a 20 20 65 78 65 63  ESC)".} {.  exec
5460: 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a 20 20 20  sql [subst {.   
5470: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
5480: 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20 43 52  XISTS t1;.    CR
5490: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
54a0: 4c 45 20 74 31 20 55 53 49 4e 47 20 24 63 72 65  LE t1 USING $cre
54b0: 61 74 65 3b 0a 20 20 7d 5d 0a 0a 20 20 66 6f 72  ate;.  }]..  for
54c0: 65 61 63 68 20 7b 78 7d 20 7b 0a 20 20 20 20 22  each {x} {.    "
54d0: 46 20 45 20 4e 20 4f 20 54 20 4b 20 58 20 56 20  F E N O T K X V 
54e0: 41 20 58 20 49 20 45 20 58 20 41 20 50 20 47 20  A X I E X A P G 
54f0: 51 20 56 20 48 20 55 22 0a 20 20 20 20 22 52 20  Q V H U".    "R 
5500: 56 20 41 20 45 20 54 20 43 20 56 20 51 20 4e 20  V A E T C V Q N 
5510: 49 20 45 20 4c 20 4f 20 4e 20 55 20 47 20 4a 20  I E L O N U G J 
5520: 4b 20 4c 20 55 22 0a 20 20 20 20 22 55 20 59 20  K L U".    "U Y 
5530: 49 20 47 20 57 20 4d 20 56 20 46 20 4a 20 4c 20  I G W M V F J L 
5540: 58 20 49 20 44 20 43 20 48 20 46 20 50 20 4a 20  X I D C H F P J 
5550: 51 20 42 22 0a 20 20 20 20 22 53 20 47 20 44 20  Q B".    "S G D 
5560: 5a 20 58 20 52 20 50 20 47 20 53 20 53 20 59 20  Z X R P G S S Y 
5570: 42 20 4b 20 41 20 53 20 47 20 41 20 49 20 4c 20  B K A S G A I L 
5580: 4c 22 0a 20 20 20 20 22 4c 20 53 20 49 20 43 20  L".    "L S I C 
5590: 48 20 54 20 5a 20 53 20 52 20 51 20 50 20 52 20  H T Z S R Q P R 
55a0: 4e 20 4b 20 4a 20 58 20 4c 20 46 20 4d 20 4a 22  N K J X L F M J"
55b0: 0a 20 20 20 20 22 43 20 43 20 43 20 44 20 50 20  .    "C C C D P 
55c0: 58 20 42 20 5a 20 43 20 4d 20 41 20 44 20 41 20  X B Z C M A D A 
55d0: 43 20 58 20 53 20 42 20 54 20 58 20 56 22 0a 20  C X S B T X V". 
55e0: 20 20 20 22 57 20 59 20 4a 20 4d 20 44 20 52 20     "W Y J M D R 
55f0: 47 20 56 20 52 20 4b 20 42 20 58 20 53 20 41 20  G V R K B X S A 
5600: 57 20 52 20 49 20 54 20 4e 20 43 22 0a 20 20 20  W R I T N C".   
5610: 20 22 50 20 4b 20 4c 20 57 20 54 20 4d 20 53 20   "P K L W T M S 
5620: 50 20 4f 20 59 20 59 20 56 20 56 20 4f 20 45 20  P O Y Y V V O E 
5630: 48 20 51 20 41 20 49 20 52 22 0a 20 20 20 20 22  H Q A I R".    "
5640: 43 20 44 20 59 20 49 20 43 20 5a 20 46 20 48 20  C D Y I C Z F H 
5650: 4a 20 43 20 4f 20 59 20 41 20 51 20 46 20 4c 20  J C O Y A Q F L 
5660: 53 20 42 20 44 20 4b 22 0a 20 20 20 20 22 50 20  S B D K".    "P 
5670: 47 20 53 20 43 20 59 20 43 20 59 20 56 20 49 20  G S C Y C Y V I 
5680: 4d 20 42 20 44 20 53 20 5a 20 44 20 44 20 59 20  M B D S Z D D Y 
5690: 57 20 49 20 45 22 0a 20 20 20 20 22 5a 20 4b 20  W I E".    "Z K 
56a0: 5a 20 55 20 45 20 45 20 53 20 46 20 59 20 58 20  Z U E E S F Y X 
56b0: 54 20 55 20 41 20 4c 20 57 20 4f 20 55 20 4a 20  T U A L W O U J 
56c0: 43 20 51 22 0a 20 20 20 20 22 50 20 41 20 54 20  C Q".    "P A T 
56d0: 5a 20 53 20 57 20 4c 20 50 20 4c 20 51 20 56 20  Z S W L P L Q V 
56e0: 59 20 59 20 49 20 50 20 57 20 55 20 58 20 53 20  Y Y I P W U X S 
56f0: 53 22 0a 20 20 20 20 22 49 20 55 20 49 20 48 20  S".    "I U I H 
5700: 55 20 4f 20 46 20 5a 20 46 20 52 20 48 20 52 20  U O F Z F R H R 
5710: 46 20 54 20 4e 20 44 20 58 20 41 20 47 20 4d 22  F T N D X A G M"
5720: 0a 20 20 20 20 22 4e 20 41 20 42 20 4d 20 53 20  .    "N A B M S 
5730: 48 20 4b 20 58 20 53 20 4f 20 59 20 44 20 54 20  H K X S O Y D T 
5740: 58 20 53 20 42 20 52 20 59 20 48 20 5a 22 0a 20  X S B R Y H Z". 
5750: 20 20 20 22 4c 20 55 20 44 20 41 20 53 20 4b 20     "L U D A S K 
5760: 49 20 4c 20 53 20 56 20 5a 20 4a 20 50 20 55 20  I L S V Z J P U 
5770: 42 20 45 20 42 20 59 20 48 20 4d 22 0a 20 20 7d  B E B Y H M".  }
5780: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
5790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
57a0: 56 41 4c 55 45 53 28 24 78 29 20 7d 0a 20 20 7d  VALUES($x) }.  }
57b0: 0a 0a 20 20 23 20 41 64 64 20 65 78 74 72 61 20  ..  # Add extra 
57c0: 64 6f 63 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  documents to the
57d0: 20 64 61 74 61 62 61 73 65 20 73 75 63 68 20 74   database such t
57e0: 68 61 74 20 74 6f 6b 65 6e 20 22 42 22 20 77 69  hat token "B" wi
57f0: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
5800: 0a 20 20 23 20 64 65 66 65 72 72 61 62 6c 65 20  .  # deferrable 
5810: 69 66 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  if considering t
5820: 68 65 20 6f 74 68 65 72 20 74 6f 6b 65 6e 73 20  he other tokens 
5830: 6d 65 61 6e 73 20 74 68 61 74 20 32 20 6f 72 20  means that 2 or 
5840: 66 65 77 65 72 20 64 6f 63 75 6d 65 6e 74 73 0a  fewer documents.
5850: 20 20 23 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64    # will be load
5860: 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
5870: 20 20 23 0a 20 20 66 74 73 33 5f 6d 61 6b 65 5f    #.  fts3_make_
5880: 64 65 66 65 72 72 61 62 6c 65 20 74 31 20 42 20  deferrable t1 B 
5890: 32 0a 0a 20 20 23 20 42 20 69 73 20 6e 6f 74 20  2..  # B is not 
58a0: 64 65 66 65 72 72 65 64 20 69 6e 20 65 69 74 68  deferred in eith
58b0: 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
58c0: 74 77 6f 20 74 65 73 74 73 20 62 65 6c 6f 77 2c  two tests below,
58d0: 20 73 69 6e 63 65 20 66 69 6c 74 65 72 69 6e 67   since filtering
58e0: 0a 20 20 23 20 6f 6e 20 22 4d 22 20 6f 72 20 22  .  # on "M" or "
58f0: 44 22 20 72 65 74 75 72 6e 73 20 31 30 20 64 6f  D" returns 10 do
5900: 63 75 6d 65 6e 74 73 20 6f 72 20 73 6f 2e 20 42  cuments or so. B
5910: 75 74 20 66 69 6c 74 65 72 69 6e 67 20 6f 6e 20  ut filtering on 
5920: 22 4d 20 2a 20 44 22 20 6f 6e 6c 79 0a 20 20 23  "M * D" only.  #
5930: 20 72 65 74 75 72 6e 73 20 32 2c 20 73 6f 20 42   returns 2, so B
5940: 20 69 73 20 64 65 66 65 72 72 65 64 20 69 6e 20   is deferred in 
5950: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 23 0a 20  this case..  #. 
5960: 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65   do_fts3query_te
5970: 73 74 20 37 2e 24 74 6e 2e 31 20 20 20 20 20 20  st 7.$tn.1      
5980: 20 20 20 20 20 20 20 74 31 20 7b 22 4d 20 42 22         t1 {"M B"
5990: 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79  }.  do_fts3query
59a0: 5f 74 65 73 74 20 37 2e 24 74 6e 2e 32 20 20 20  _test 7.$tn.2   
59b0: 20 20 20 20 20 20 20 20 20 20 74 31 20 7b 22 42            t1 {"B
59c0: 20 44 22 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75   D"}.  do_fts3qu
59d0: 65 72 79 5f 74 65 73 74 20 37 2e 24 74 6e 2e 33  ery_test 7.$tn.3
59e0: 20 2d 64 65 66 65 72 72 65 64 20 42 20 74 31 20   -deferred B t1 
59f0: 7b 22 4d 20 42 20 44 22 7d 0a 7d 0a 0a 73 65 74  {"M B D"}.}..set
5a00: 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61   sqlite_fts3_ena
5a10: 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20  ble_parentheses 
5a20: 24 73 66 65 70 0a 66 69 6e 69 73 68 5f 74 65 73  $sfep.finish_tes
5a30: 74 0a                                            t.