/ Hex Artifact Content
Login

Artifact b981fea19b132b4e6878f50d7c1f369b28f68eb9:


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 65  tbl limit} {.  e
10c0: 78 65 63 73 71 6c 20 22 20 0a 20 20 20 20 55 50  xecsql " .    UP
10d0: 44 41 54 45 20 24 7b 74 62 6c 7d 5f 73 65 67 6d  DATE ${tbl}_segm
10e0: 65 6e 74 73 20 0a 20 20 20 20 53 45 54 20 62 6c  ents .    SET bl
10f0: 6f 63 6b 20 3d 20 7a 65 72 6f 62 6c 6f 62 28 6c  ock = zeroblob(l
1100: 65 6e 67 74 68 28 62 6c 6f 63 6b 29 29 20 0a 20  ength(block)) . 
1110: 20 20 20 57 48 45 52 45 20 6c 65 6e 67 74 68 28     WHERE length(
1120: 62 6c 6f 63 6b 29 3e 24 6c 69 6d 69 74 0a 20 20  block)>$limit.  
1130: 22 0a 20 20 72 65 74 75 72 6e 20 5b 64 62 20 63  ".  return [db c
1140: 68 61 6e 67 65 73 5d 0a 7d 0a 0a 0a 70 72 6f 63  hanges].}...proc
1150: 20 6d 69 74 20 7b 62 6c 6f 62 7d 20 7b 0a 20 20   mit {blob} {.  
1160: 73 65 74 20 73 63 61 6e 28 6c 69 74 74 6c 65 45  set scan(littleE
1170: 6e 64 69 61 6e 29 20 69 2a 0a 20 20 73 65 74 20  ndian) i*.  set 
1180: 73 63 61 6e 28 62 69 67 45 6e 64 69 61 6e 29 20  scan(bigEndian) 
1190: 49 2a 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e  I*.  binary scan
11a0: 20 24 62 6c 6f 62 20 24 73 63 61 6e 28 24 3a 3a   $blob $scan($::
11b0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74  tcl_platform(byt
11c0: 65 4f 72 64 65 72 29 29 20 72 0a 20 20 72 65 74  eOrder)) r.  ret
11d0: 75 72 6e 20 24 72 0a 7d 0a 64 62 20 66 75 6e 63  urn $r.}.db func
11e0: 20 6d 69 74 20 6d 69 74 0a 0a 70 72 6f 63 20 66   mit mit..proc f
11f0: 69 78 5f 70 68 72 61 73 65 5f 65 78 70 72 20 7b  ix_phrase_expr {
1200: 63 6f 6c 73 20 65 78 70 72 20 63 6f 6c 66 69 6c  cols expr colfil
1210: 74 65 72 76 61 72 7d 20 7b 0a 20 20 75 70 76 61  tervar} {.  upva
1220: 72 20 24 63 6f 6c 66 69 6c 74 65 72 76 61 72 20  r $colfiltervar 
1230: 69 43 6f 6c 46 69 6c 74 65 72 0a 0a 20 20 73 65  iColFilter..  se
1240: 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20 66  t out [list].  f
1250: 6f 72 65 61 63 68 20 74 20 24 65 78 70 72 20 7b  oreach t $expr {
1260: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
1270: 20 6d 61 74 63 68 20 2a 3a 2a 20 24 74 5d 7d 20   match *:* $t]} 
1280: 7b 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6c 20  {.      set col 
1290: 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24  [lindex [split $
12a0: 74 20 3a 5d 20 30 5d 0a 20 20 20 20 20 20 73 65  t :] 0].      se
12b0: 74 20 74 20 20 20 5b 6c 69 6e 64 65 78 20 5b 73  t t   [lindex [s
12c0: 70 6c 69 74 20 24 74 20 3a 5d 20 31 5d 0a 20 20  plit $t :] 1].  
12d0: 20 20 20 20 73 65 74 20 69 43 6f 6c 20 5b 6c 73      set iCol [ls
12e0: 65 61 72 63 68 20 24 63 6f 6c 73 20 24 63 6f 6c  earch $cols $col
12f0: 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 69 43 6f  ].      if {$iCo
1300: 6c 3c 30 7d 20 7b 20 65 72 72 6f 72 20 22 75 6e  l<0} { error "un
1310: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 3a 20 24 63  known column: $c
1320: 6f 6c 22 20 7d 0a 20 20 20 20 20 20 69 66 20 7b  ol" }.      if {
1330: 24 69 43 6f 6c 46 69 6c 74 65 72 20 3c 20 30 7d  $iColFilter < 0}
1340: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 69   {.        set i
1350: 43 6f 6c 46 69 6c 74 65 72 20 24 69 43 6f 6c 0a  ColFilter $iCol.
1360: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
1370: 24 69 43 6f 6c 46 69 6c 74 65 72 20 21 3d 20 24  $iColFilter != $
1380: 69 43 6f 6c 7d 20 7b 0a 20 20 20 20 20 20 20 20  iCol} {.        
1390: 73 65 74 20 69 43 6f 6c 46 69 6c 74 65 72 20 5b  set iColFilter [
13a0: 6c 6c 65 6e 67 74 68 20 24 63 6f 6c 73 5d 0a 20  llength $cols]. 
13b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13c0: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 24 74 0a   lappend out $t.
13d0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 24 6f    }..  return $o
13e0: 75 74 0a 7d 0a 0a 70 72 6f 63 20 66 69 78 5f 6e  ut.}..proc fix_n
13f0: 65 61 72 5f 65 78 70 72 20 7b 63 6f 6c 73 20 65  ear_expr {cols e
1400: 78 70 72 20 63 6f 6c 66 69 6c 74 65 72 76 61 72  xpr colfiltervar
1410: 7d 20 7b 20 0a 20 20 75 70 76 61 72 20 24 63 6f  } { .  upvar $co
1420: 6c 66 69 6c 74 65 72 76 61 72 20 69 43 6f 6c 46  lfiltervar iColF
1430: 69 6c 74 65 72 0a 20 0a 20 20 73 65 74 20 69 43  ilter. .  set iC
1440: 6f 6c 46 69 6c 74 65 72 20 2d 31 0a 0a 20 20 73  olFilter -1..  s
1450: 65 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20  et out [list].  
1460: 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b 66 69 78  lappend out [fix
1470: 5f 70 68 72 61 73 65 5f 65 78 70 72 20 24 63 6f  _phrase_expr $co
1480: 6c 73 20 5b 6c 69 6e 64 65 78 20 24 65 78 70 72  ls [lindex $expr
1490: 20 30 5d 20 69 43 6f 6c 46 69 6c 74 65 72 5d 0a   0] iColFilter].
14a0: 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62 7d 20    foreach {a b} 
14b0: 5b 6c 72 61 6e 67 65 20 24 65 78 70 72 20 31 20  [lrange $expr 1 
14c0: 65 6e 64 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  end] {.    if {[
14d0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f  string match -no
14e0: 63 61 73 65 20 6e 65 61 72 20 24 61 5d 7d 20 20  case near $a]}  
14f0: 20 7b 20 73 65 74 20 61 20 31 30 20 7d 0a 20 20   { set a 10 }.  
1500: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1510: 74 63 68 20 2d 6e 6f 63 61 73 65 20 6e 65 61 72  tch -nocase near
1520: 2f 2a 20 24 61 5d 7d 20 7b 20 73 65 74 20 61 20  /* $a]} { set a 
1530: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 61  [string range $a
1540: 20 35 20 65 6e 64 5d 20 7d 0a 20 20 20 20 6c 61   5 end] }.    la
1550: 70 70 65 6e 64 20 6f 75 74 20 24 61 0a 20 20 20  ppend out $a.   
1560: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b 66 69   lappend out [fi
1570: 78 5f 70 68 72 61 73 65 5f 65 78 70 72 20 24 63  x_phrase_expr $c
1580: 6f 6c 73 20 24 62 20 69 43 6f 6c 46 69 6c 74 65  ols $b iColFilte
1590: 72 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r].  }.  return 
15a0: 24 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20 67 65 74  $out.}..proc get
15b0: 5f 73 69 6e 67 6c 65 5f 6e 65 61 72 5f 72 65 73  _single_near_res
15c0: 75 6c 74 73 20 7b 74 62 6c 20 65 78 70 72 20 64  ults {tbl expr d
15d0: 65 66 65 72 72 65 64 20 61 72 72 61 79 76 61 72  eferred arrayvar
15e0: 20 6e 75 6c 6c 76 61 72 7d 20 7b 0a 20 20 75 70   nullvar} {.  up
15f0: 76 61 72 20 24 61 72 72 61 79 76 61 72 20 61 4d  var $arrayvar aM
1600: 61 74 63 68 69 6e 66 6f 0a 20 20 75 70 76 61 72  atchinfo.  upvar
1610: 20 24 6e 75 6c 6c 76 61 72 20 6e 75 6c 6c 65 6e   $nullvar nullen
1620: 74 72 79 0a 20 20 63 61 74 63 68 20 7b 61 72 72  try.  catch {arr
1630: 61 79 20 75 6e 73 65 74 20 61 4d 61 74 63 68 69  ay unset aMatchi
1640: 6e 66 6f 7d 0a 0a 20 20 73 65 74 20 63 6f 6c 73  nfo}..  set cols
1650: 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20 6d 69   [list].  set mi
1660: 73 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20 65  ss [list].  db e
1670: 76 61 6c 20 22 50 52 41 47 4d 41 20 74 61 62 6c  val "PRAGMA tabl
1680: 65 5f 69 6e 66 6f 28 24 74 62 6c 29 22 20 41 20  e_info($tbl)" A 
1690: 7b 20 6c 61 70 70 65 6e 64 20 63 6f 6c 73 20 24  { lappend cols $
16a0: 41 28 6e 61 6d 65 29 20 3b 20 6c 61 70 70 65 6e  A(name) ; lappen
16b0: 64 20 6d 69 73 73 20 30 20 7d 0a 20 20 73 65 74  d miss 0 }.  set
16c0: 20 65 78 70 72 20 5b 66 69 78 5f 6e 65 61 72 5f   expr [fix_near_
16d0: 65 78 70 72 20 24 63 6f 6c 73 20 24 65 78 70 72  expr $cols $expr
16e0: 20 69 43 6f 6c 46 69 6c 74 65 72 5d 0a 0a 20 20   iColFilter]..  
16f0: 23 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  # Calculate the 
1700: 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 73  expected results
1710: 20 75 73 69 6e 67 20 5b 66 74 73 33 5f 6e 65 61   using [fts3_nea
1720: 72 5f 6d 61 74 63 68 5d 2e 20 54 68 65 20 66 6f  r_match]. The fo
1730: 6c 6c 6f 77 69 6e 67 0a 20 20 23 20 6c 6f 6f 70  llowing.  # loop
1740: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 22   populates the "
1750: 68 69 74 73 22 20 61 6e 64 20 22 63 6f 75 6e 74  hits" and "count
1760: 73 22 20 61 72 72 61 79 73 20 61 73 20 66 6f 6c  s" arrays as fol
1770: 6c 6f 77 73 3a 0a 20 20 23 20 0a 20 20 23 20 20  lows:.  # .  #  
1780: 20 31 2e 20 46 6f 72 20 65 61 63 68 20 64 6f 63   1. For each doc
1790: 75 6d 65 6e 74 20 69 6e 20 74 68 65 20 74 61 62  ument in the tab
17a0: 6c 65 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  le that matches 
17b0: 74 68 65 20 4e 45 41 52 20 65 78 70 72 65 73 73  the NEAR express
17c0: 69 6f 6e 2c 0a 20 20 23 20 20 20 20 20 20 68 69  ion,.  #      hi
17d0: 74 73 28 24 64 6f 63 69 64 29 20 69 73 20 73 65  ts($docid) is se
17e0: 74 20 74 6f 20 31 2e 20 54 68 65 20 73 65 74 20  t to 1. The set 
17f0: 6f 66 20 64 6f 63 69 64 73 20 74 68 61 74 20 6d  of docids that m
1800: 61 74 63 68 20 74 68 65 20 65 78 70 72 65 73 73  atch the express
1810: 69 6f 6e 0a 20 20 23 20 20 20 20 20 20 63 61 6e  ion.  #      can
1820: 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 66 6f   therefore be fo
1830: 75 6e 64 20 75 73 69 6e 67 20 5b 61 72 72 61 79  und using [array
1840: 20 6e 61 6d 65 73 20 68 69 74 73 5d 2e 0a 20 20   names hits]..  
1850: 23 0a 20 20 23 20 20 20 32 2e 20 46 6f 72 20 65  #.  #   2. For e
1860: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61  ach column of ea
1870: 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74  ch document in t
1880: 68 65 20 74 61 62 6c 65 2c 20 63 6f 75 6e 74 73  he table, counts
1890: 28 24 64 6f 63 69 64 2c 24 69 43 6f 6c 29 0a 20  ($docid,$iCol). 
18a0: 20 23 20 20 20 20 20 20 69 73 20 73 65 74 20 74   #      is set t
18b0: 6f 20 74 68 65 20 2d 70 68 72 61 73 65 63 6f 75  o the -phrasecou
18c0: 6e 74 76 61 72 20 6f 75 74 70 75 74 2e 0a 20 20  ntvar output..  
18d0: 23 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73  #.  set res [lis
18e0: 74 5d 0a 20 20 63 61 74 63 68 20 7b 20 61 72 72  t].  catch { arr
18f0: 61 79 20 75 6e 73 65 74 20 68 69 74 73 20 7d 0a  ay unset hits }.
1900: 20 20 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43    db eval "SELEC
1910: 54 20 64 6f 63 69 64 2c 20 2a 20 46 52 4f 4d 20  T docid, * FROM 
1920: 24 74 62 6c 22 20 64 20 7b 0a 20 20 20 20 73 65  $tbl" d {.    se
1930: 74 20 69 43 6f 6c 20 30 0a 20 20 20 20 66 6f 72  t iCol 0.    for
1940: 65 61 63 68 20 63 6f 6c 20 5b 6c 72 61 6e 67 65  each col [lrange
1950: 20 24 64 28 2a 29 20 31 20 65 6e 64 5d 20 7b 0a   $d(*) 1 end] {.
1960: 20 20 20 20 20 20 73 65 74 20 64 6f 63 69 64 20        set docid 
1970: 24 64 28 64 6f 63 69 64 29 0a 20 20 20 20 20 20  $d(docid).      
1980: 69 66 20 7b 24 69 43 6f 6c 46 69 6c 74 65 72 3c  if {$iColFilter<
1990: 30 20 7c 7c 20 24 69 43 6f 6c 3d 3d 24 69 43 6f  0 || $iCol==$iCo
19a0: 6c 46 69 6c 74 65 72 7d 20 7b 0a 20 20 20 20 20  lFilter} {.     
19b0: 20 20 20 73 65 74 20 68 69 74 20 5b 66 74 73 33     set hit [fts3
19c0: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 24 64 28 24  _near_match $d($
19d0: 63 6f 6c 29 20 24 65 78 70 72 20 2d 70 20 63 6f  col) $expr -p co
19e0: 75 6e 74 73 28 24 64 6f 63 69 64 2c 24 69 43 6f  unts($docid,$iCo
19f0: 6c 29 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  l)].        if {
1a00: 24 68 69 74 7d 20 7b 20 73 65 74 20 68 69 74 73  $hit} { set hits
1a10: 28 24 64 6f 63 69 64 29 20 31 20 7d 0a 20 20 20  ($docid) 1 }.   
1a20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1a30: 20 20 20 20 73 65 74 20 63 6f 75 6e 74 73 28 24      set counts($
1a40: 64 6f 63 69 64 2c 24 69 43 6f 6c 29 20 24 6d 69  docid,$iCol) $mi
1a50: 73 73 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ss.      }.     
1a60: 20 69 6e 63 72 20 69 43 6f 6c 0a 20 20 20 20 7d   incr iCol.    }
1a70: 0a 20 20 7d 0a 20 20 73 65 74 20 6e 50 68 72 61  .  }.  set nPhra
1a80: 73 65 20 5b 65 78 70 72 20 28 5b 6c 6c 65 6e 67  se [expr ([lleng
1a90: 74 68 20 24 65 78 70 72 5d 2b 31 29 2f 32 5d 0a  th $expr]+1)/2].
1aa0: 20 20 73 65 74 20 6e 43 6f 6c 20 24 69 43 6f 6c    set nCol $iCol
1ab0: 0a 0a 20 20 23 20 54 68 69 73 20 62 6c 6f 63 6b  ..  # This block
1ac0: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6e   populates the n
1ad0: 48 69 74 20 61 6e 64 20 6e 44 6f 63 20 61 72 72  Hit and nDoc arr
1ae0: 61 79 73 2e 20 46 6f 72 20 65 61 63 68 20 70 68  ays. For each ph
1af0: 72 61 73 65 2f 63 6f 6c 75 6d 6e 0a 20 20 23 20  rase/column.  # 
1b00: 69 6e 20 74 68 65 20 71 75 65 72 79 2f 74 61 62  in the query/tab
1b10: 6c 65 2c 20 61 72 72 61 79 20 65 6c 65 6d 65 6e  le, array elemen
1b20: 74 73 20 61 72 65 20 73 65 74 20 61 73 20 66 6f  ts are set as fo
1b30: 6c 6c 6f 77 73 3a 0a 20 20 23 0a 20 20 23 20 20  llows:.  #.  #  
1b40: 20 6e 48 69 74 28 24 69 50 68 72 61 73 65 2c 24   nHit($iPhrase,$
1b50: 69 43 6f 6c 29 20 2d 20 54 6f 74 61 6c 20 6e 75  iCol) - Total nu
1b60: 6d 62 65 72 20 6f 66 20 68 69 74 73 20 66 6f 72  mber of hits for
1b70: 20 70 68 72 61 73 65 20 24 69 50 68 72 61 73 65   phrase $iPhrase
1b80: 20 69 6e 20 0a 20 20 23 20 20 20 20 20 20 20 20   in .  #        
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 63 6f 6c 75 6d 6e 20 24 69 43 6f 6c 2e 0a    column $iCol..
1bb0: 20 20 23 0a 20 20 23 20 20 20 6e 44 6f 63 28 24    #.  #   nDoc($
1bc0: 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 20 2d  iPhrase,$iCol) -
1bd0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   Number of docum
1be0: 65 6e 74 73 20 77 69 74 68 20 61 74 20 6c 65 61  ents with at lea
1bf0: 73 74 20 6f 6e 65 20 68 69 74 20 66 6f 72 0a 20  st one hit for. 
1c00: 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20   #              
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 70 68 72 61              phra
1c20: 73 65 20 24 69 50 68 72 61 73 65 20 69 6e 20 63  se $iPhrase in c
1c30: 6f 6c 75 6d 6e 20 24 69 43 6f 6c 2e 0a 20 20 23  olumn $iCol..  #
1c40: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 50 68 72  .  for {set iPhr
1c50: 61 73 65 20 30 7d 20 7b 24 69 50 68 72 61 73 65  ase 0} {$iPhrase
1c60: 20 3c 20 24 6e 50 68 72 61 73 65 7d 20 7b 69 6e   < $nPhrase} {in
1c70: 63 72 20 69 50 68 72 61 73 65 7d 20 7b 0a 20 20  cr iPhrase} {.  
1c80: 20 20 66 6f 72 20 7b 73 65 74 20 69 43 6f 6c 20    for {set iCol 
1c90: 30 7d 20 7b 24 69 43 6f 6c 20 3c 20 24 6e 43 6f  0} {$iCol < $nCo
1ca0: 6c 7d 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20 7b  l} {incr iCol} {
1cb0: 0a 20 20 20 20 20 20 73 65 74 20 6e 48 69 74 28  .      set nHit(
1cc0: 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 20  $iPhrase,$iCol) 
1cd0: 30 0a 20 20 20 20 20 20 73 65 74 20 6e 44 6f 63  0.      set nDoc
1ce0: 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29  ($iPhrase,$iCol)
1cf0: 20 30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   0.    }.  }.  f
1d00: 6f 72 65 61 63 68 20 6b 65 79 20 5b 61 72 72 61  oreach key [arra
1d10: 79 20 6e 61 6d 65 73 20 63 6f 75 6e 74 73 5d 20  y names counts] 
1d20: 7b 0a 20 20 20 20 73 65 74 20 69 43 6f 6c 20 5b  {.    set iCol [
1d30: 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24 6b  lindex [split $k
1d40: 65 79 20 2c 5d 20 31 5d 0a 20 20 20 20 73 65 74  ey ,] 1].    set
1d50: 20 69 50 68 72 61 73 65 20 30 0a 20 20 20 20 66   iPhrase 0.    f
1d60: 6f 72 65 61 63 68 20 63 20 24 63 6f 75 6e 74 73  oreach c $counts
1d70: 28 24 6b 65 79 29 20 7b 0a 20 20 20 20 20 20 69  ($key) {.      i
1d80: 66 20 7b 24 63 3e 30 7d 20 7b 20 69 6e 63 72 20  f {$c>0} { incr 
1d90: 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24 69  nDoc($iPhrase,$i
1da0: 43 6f 6c 29 20 31 20 7d 0a 20 20 20 20 20 20 69  Col) 1 }.      i
1db0: 6e 63 72 20 6e 48 69 74 28 24 69 50 68 72 61 73  ncr nHit($iPhras
1dc0: 65 2c 24 69 43 6f 6c 29 20 24 63 0a 20 20 20 20  e,$iCol) $c.    
1dd0: 20 20 69 6e 63 72 20 69 50 68 72 61 73 65 0a 20    incr iPhrase. 
1de0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 7b     }.  }..  if {
1df0: 5b 6c 6c 65 6e 67 74 68 20 24 64 65 66 65 72 72  [llength $deferr
1e00: 65 64 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20  ed] && [llength 
1e10: 24 65 78 70 72 5d 3d 3d 31 7d 20 7b 0a 20 20 20  $expr]==1} {.   
1e20: 20 73 65 74 20 70 68 72 61 73 65 20 5b 6c 69 6e   set phrase [lin
1e30: 64 65 78 20 24 65 78 70 72 20 30 5d 0a 20 20 20  dex $expr 0].   
1e40: 20 73 65 74 20 72 65 77 72 69 74 74 65 6e 20 5b   set rewritten [
1e50: 6c 69 73 74 5d 0a 20 20 20 20 73 65 74 20 70 61  list].    set pa
1e60: 72 74 69 61 6c 20 30 0a 20 20 20 20 66 6f 72 65  rtial 0.    fore
1e70: 61 63 68 20 74 6f 6b 20 24 70 68 72 61 73 65 20  ach tok $phrase 
1e80: 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65  {.      if {[lse
1e90: 61 72 63 68 20 24 64 65 66 65 72 72 65 64 20 24  arch $deferred $
1ea0: 74 6f 6b 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20 20  tok]>=0} {.     
1eb0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 77 72 69     lappend rewri
1ec0: 74 74 65 6e 20 2a 0a 20 20 20 20 20 20 7d 20 65  tten *.      } e
1ed0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 6c 61  lse {.        la
1ee0: 70 70 65 6e 64 20 72 65 77 72 69 74 74 65 6e 20  ppend rewritten 
1ef0: 24 74 6f 6b 0a 20 20 20 20 20 20 20 20 73 65 74  $tok.        set
1f00: 20 70 61 72 74 69 61 6c 20 31 0a 20 20 20 20 20   partial 1.     
1f10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
1f20: 7b 24 70 61 72 74 69 61 6c 3d 3d 30 7d 20 7b 0a  {$partial==0} {.
1f30: 20 20 20 20 20 20 73 65 74 20 74 62 6c 73 69 7a        set tblsiz
1f40: 65 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43  e [db one "SELEC
1f50: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1f60: 24 74 62 6c 22 5d 0a 20 20 20 20 20 20 66 6f 72  $tbl"].      for
1f70: 20 7b 73 65 74 20 69 43 6f 6c 20 30 7d 20 7b 24   {set iCol 0} {$
1f80: 69 43 6f 6c 20 3c 20 24 6e 43 6f 6c 7d 20 7b 69  iCol < $nCol} {i
1f90: 6e 63 72 20 69 43 6f 6c 7d 20 7b 0a 20 20 20 20  ncr iCol} {.    
1fa0: 20 20 20 20 73 65 74 20 6e 48 69 74 28 30 2c 24      set nHit(0,$
1fb0: 69 43 6f 6c 29 20 24 74 62 6c 73 69 7a 65 0a 20  iCol) $tblsize. 
1fc0: 20 20 20 20 20 20 20 73 65 74 20 6e 44 6f 63 28         set nDoc(
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 7d 0a 20 20 20 20 7d 20  e.      }.    } 
1ff0: 65 6c 73 65 69 66 20 7b 24 72 65 77 72 69 74 74  elseif {$rewritt
2000: 65 6e 20 21 3d 20 24 70 68 72 61 73 65 7d 20 7b  en != $phrase} {
2010: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 6c  .      while {[l
2020: 69 6e 64 65 78 20 24 72 65 77 72 69 74 74 65 6e  index $rewritten
2030: 20 65 6e 64 5d 20 3d 3d 20 22 2a 22 7d 20 7b 0a   end] == "*"} {.
2040: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 77 72          set rewr
2050: 69 74 74 65 6e 20 5b 6c 72 61 6e 67 65 20 24 72  itten [lrange $r
2060: 65 77 72 69 74 74 65 6e 20 30 20 65 6e 64 2d 31  ewritten 0 end-1
2070: 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ].      }.      
2080: 77 68 69 6c 65 20 7b 5b 6c 69 6e 64 65 78 20 24  while {[lindex $
2090: 72 65 77 72 69 74 74 65 6e 20 30 5d 20 3d 3d 20  rewritten 0] == 
20a0: 22 2a 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  "*"} {.        s
20b0: 65 74 20 72 65 77 72 69 74 74 65 6e 20 5b 6c 72  et rewritten [lr
20c0: 61 6e 67 65 20 24 72 65 77 72 69 74 74 65 6e 20  ange $rewritten 
20d0: 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 7d 0a 20  1 end].      }. 
20e0: 20 20 20 20 20 67 65 74 5f 73 69 6e 67 6c 65 5f       get_single_
20f0: 6e 65 61 72 5f 72 65 73 75 6c 74 73 20 24 74 62  near_results $tb
2100: 6c 20 5b 6c 69 73 74 20 24 72 65 77 72 69 74 74  l [list $rewritt
2110: 65 6e 5d 20 7b 7d 20 61 52 65 77 72 69 74 65 20  en] {} aRewrite 
2120: 6e 75 6c 6c 65 6e 74 72 79 0a 20 20 20 20 20 20  nullentry.      
2130: 66 6f 72 65 61 63 68 20 64 6f 63 69 64 20 5b 61  foreach docid [a
2140: 72 72 61 79 20 6e 61 6d 65 73 20 68 69 74 73 5d  rray names hits]
2150: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 61   {.        set a
2160: 4d 61 74 63 68 69 6e 66 6f 28 24 64 6f 63 69 64  Matchinfo($docid
2170: 29 20 24 61 52 65 77 72 69 74 65 28 24 64 6f 63  ) $aRewrite($doc
2180: 69 64 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id).      }.    
2190: 20 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20    return.    }. 
21a0: 20 7d 0a 0a 20 20 23 20 53 65 74 20 75 70 20 74   }..  # Set up t
21b0: 68 65 20 61 4d 61 74 63 68 69 6e 66 6f 20 61 72  he aMatchinfo ar
21c0: 72 61 79 2e 20 46 6f 72 20 65 61 63 68 20 64 6f  ray. For each do
21d0: 63 75 6d 65 6e 74 2c 20 73 65 74 20 61 4d 61 74  cument, set aMat
21e0: 63 68 69 6e 66 6f 28 24 64 6f 63 69 64 29 20 74  chinfo($docid) t
21f0: 6f 0a 20 20 23 20 63 6f 6e 74 61 69 6e 20 74 68  o.  # contain th
2200: 65 20 6f 75 74 70 75 74 20 6f 66 20 6d 61 74 63  e output of matc
2210: 68 69 6e 66 6f 28 27 78 27 29 20 66 6f 72 20 74  hinfo('x') for t
2220: 68 65 20 64 6f 63 75 6d 65 6e 74 2e 0a 20 20 23  he document..  #
2230: 0a 20 20 66 6f 72 65 61 63 68 20 64 6f 63 69 64  .  foreach docid
2240: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 68 69   [array names hi
2250: 74 73 5d 20 7b 0a 20 20 20 20 73 65 74 20 6d 69  ts] {.    set mi
2260: 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66 6f 72 20   [list].    for 
2270: 7b 73 65 74 20 69 50 68 72 61 73 65 20 30 7d 20  {set iPhrase 0} 
2280: 7b 24 69 50 68 72 61 73 65 3c 24 6e 50 68 72 61  {$iPhrase<$nPhra
2290: 73 65 7d 20 7b 69 6e 63 72 20 69 50 68 72 61 73  se} {incr iPhras
22a0: 65 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b  e} {.      for {
22b0: 73 65 74 20 69 43 6f 6c 20 30 7d 20 7b 24 69 43  set iCol 0} {$iC
22c0: 6f 6c 3c 24 6e 43 6f 6c 7d 20 7b 69 6e 63 72 20  ol<$nCol} {incr 
22d0: 69 43 6f 6c 7d 20 7b 0a 20 20 20 20 20 20 20 20  iCol} {.        
22e0: 6c 61 70 70 65 6e 64 20 6d 69 20 5b 6c 69 6e 64  lappend mi [lind
22f0: 65 78 20 24 63 6f 75 6e 74 73 28 24 64 6f 63 69  ex $counts($doci
2300: 64 2c 24 69 43 6f 6c 29 20 24 69 50 68 72 61 73  d,$iCol) $iPhras
2310: 65 5d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  e].        lappe
2320: 6e 64 20 6d 69 20 24 6e 48 69 74 28 24 69 50 68  nd mi $nHit($iPh
2330: 72 61 73 65 2c 24 69 43 6f 6c 29 0a 20 20 20 20  rase,$iCol).    
2340: 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 20 24      lappend mi $
2350: 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24 69  nDoc($iPhrase,$i
2360: 43 6f 6c 29 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col).      }.   
2370: 20 7d 0a 20 20 20 20 73 65 74 20 61 4d 61 74 63   }.    set aMatc
2380: 68 69 6e 66 6f 28 24 64 6f 63 69 64 29 20 24 6d  hinfo($docid) $m
2390: 69 0a 20 20 7d 0a 0a 20 20 23 20 53 65 74 20 75  i.  }..  # Set u
23a0: 70 20 74 68 65 20 6e 75 6c 6c 65 6e 74 72 79 20  p the nullentry 
23b0: 6f 75 74 70 75 74 2e 0a 20 20 23 0a 20 20 73 65  output..  #.  se
23c0: 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b 6c 69 73  t nullentry [lis
23d0: 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 50  t].  for {set iP
23e0: 68 72 61 73 65 20 30 7d 20 7b 24 69 50 68 72 61  hrase 0} {$iPhra
23f0: 73 65 3c 24 6e 50 68 72 61 73 65 7d 20 7b 69 6e  se<$nPhrase} {in
2400: 63 72 20 69 50 68 72 61 73 65 7d 20 7b 0a 20 20  cr iPhrase} {.  
2410: 20 20 66 6f 72 20 7b 73 65 74 20 69 43 6f 6c 20    for {set iCol 
2420: 30 7d 20 7b 24 69 43 6f 6c 3c 24 6e 43 6f 6c 7d  0} {$iCol<$nCol}
2430: 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20 7b 0a 20   {incr iCol} {. 
2440: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 75 6c       lappend nul
2450: 6c 65 6e 74 72 79 20 30 20 24 6e 48 69 74 28 24  lentry 0 $nHit($
2460: 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 20 24  iPhrase,$iCol) $
2470: 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24 69  nDoc($iPhrase,$i
2480: 43 6f 6c 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Col).    }.  }.}
2490: 0a 0a 0a 70 72 6f 63 20 6d 61 74 63 68 69 6e 67  ...proc matching
24a0: 5f 62 72 61 63 6b 65 74 73 20 7b 65 78 70 72 7d  _brackets {expr}
24b0: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
24c0: 20 72 61 6e 67 65 20 24 65 78 70 72 20 30 20 30   range $expr 0 0
24d0: 5d 21 3d 22 28 22 20 7c 7c 20 5b 73 74 72 69 6e  ]!="(" || [strin
24e0: 67 20 72 61 6e 67 65 20 24 65 78 70 72 20 65 6e  g range $expr en
24f0: 64 20 65 6e 64 5d 20 21 3d 22 29 22 7d 20 7b 20  d end] !=")"} { 
2500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 20 0a 20  .    return 0 . 
2510: 20 7d 0a 0a 20 20 73 65 74 20 69 42 72 61 63 6b   }..  set iBrack
2520: 65 74 20 31 0a 20 20 73 65 74 20 6e 45 78 70 72  et 1.  set nExpr
2530: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2540: 24 65 78 70 72 5d 0a 20 20 66 6f 72 20 7b 73 65  $expr].  for {se
2550: 74 20 69 20 31 7d 20 7b 24 69 42 72 61 63 6b 65  t i 1} {$iBracke
2560: 74 20 26 26 20 24 69 20 3c 20 24 6e 45 78 70 72  t && $i < $nExpr
2570: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
2580: 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67 20 72   set c [string r
2590: 61 6e 67 65 20 24 65 78 70 72 20 24 69 20 24 69  ange $expr $i $i
25a0: 5d 0a 20 20 20 20 69 66 20 7b 24 63 20 3d 3d 20  ].    if {$c == 
25b0: 22 28 22 7d 20 7b 69 6e 63 72 20 69 42 72 61 63  "("} {incr iBrac
25c0: 6b 65 74 7d 0a 20 20 20 20 69 66 20 7b 24 63 20  ket}.    if {$c 
25d0: 3d 3d 20 22 29 22 7d 20 7b 69 6e 63 72 20 69 42  == ")"} {incr iB
25e0: 72 61 63 6b 65 74 20 2d 31 7d 0a 20 20 7d 0a 0a  racket -1}.  }..
25f0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 28    return [expr (
2600: 24 69 42 72 61 63 6b 65 74 3d 3d 30 20 26 26 20  $iBracket==0 && 
2610: 24 69 3d 3d 24 6e 45 78 70 72 29 5d 0a 7d 0a 0a  $i==$nExpr)].}..
2620: 70 72 6f 63 20 67 65 74 5f 6e 65 61 72 5f 72 65  proc get_near_re
2630: 73 75 6c 74 73 20 7b 74 62 6c 20 65 78 70 72 20  sults {tbl expr 
2640: 64 65 66 65 72 72 65 64 20 61 72 72 61 79 76 61  deferred arrayva
2650: 72 20 7b 6e 75 6c 6c 76 61 72 20 22 22 7d 7d 20  r {nullvar ""}} 
2660: 7b 0a 20 20 75 70 76 61 72 20 24 61 72 72 61 79  {.  upvar $array
2670: 76 61 72 20 61 4d 61 74 63 68 69 6e 66 6f 0a 20  var aMatchinfo. 
2680: 20 69 66 20 7b 24 6e 75 6c 6c 76 61 72 20 21 3d   if {$nullvar !=
2690: 20 22 22 7d 20 7b 20 75 70 76 61 72 20 24 6e 75   ""} { upvar $nu
26a0: 6c 6c 76 61 72 20 6e 75 6c 6c 65 6e 74 72 79 20  llvar nullentry 
26b0: 7d 0a 0a 20 20 73 65 74 20 65 78 70 72 20 5b 73  }..  set expr [s
26c0: 74 72 69 6e 67 20 74 72 69 6d 20 24 65 78 70 72  tring trim $expr
26d0: 5d 0a 20 20 77 68 69 6c 65 20 7b 20 5b 6d 61 74  ].  while { [mat
26e0: 63 68 69 6e 67 5f 62 72 61 63 6b 65 74 73 20 24  ching_brackets $
26f0: 65 78 70 72 5d 20 7d 20 7b 0a 20 20 20 20 73 65  expr] } {.    se
2700: 74 20 65 78 70 72 20 5b 73 74 72 69 6e 67 20 74  t expr [string t
2710: 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  rim [string rang
2720: 65 20 24 65 78 70 72 20 31 20 65 6e 64 2d 31 5d  e $expr 1 end-1]
2730: 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 70 72 65  ].  }..  set pre
2740: 63 28 4e 4f 54 29 20 31 0a 20 20 73 65 74 20 70  c(NOT) 1.  set p
2750: 72 65 63 28 41 4e 44 29 20 32 0a 20 20 73 65 74  rec(AND) 2.  set
2760: 20 70 72 65 63 28 4f 52 29 20 20 33 0a 0a 20 20   prec(OR)  3..  
2770: 73 65 74 20 63 75 72 72 65 6e 74 70 72 65 63 20  set currentprec 
2780: 30 0a 20 20 73 65 74 20 69 42 72 61 63 6b 65 74  0.  set iBracket
2790: 20 30 0a 20 20 73 65 74 20 65 78 70 72 5f 6c 65   0.  set expr_le
27a0: 6e 67 74 68 20 5b 6c 6c 65 6e 67 74 68 20 24 65  ngth [llength $e
27b0: 78 70 72 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  xpr].  for {set 
27c0: 69 20 30 7d 20 7b 24 69 20 3c 20 24 65 78 70 72  i 0} {$i < $expr
27d0: 5f 6c 65 6e 67 74 68 7d 20 7b 69 6e 63 72 20 69  _length} {incr i
27e0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 6f 70 20 5b  } {.    set op [
27f0: 6c 69 6e 64 65 78 20 24 65 78 70 72 20 24 69 5d  lindex $expr $i]
2800: 0a 20 20 20 20 69 66 20 7b 24 69 42 72 61 63 6b  .    if {$iBrack
2810: 65 74 3d 3d 30 20 26 26 20 5b 69 6e 66 6f 20 65  et==0 && [info e
2820: 78 69 73 74 73 20 70 72 65 63 28 24 6f 70 29 5d  xists prec($op)]
2830: 20 26 26 20 24 70 72 65 63 28 24 6f 70 29 3e 3d   && $prec($op)>=
2840: 24 63 75 72 72 65 6e 74 70 72 65 63 20 7d 20 7b  $currentprec } {
2850: 0a 20 20 20 20 20 20 73 65 74 20 6f 70 69 64 78  .      set opidx
2860: 20 24 69 0a 20 20 20 20 20 20 73 65 74 20 63 75   $i.      set cu
2870: 72 72 65 6e 74 70 72 65 63 20 24 70 72 65 63 28  rrentprec $prec(
2880: 24 6f 70 29 0a 20 20 20 20 7d 20 65 6c 73 65 20  $op).    } else 
2890: 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  {.      for {set
28a0: 20 6a 20 30 7d 20 7b 24 6a 20 3c 20 5b 73 74 72   j 0} {$j < [str
28b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6f 70 5d 7d  ing length $op]}
28c0: 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20 20   {incr j} {.    
28d0: 20 20 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e      set c [strin
28e0: 67 20 72 61 6e 67 65 20 24 6f 70 20 24 6a 20 24  g range $op $j $
28f0: 6a 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  j].        if {$
2900: 63 20 3d 3d 20 22 28 22 7d 20 7b 20 69 6e 63 72  c == "("} { incr
2910: 20 69 42 72 61 63 6b 65 74 20 2b 31 20 7d 0a 20   iBracket +1 }. 
2920: 20 20 20 20 20 20 20 69 66 20 7b 24 63 20 3d 3d         if {$c ==
2930: 20 22 29 22 7d 20 7b 20 69 6e 63 72 20 69 42 72   ")"} { incr iBr
2940: 61 63 6b 65 74 20 2d 31 20 7d 0a 20 20 20 20 20  acket -1 }.     
2950: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2960: 66 20 7b 24 69 42 72 61 63 6b 65 74 21 3d 30 7d  f {$iBracket!=0}
2970: 20 7b 20 65 72 72 6f 72 20 22 6d 69 73 6d 61 74   { error "mismat
2980: 63 68 65 64 20 62 72 61 63 6b 65 74 73 20 69 6e  ched brackets in
2990: 3a 20 24 65 78 70 72 22 20 7d 0a 0a 20 20 69 66  : $expr" }..  if
29a0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6f   {[info exists o
29b0: 70 69 64 78 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20  pidx]==0} {.    
29c0: 67 65 74 5f 73 69 6e 67 6c 65 5f 6e 65 61 72 5f  get_single_near_
29d0: 72 65 73 75 6c 74 73 20 24 74 62 6c 20 24 65 78  results $tbl $ex
29e0: 70 72 20 24 64 65 66 65 72 72 65 64 20 61 4d 61  pr $deferred aMa
29f0: 74 63 68 69 6e 66 6f 20 6e 75 6c 6c 65 6e 74 72  tchinfo nullentr
2a00: 79 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  y.  } else {.   
2a10: 20 73 65 74 20 65 4c 65 66 74 20 20 5b 6c 72 61   set eLeft  [lra
2a20: 6e 67 65 20 24 65 78 70 72 20 30 20 5b 65 78 70  nge $expr 0 [exp
2a30: 72 20 24 6f 70 69 64 78 2d 31 5d 5d 0a 20 20 20  r $opidx-1]].   
2a40: 20 73 65 74 20 65 52 69 67 68 74 20 5b 6c 72 61   set eRight [lra
2a50: 6e 67 65 20 24 65 78 70 72 20 5b 65 78 70 72 20  nge $expr [expr 
2a60: 24 6f 70 69 64 78 2b 31 5d 20 65 6e 64 5d 0a 0a  $opidx+1] end]..
2a70: 20 20 20 20 67 65 74 5f 6e 65 61 72 5f 72 65 73      get_near_res
2a80: 75 6c 74 73 20 24 74 62 6c 20 24 65 4c 65 66 74  ults $tbl $eLeft
2a90: 20 20 24 64 65 66 65 72 72 65 64 20 61 4c 65 66    $deferred aLef
2aa0: 74 20 20 6e 75 6c 6c 6c 65 66 74 0a 20 20 20 20  t  nullleft.    
2ab0: 67 65 74 5f 6e 65 61 72 5f 72 65 73 75 6c 74 73  get_near_results
2ac0: 20 24 74 62 6c 20 24 65 52 69 67 68 74 20 24 64   $tbl $eRight $d
2ad0: 65 66 65 72 72 65 64 20 61 52 69 67 68 74 20 6e  eferred aRight n
2ae0: 75 6c 6c 72 69 67 68 74 0a 0a 20 20 20 20 73 77  ullright..    sw
2af0: 69 74 63 68 20 2d 2d 20 5b 6c 69 6e 64 65 78 20  itch -- [lindex 
2b00: 24 65 78 70 72 20 24 6f 70 69 64 78 5d 20 7b 0a  $expr $opidx] {.
2b10: 20 20 20 20 20 20 22 4e 4f 54 22 20 7b 0a 20 20        "NOT" {.  
2b20: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 68 69        foreach hi
2b30: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61  t [array names a
2b40: 4c 65 66 74 5d 20 7b 0a 20 20 20 20 20 20 20 20  Left] {.        
2b50: 20 20 69 66 20 7b 30 3d 3d 5b 69 6e 66 6f 20 65    if {0==[info e
2b60: 78 69 73 74 73 20 61 52 69 67 68 74 28 24 68 69  xists aRight($hi
2b70: 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  t)]} {.         
2b80: 20 20 20 73 65 74 20 61 4d 61 74 63 68 69 6e 66     set aMatchinf
2b90: 6f 28 24 68 69 74 29 20 24 61 4c 65 66 74 28 24  o($hit) $aLeft($
2ba0: 68 69 74 29 0a 20 20 20 20 20 20 20 20 20 20 7d  hit).          }
2bb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bc0: 20 20 20 73 65 74 20 6e 75 6c 6c 65 6e 74 72 79     set nullentry
2bd0: 20 24 6e 75 6c 6c 6c 65 66 74 0a 20 20 20 20 20   $nullleft.     
2be0: 20 7d 0a 0a 20 20 20 20 20 20 22 41 4e 44 22 20   }..      "AND" 
2bf0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  {.        foreac
2c00: 68 20 68 69 74 20 5b 61 72 72 61 79 20 6e 61 6d  h hit [array nam
2c10: 65 73 20 61 4c 65 66 74 5d 20 7b 0a 20 20 20 20  es aLeft] {.    
2c20: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2c30: 65 78 69 73 74 73 20 61 52 69 67 68 74 28 24 68  exists aRight($h
2c40: 69 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  it)]} {.        
2c50: 20 20 20 20 73 65 74 20 61 4d 61 74 63 68 69 6e      set aMatchin
2c60: 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e 63 61 74  fo($hit) [concat
2c70: 20 24 61 4c 65 66 74 28 24 68 69 74 29 20 24 61   $aLeft($hit) $a
2c80: 52 69 67 68 74 28 24 68 69 74 29 5d 0a 20 20 20  Right($hit)].   
2c90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca0: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e   }.        set n
2cb0: 75 6c 6c 65 6e 74 72 79 20 5b 63 6f 6e 63 61 74  ullentry [concat
2cc0: 20 24 6e 75 6c 6c 6c 65 66 74 20 24 6e 75 6c 6c   $nullleft $null
2cd0: 72 69 67 68 74 5d 0a 20 20 20 20 20 20 7d 0a 0a  right].      }..
2ce0: 20 20 20 20 20 20 22 4f 52 22 20 7b 0a 20 20 20        "OR" {.   
2cf0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 68 69 74       foreach hit
2d00: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61 4c   [array names aL
2d10: 65 66 74 5d 20 7b 0a 20 20 20 20 20 20 20 20 20  eft] {.         
2d20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2d30: 73 20 61 52 69 67 68 74 28 24 68 69 74 29 5d 7d  s aRight($hit)]}
2d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
2d50: 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 28 24 68  et aMatchinfo($h
2d60: 69 74 29 20 5b 63 6f 6e 63 61 74 20 24 61 4c 65  it) [concat $aLe
2d70: 66 74 28 24 68 69 74 29 20 24 61 52 69 67 68 74  ft($hit) $aRight
2d80: 28 24 68 69 74 29 5d 0a 20 20 20 20 20 20 20 20  ($hit)].        
2d90: 20 20 20 20 75 6e 73 65 74 20 61 52 69 67 68 74      unset aRight
2da0: 28 24 68 69 74 29 0a 20 20 20 20 20 20 20 20 20  ($hit).         
2db0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2dc0: 20 20 20 20 20 20 73 65 74 20 61 4d 61 74 63 68        set aMatch
2dd0: 69 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e 63  info($hit) [conc
2de0: 61 74 20 24 61 4c 65 66 74 28 24 68 69 74 29 20  at $aLeft($hit) 
2df0: 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20 20 20 20  $nullright].    
2e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e10: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  }.        foreac
2e20: 68 20 68 69 74 20 5b 61 72 72 61 79 20 6e 61 6d  h hit [array nam
2e30: 65 73 20 61 52 69 67 68 74 5d 20 7b 0a 20 20 20  es aRight] {.   
2e40: 20 20 20 20 20 20 20 73 65 74 20 61 4d 61 74 63         set aMatc
2e50: 68 69 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e  hinfo($hit) [con
2e60: 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74 20 24 61  cat $nullleft $a
2e70: 52 69 67 68 74 28 24 68 69 74 29 5d 0a 20 20 20  Right($hit)].   
2e80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2e90: 73 65 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b 63  set nullentry [c
2ea0: 6f 6e 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74 20  oncat $nullleft 
2eb0: 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20 20 20 20  $nullright].    
2ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2ed0: 0a 0a 23 20 45 6e 64 20 6f 66 20 74 65 73 74 20  ..# End of test 
2ee0: 70 72 6f 63 73 2e 20 41 63 74 75 61 6c 20 74 65  procs. Actual te
2ef0: 73 74 73 20 61 72 65 20 62 65 6c 6f 77 20 74 68  sts are below th
2f00: 69 73 20 6c 69 6e 65 2e 0a 23 2d 2d 2d 2d 2d 2d  is line..#------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 0a 23 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 2d 2d 2d 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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
2fb0: 67 20 74 65 73 74 20 63 61 73 65 73 20 2d 20 66  g test cases - f
2fc0: 74 73 33 61 75 74 6f 2d 31 2e 2a 20 2d 20 66 6f  ts3auto-1.* - fo
2fd0: 63 75 73 20 6f 6e 20 74 65 73 74 69 6e 67 20 74  cus on testing t
2fe0: 68 65 20 54 63 6c 20 0a 23 20 63 6f 6d 6d 61 6e  he Tcl .# comman
2ff0: 64 20 5b 66 74 73 33 5f 6e 65 61 72 5f 6d 61 74  d [fts3_near_mat
3000: 63 68 5d 2c 20 77 68 69 63 68 20 69 73 20 75 73  ch], which is us
3010: 65 64 20 62 79 20 6f 74 68 65 72 20 74 65 73 74  ed by other test
3020: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  s in this file..
3030: 23 0a 70 72 6f 63 20 74 65 73 74 5f 66 74 73 33  #.proc test_fts3
3040: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 7b 74 6e 20  _near_match {tn 
3050: 64 6f 63 20 65 78 70 72 20 72 65 73 7d 20 7b 0a  doc expr res} {.
3060: 20 20 66 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63    fts3_near_matc
3070: 68 20 24 64 6f 63 20 24 65 78 70 72 20 2d 70 68  h $doc $expr -ph
3080: 72 61 73 65 63 6f 75 6e 74 76 61 72 20 70 0a 20  rasecountvar p. 
3090: 20 75 70 6c 65 76 65 6c 20 64 6f 5f 74 65 73 74   uplevel do_test
30a0: 20 5b 6c 69 73 74 20 24 74 6e 5d 20 5b 6c 69 73   [list $tn] [lis
30b0: 74 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24  t [list set {} $
30c0: 70 5d 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d 0a  p]] [list $res].
30d0: 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65 61  }..test_fts3_nea
30e0: 72 5f 6d 61 74 63 68 20 31 2e 31 2e 31 20 7b 61  r_match 1.1.1 {a
30f0: 20 62 20 63 20 61 20 62 7d 20 61 20 20 20 20 20   b c a b} a     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32                {2
3110: 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65 61 72  }.test_fts3_near
3120: 5f 6d 61 74 63 68 20 31 2e 31 2e 32 20 7b 61 20  _match 1.1.2 {a 
3130: 62 20 63 20 61 20 62 7d 20 7b 61 20 35 20 62 20  b c a b} {a 5 b 
3140: 36 20 63 7d 20 20 20 20 20 20 20 20 20 7b 32 20  6 c}         {2 
3150: 32 20 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e  2 1}.test_fts3_n
3160: 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 33 20  ear_match 1.1.3 
3170: 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 22 61 20  {a b c a b} {"a 
3180: 62 22 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  b"}             
3190: 7b 32 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65  {2}.test_fts3_ne
31a0: 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 34 20 7b  ar_match 1.1.4 {
31b0: 61 20 62 20 63 20 61 20 62 7d 20 7b 22 62 20 63  a b c a b} {"b c
31c0: 22 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  "}             {
31d0: 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65 61  1}.test_fts3_nea
31e0: 72 5f 6d 61 74 63 68 20 31 2e 31 2e 35 20 7b 61  r_match 1.1.5 {a
31f0: 20 62 20 63 20 61 20 62 7d 20 7b 22 63 20 63 22   b c a b} {"c c"
3200: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30  }             {0
3210: 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65 61  }..test_fts3_nea
3220: 72 5f 6d 61 74 63 68 20 31 2e 32 2e 31 20 22 61  r_match 1.2.1 "a
3230: 20 62 20 63 20 64 20 65 20 66 20 67 22 20 7b 62   b c d e f g" {b
3240: 20 32 20 66 7d 20 20 20 20 20 20 20 20 20 7b 30   2 f}         {0
3250: 20 30 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65   0}.test_fts3_ne
3260: 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 32 20 22  ar_match 1.2.2 "
3270: 61 20 62 20 63 20 64 20 65 20 66 20 67 22 20 7b  a b c d e f g" {
3280: 62 20 33 20 66 7d 20 20 20 20 20 20 20 20 20 7b  b 3 f}         {
3290: 31 20 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e  1 1}.test_fts3_n
32a0: 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 33 20  ear_match 1.2.3 
32b0: 22 61 20 62 20 63 20 64 20 65 20 66 20 67 22 20  "a b c d e f g" 
32c0: 7b 66 20 32 20 62 7d 20 20 20 20 20 20 20 20 20  {f 2 b}         
32d0: 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74 73 33 5f  {0 0}.test_fts3_
32e0: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 34  near_match 1.2.4
32f0: 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67 22   "a b c d e f g"
3300: 20 7b 66 20 33 20 62 7d 20 20 20 20 20 20 20 20   {f 3 b}        
3310: 20 7b 31 20 31 7d 0a 74 65 73 74 5f 66 74 73 33   {1 1}.test_fts3
3320: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e  _near_match 1.2.
3330: 35 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67  5 "a b c d e f g
3340: 22 20 7b 22 61 20 62 22 20 32 20 22 66 20 67 22  " {"a b" 2 "f g"
3350: 7d 20 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74 73  } {0 0}.test_fts
3360: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32  3_near_match 1.2
3370: 2e 36 20 22 61 20 62 20 63 20 64 20 65 20 66 20  .6 "a b c d e f 
3380: 67 22 20 7b 22 61 20 62 22 20 33 20 22 66 20 67  g" {"a b" 3 "f g
3390: 22 7d 20 7b 31 20 31 7d 0a 0a 73 65 74 20 41 20  "} {1 1}..set A 
33a0: 22 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68  "a b c d e f g h
33b0: 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70   i j k l m n o p
33c0: 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78   q r s t u v w x
33d0: 20 79 20 7a 22 0a 74 65 73 74 5f 66 74 73 33 5f   y z".test_fts3_
33e0: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 33 2e 31  near_match 1.3.1
33f0: 20 24 41 20 7b 22 63 20 64 22 20 35 20 22 69 20   $A {"c d" 5 "i 
3400: 6a 22 20 31 20 22 65 20 66 22 7d 20 20 20 20 20  j" 1 "e f"}     
3410: 20 7b 30 20 30 20 30 7d 0a 74 65 73 74 5f 66 74   {0 0 0}.test_ft
3420: 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e  s3_near_match 1.
3430: 33 2e 32 20 24 41 20 7b 22 63 20 64 22 20 35 20  3.2 $A {"c d" 5 
3440: 22 69 20 6a 22 20 32 20 22 65 20 66 22 7d 20 20  "i j" 2 "e f"}  
3450: 20 20 20 20 7b 31 20 31 20 31 7d 0a 0a 23 2d 2d      {1 1 1}..#--
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 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 0a 23 20 54 65 73 74 20  --------.# Test 
34b0: 63 61 73 65 73 20 66 74 73 33 61 75 74 6f 2d 32  cases fts3auto-2
34c0: 2e 2a 20 72 75 6e 20 73 6f 6d 65 20 73 69 6d 70  .* run some simp
34d0: 6c 65 20 74 65 73 74 73 20 75 73 69 6e 67 20 74  le tests using t
34e0: 68 65 20 0a 23 20 5b 64 6f 5f 66 74 73 33 71 75  he .# [do_fts3qu
34f0: 65 72 79 5f 74 65 73 74 5d 20 70 72 6f 63 2e 0a  ery_test] proc..
3500: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 72  #.foreach {tn cr
3510: 65 61 74 65 7d 20 7b 0a 20 20 31 20 20 20 20 22  eate} {.  1    "
3520: 66 74 73 34 28 61 2c 20 62 29 22 0a 20 20 32 20  fts4(a, b)".  2 
3530: 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f     "fts4(a, b, o
3540: 72 64 65 72 3d 44 45 53 43 29 22 0a 20 20 33 20  rder=DESC)".  3 
3550: 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f     "fts4(a, b, o
3560: 72 64 65 72 3d 41 53 43 29 22 0a 20 20 34 20 20  rder=ASC)".  4  
3570: 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 70 72    "fts4(a, b, pr
3580: 65 66 69 78 3d 31 29 22 0a 20 20 35 20 20 20 20  efix=1)".  5    
3590: 22 66 74 73 34 28 61 2c 20 62 2c 20 6f 72 64 65  "fts4(a, b, orde
35a0: 72 3d 44 45 53 43 2c 20 70 72 65 66 69 78 3d 31  r=DESC, prefix=1
35b0: 29 22 0a 20 20 36 20 20 20 20 22 66 74 73 34 28  )".  6    "fts4(
35c0: 61 2c 20 62 2c 20 6f 72 64 65 72 3d 41 53 43 2c  a, b, order=ASC,
35d0: 20 70 72 65 66 69 78 3d 31 29 22 0a 7d 20 7b 0a   prefix=1)".} {.
35e0: 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 74 6e 2e    do_test 2.$tn.
35f0: 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  1 {.    catchsql
3600: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31   { DROP TABLE t1
3610: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20   }.    execsql  
3620: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
3630: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 24  TABLE t1 USING $
3640: 63 72 65 61 74 65 22 0a 20 20 20 20 66 6f 72 20  create".    for 
3650: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 32  {set i 0} {$i<32
3660: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
3670: 20 20 20 73 65 74 20 64 6f 63 20 5b 6c 69 73 74     set doc [list
3680: 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 69 26 30  ].      if {$i&0
3690: 78 30 31 7d 20 7b 6c 61 70 70 65 6e 64 20 64 6f  x01} {lappend do
36a0: 63 20 6f 6e 65 7d 0a 20 20 20 20 20 20 69 66 20  c one}.      if 
36b0: 7b 24 69 26 30 78 30 32 7d 20 7b 6c 61 70 70 65  {$i&0x02} {lappe
36c0: 6e 64 20 64 6f 63 20 74 77 6f 7d 0a 20 20 20 20  nd doc two}.    
36d0: 20 20 69 66 20 7b 24 69 26 30 78 30 34 7d 20 7b    if {$i&0x04} {
36e0: 6c 61 70 70 65 6e 64 20 64 6f 63 20 74 68 72 65  lappend doc thre
36f0: 65 7d 0a 20 20 20 20 20 20 69 66 20 7b 24 69 26  e}.      if {$i&
3700: 30 78 30 38 7d 20 7b 6c 61 70 70 65 6e 64 20 64  0x08} {lappend d
3710: 6f 63 20 66 6f 75 72 7d 0a 20 20 20 20 20 20 69  oc four}.      i
3720: 66 20 7b 24 69 26 30 78 31 30 7d 20 7b 6c 61 70  f {$i&0x10} {lap
3730: 70 65 6e 64 20 64 6f 63 20 66 69 76 65 7d 0a 20  pend doc five}. 
3740: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49       execsql { I
3750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3760: 4c 55 45 53 28 24 64 6f 63 2c 20 6e 75 6c 6c 29  LUES($doc, null)
3770: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a   }.    }.  } {}.
3780: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20  .  foreach {tn2 
3790: 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20 20  expr} {.    1   
37a0: 20 20 7b 6f 6e 65 7d 0a 20 20 20 20 32 20 20 20    {one}.    2   
37b0: 20 20 7b 6f 6e 65 20 4e 45 41 52 2f 31 20 66 69    {one NEAR/1 fi
37c0: 76 65 7d 0a 20 20 20 20 33 20 20 20 20 20 7b 74  ve}.    3     {t
37d0: 2a 7d 0a 20 20 20 20 34 20 20 20 20 20 7b 74 2a  *}.    4     {t*
37e0: 20 4e 45 41 52 2f 30 20 66 69 76 65 7d 0a 20 20   NEAR/0 five}.  
37f0: 20 20 35 20 20 20 20 20 7b 6f 2a 20 4e 45 41 52    5     {o* NEAR
3800: 2f 31 20 66 2a 7d 0a 20 20 20 20 36 20 20 20 20  /1 f*}.    6    
3810: 20 7b 6f 6e 65 20 4e 45 41 52 20 66 69 76 65 20   {one NEAR five 
3820: 4e 45 41 52 20 74 77 6f 20 4e 45 41 52 20 66 6f  NEAR two NEAR fo
3830: 75 72 20 4e 45 41 52 20 74 68 72 65 65 7d 0a 20  ur NEAR three}. 
3840: 20 20 20 37 20 20 20 20 20 7b 6f 6e 65 20 4e 45     7     {one NE
3850: 41 52 20 78 79 7a 7d 0a 20 20 20 20 38 20 20 20  AR xyz}.    8   
3860: 20 20 7b 6f 6e 65 20 4f 52 20 74 77 6f 7d 0a 20    {one OR two}. 
3870: 20 20 20 39 20 20 20 20 20 7b 6f 6e 65 20 41 4e     9     {one AN
3880: 44 20 74 77 6f 7d 0a 20 20 20 20 31 30 20 20 20  D two}.    10   
3890: 20 7b 6f 6e 65 20 4e 4f 54 20 74 77 6f 7d 0a 20   {one NOT two}. 
38a0: 20 20 20 31 31 20 20 20 20 7b 6f 6e 65 20 41 4e     11    {one AN
38b0: 44 20 74 77 6f 20 4f 52 20 74 68 72 65 65 7d 0a  D two OR three}.
38c0: 20 20 20 20 31 32 20 20 20 20 7b 74 68 72 65 65      12    {three
38d0: 20 4f 52 20 6f 6e 65 20 41 4e 44 20 74 77 6f 7d   OR one AND two}
38e0: 0a 20 20 20 20 31 33 20 20 20 20 7b 28 74 68 72  .    13    {(thr
38f0: 65 65 20 4f 52 20 6f 6e 65 29 20 41 4e 44 20 74  ee OR one) AND t
3900: 77 6f 7d 0a 20 20 20 20 31 34 20 20 20 20 7b 28  wo}.    14    {(
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 20 4e 4f 54 20 28 66 69 76 65 20  D two NOT (five 
3930: 4e 4f 54 20 66 6f 75 72 29 7d 0a 20 20 20 20 31  NOT four)}.    1
3940: 35 20 20 20 20 7b 22 6f 6e 65 20 74 77 6f 22 7d  5    {"one two"}
3950: 0a 20 20 20 20 31 36 20 20 20 20 7b 22 6f 6e 65  .    16    {"one
3960: 20 74 77 6f 22 20 4e 4f 54 20 22 74 68 72 65 65   two" NOT "three
3970: 20 66 6f 75 72 22 7d 0a 20 20 7d 20 7b 0a 20 20   four"}.  } {.  
3980: 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74    do_fts3query_t
3990: 65 73 74 20 32 2e 24 74 6e 2e 32 2e 24 74 6e 32  est 2.$tn.2.$tn2
39a0: 20 74 31 20 24 65 78 70 72 0a 20 20 7d 0a 7d 0a   t1 $expr.  }.}.
39b0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 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 0a 23 20 53  ------------.# S
3a00: 6f 6d 65 20 74 65 73 74 20 63 61 73 65 73 20 69  ome test cases i
3a10: 6e 76 6f 6c 76 69 6e 67 20 64 65 66 65 72 72 65  nvolving deferre
3a20: 64 20 74 6f 6b 65 6e 73 2e 0a 23 0a 0a 66 6f 72  d tokens..#..for
3a30: 65 61 63 68 20 7b 74 6e 20 63 72 65 61 74 65 7d  each {tn create}
3a40: 20 7b 0a 20 20 31 20 20 20 20 22 66 74 73 34 28   {.  1    "fts4(
3a50: 78 29 22 0a 20 20 32 20 20 20 20 22 66 74 73 34  x)".  2    "fts4
3a60: 28 78 2c 20 6f 72 64 65 72 3d 44 45 53 43 29 22  (x, order=DESC)"
3a70: 0a 7d 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .} {.  catchsql 
3a80: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
3a90: 7d 0a 20 20 65 78 65 63 73 71 6c 20 20 22 43 52  }.  execsql  "CR
3aa0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3ab0: 4c 45 20 74 31 20 55 53 49 4e 47 20 24 63 72 65  LE t1 USING $cre
3ac0: 61 74 65 22 0a 20 20 64 6f 5f 65 78 65 63 73 71  ate".  do_execsq
3ad0: 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 31 20 7b  l_test 3.$tn.1 {
3ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3af0: 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20 56 41   t1(docid, x) VA
3b00: 4c 55 45 53 28 2d 32 2c 20 27 61 20 62 20 63 20  LUES(-2, 'a b c 
3b10: 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 27  d e f g h i j k'
3b20: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3b30: 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20  TO t1(docid, x) 
3b40: 56 41 4c 55 45 53 28 2d 31 2c 20 27 62 20 63 20  VALUES(-1, 'b c 
3b50: 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20  d e f g h i j k 
3b60: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
3b70: 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78  INTO t1(docid, x
3b80: 29 20 56 41 4c 55 45 53 28 30 2c 20 27 63 20 64  ) VALUES(0, 'c d
3b90: 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 61   e f g h i j k a
3ba0: 20 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   b');.    INSERT
3bb0: 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20   INTO t1(docid, 
3bc0: 78 29 20 56 41 4c 55 45 53 28 31 2c 20 27 64 20  x) VALUES(1, 'd 
3bd0: 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 61 20  e f g h i j k a 
3be0: 62 20 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  b c');.    INSER
3bf0: 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c  T INTO t1(docid,
3c00: 20 78 29 20 56 41 4c 55 45 53 28 32 2c 20 27 65   x) VALUES(2, 'e
3c10: 20 66 20 67 20 68 20 69 20 6a 20 6b 20 61 20 62   f g h i j k a b
3c20: 20 63 20 64 27 29 3b 0a 20 20 20 20 49 4e 53 45   c d');.    INSE
3c30: 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64  RT INTO t1(docid
3c40: 2c 20 78 29 20 56 41 4c 55 45 53 28 33 2c 20 27  , x) VALUES(3, '
3c50: 66 20 67 20 68 20 69 20 6a 20 6b 20 61 20 62 20  f g h i j k a b 
3c60: 63 20 64 20 65 27 29 3b 0a 20 20 20 20 49 4e 53  c d e');.    INS
3c70: 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69  ERT INTO t1(doci
3c80: 64 2c 20 78 29 20 56 41 4c 55 45 53 28 34 2c 20  d, x) VALUES(4, 
3c90: 27 61 20 63 20 65 20 67 20 69 20 6b 27 29 3b 0a  'a c e g i k');.
3ca0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3cb0: 74 31 28 64 6f 63 69 64 2c 20 78 29 20 56 41 4c  t1(docid, x) VAL
3cc0: 55 45 53 28 35 2c 20 27 61 20 64 20 67 20 6a 27  UES(5, 'a d g j'
3cd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3ce0: 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20  TO t1(docid, x) 
3cf0: 56 41 4c 55 45 53 28 36 2c 20 27 63 20 61 20 62  VALUES(6, 'c a b
3d00: 27 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 6c  ');.  }..  set l
3d10: 69 6d 69 74 20 5b 66 74 73 33 5f 6d 61 6b 65 5f  imit [fts3_make_
3d20: 64 65 66 65 72 72 61 62 6c 65 20 74 31 20 63 5d  deferrable t1 c]
3d30: 0a 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79  ..  do_fts3query
3d40: 5f 74 65 73 74 20 33 2e 24 74 6e 2e 32 2e 31 20  _test 3.$tn.2.1 
3d50: 74 31 20 7b 61 20 4f 52 20 63 7d 0a 0a 20 20 69  t1 {a OR c}..  i
3d60: 66 63 61 70 61 62 6c 65 20 66 74 73 34 5f 64 65  fcapable fts4_de
3d70: 66 65 72 72 65 64 20 7b 0a 20 20 20 20 64 6f 5f  ferred {.    do_
3d80: 74 65 73 74 20 33 2e 24 74 6e 2e 33 20 7b 20 66  test 3.$tn.3 { f
3d90: 74 73 33 5f 7a 65 72 6f 5f 6c 6f 6e 67 5f 73 65  ts3_zero_long_se
3da0: 67 6d 65 6e 74 73 20 74 31 20 24 6c 69 6d 69 74  gments t1 $limit
3db0: 20 7d 20 7b 31 7d 0a 20 20 7d 0a 0a 20 20 66 6f   } {1}.  }..  fo
3dc0: 72 65 61 63 68 20 7b 74 6e 32 20 65 78 70 72 20  reach {tn2 expr 
3dd0: 64 65 66 7d 20 7b 0a 20 20 20 20 31 20 20 20 20  def} {.    1    
3de0: 20 7b 61 20 4e 45 41 52 20 63 7d 20 20 20 20 20   {a NEAR c}     
3df0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 32 20         {}.    2 
3e00: 20 20 20 20 7b 61 20 41 4e 44 20 63 7d 20 20 20      {a AND c}   
3e10: 20 20 20 20 20 20 20 20 20 20 63 0a 20 20 20 20            c.    
3e20: 33 20 20 20 20 20 7b 22 61 20 63 22 7d 20 20 20  3     {"a c"}   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 63 0a 20 20              c.  
3e40: 20 20 34 20 20 20 20 20 7b 22 63 20 61 22 7d 20    4     {"c a"} 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 0a                c.
3e60: 20 20 20 20 35 20 20 20 20 20 7b 22 61 20 63 22      5     {"a c"
3e70: 20 4e 45 41 52 2f 31 20 67 7d 20 20 20 20 20 20   NEAR/1 g}      
3e80: 7b 7d 0a 20 20 20 20 36 20 20 20 20 20 7b 22 61  {}.    6     {"a
3e90: 20 63 22 20 4e 45 41 52 2f 30 20 67 7d 20 20 20   c" NEAR/0 g}   
3ea0: 20 20 20 7b 7d 0a 20 20 7d 20 7b 0a 20 20 20 20     {}.  } {.    
3eb0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
3ec0: 74 20 33 2e 24 74 6e 2e 34 2e 24 74 6e 32 20 2d  t 3.$tn.4.$tn2 -
3ed0: 64 65 66 65 72 72 65 64 20 24 64 65 66 20 74 31  deferred $def t1
3ee0: 20 24 65 78 70 72 0a 20 20 7d 0a 7d 0a 0a 23 2d   $expr.  }.}..#-
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 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 0a 23 20 0a 66 6f 72  ---------.# .for
3f40: 65 61 63 68 20 7b 74 6e 20 63 72 65 61 74 65 7d  each {tn create}
3f50: 20 7b 0a 20 20 31 20 20 20 20 22 66 74 73 34 28   {.  1    "fts4(
3f60: 78 2c 20 79 29 22 0a 20 20 32 20 20 20 20 22 66  x, y)".  2    "f
3f70: 74 73 34 28 78 2c 20 79 2c 20 6f 72 64 65 72 3d  ts4(x, y, order=
3f80: 44 45 53 43 29 22 0a 20 20 33 20 20 20 20 22 66  DESC)".  3    "f
3f90: 74 73 34 28 78 2c 20 79 2c 20 6f 72 64 65 72 3d  ts4(x, y, order=
3fa0: 44 45 53 43 2c 20 70 72 65 66 69 78 3d 32 29 22  DESC, prefix=2)"
3fb0: 0a 7d 20 7b 0a 0a 20 20 65 78 65 63 73 71 6c 20  .} {..  execsql 
3fc0: 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 44 52 4f  [subst {.    DRO
3fd0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
3fe0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3ff0: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 24 63  ABLE t1 USING $c
4000: 72 65 61 74 65 3b 0a 20 20 20 20 49 4e 53 45 52  reate;.    INSER
4010: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4020: 28 27 6f 6e 65 20 74 77 6f 20 66 69 76 65 20 66  ('one two five f
4030: 6f 75 72 20 66 69 76 65 27 2c 20 27 27 29 3b 0a  our five', '');.
4040: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4050: 74 31 20 56 41 4c 55 45 53 28 27 27 2c 20 27 6f  t1 VALUES('', 'o
4060: 6e 65 20 74 77 6f 20 66 69 76 65 20 66 6f 75 72  ne two five four
4070: 20 66 69 76 65 27 29 3b 0a 20 20 20 20 49 4e 53   five');.    INS
4080: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4090: 45 53 28 27 6f 6e 65 20 74 77 6f 27 2c 20 27 66  ES('one two', 'f
40a0: 69 76 65 20 66 6f 75 72 20 66 69 76 65 27 29 3b  ive four five');
40b0: 0a 20 20 7d 5d 0a 0a 20 20 64 6f 5f 66 74 73 33  .  }]..  do_fts3
40c0: 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e  query_test 4.$tn
40d0: 2e 31 2e 31 20 74 31 20 7b 6f 6e 65 20 41 4e 44  .1.1 t1 {one AND
40e0: 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73 33   five}.  do_fts3
40f0: 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e  query_test 4.$tn
4100: 2e 31 2e 32 20 74 31 20 7b 6f 6e 65 20 4e 45 41  .1.2 t1 {one NEA
4110: 52 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73  R five}.  do_fts
4120: 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74  3query_test 4.$t
4130: 6e 2e 31 2e 33 20 74 31 20 7b 6f 6e 65 20 4e 45  n.1.3 t1 {one NE
4140: 41 52 2f 31 20 66 69 76 65 7d 0a 20 20 64 6f 5f  AR/1 five}.  do_
4150: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
4160: 2e 24 74 6e 2e 31 2e 34 20 74 31 20 7b 6f 6e 65  .$tn.1.4 t1 {one
4170: 20 4e 45 41 52 2f 32 20 66 69 76 65 7d 0a 20 20   NEAR/2 five}.  
4180: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
4190: 74 20 34 2e 24 74 6e 2e 31 2e 35 20 74 31 20 7b  t 4.$tn.1.5 t1 {
41a0: 6f 6e 65 20 4e 45 41 52 2f 33 20 66 69 76 65 7d  one NEAR/3 five}
41b0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 34 2e 24 74  ..  do_test 4.$t
41c0: 6e 2e 32 20 7b 20 0a 20 20 20 20 73 65 74 20 6c  n.2 { .    set l
41d0: 69 6d 69 74 20 5b 66 74 73 33 5f 6d 61 6b 65 5f  imit [fts3_make_
41e0: 64 65 66 65 72 72 61 62 6c 65 20 74 31 20 66 69  deferrable t1 fi
41f0: 76 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ve].    execsql 
4200: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
4210: 28 74 31 29 20 56 41 4c 55 45 53 28 27 6f 70 74  (t1) VALUES('opt
4220: 69 6d 69 7a 65 27 29 20 7d 0a 20 20 20 20 69 66  imize') }.    if
4230: 63 61 70 61 62 6c 65 20 66 74 73 34 5f 64 65 66  capable fts4_def
4240: 65 72 72 65 64 20 7b 0a 20 20 20 20 20 20 65 78  erred {.      ex
4250: 70 72 20 7b 5b 66 74 73 33 5f 7a 65 72 6f 5f 6c  pr {[fts3_zero_l
4260: 6f 6e 67 5f 73 65 67 6d 65 6e 74 73 20 74 31 20  ong_segments t1 
4270: 24 6c 69 6d 69 74 5d 3e 30 7d 0a 20 20 20 20 7d  $limit]>0}.    }
4280: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 65 78   else {.      ex
4290: 70 72 20 31 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  pr 1.    }.  } {
42a0: 31 7d 0a 0a 20 20 64 6f 5f 66 74 73 33 71 75 65  1}..  do_fts3que
42b0: 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33 2e  ry_test 4.$tn.3.
42c0: 31 20 2d 64 65 66 65 72 72 65 64 20 66 69 76 65  1 -deferred five
42d0: 20 74 31 20 7b 6f 6e 65 20 41 4e 44 20 66 69 76   t1 {one AND fiv
42e0: 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  e}.  do_fts3quer
42f0: 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33 2e 32  y_test 4.$tn.3.2
4300: 20 2d 64 65 66 65 72 72 65 64 20 66 69 76 65 20   -deferred five 
4310: 74 31 20 7b 6f 6e 65 20 4e 45 41 52 20 66 69 76  t1 {one NEAR fiv
4320: 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  e}.  do_fts3quer
4330: 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33 2e 33  y_test 4.$tn.3.3
4340: 20 2d 64 65 66 65 72 72 65 64 20 66 69 76 65 20   -deferred five 
4350: 74 31 20 7b 6f 6e 65 20 4e 45 41 52 2f 31 20 66  t1 {one NEAR/1 f
4360: 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75  ive}.  do_fts3qu
4370: 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33  ery_test 4.$tn.3
4380: 2e 34 20 2d 64 65 66 65 72 72 65 64 20 66 69 76  .4 -deferred fiv
4390: 65 20 74 31 20 7b 6f 6e 65 20 4e 45 41 52 2f 32  e t1 {one NEAR/2
43a0: 20 66 69 76 65 7d 0a 0a 20 20 64 6f 5f 66 74 73   five}..  do_fts
43b0: 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74  3query_test 4.$t
43c0: 6e 2e 33 2e 35 20 2d 64 65 66 65 72 72 65 64 20  n.3.5 -deferred 
43d0: 66 69 76 65 20 74 31 20 7b 6f 6e 65 20 4e 45 41  five t1 {one NEA
43e0: 52 2f 33 20 66 69 76 65 7d 0a 0a 20 20 64 6f 5f  R/3 five}..  do_
43f0: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
4400: 2e 24 74 6e 2e 34 2e 31 20 2d 64 65 66 65 72 72  .$tn.4.1 -deferr
4410: 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 41  ed fi* t1 {on* A
4420: 4e 44 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74 73  ND fi*}.  do_fts
4430: 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74  3query_test 4.$t
4440: 6e 2e 34 2e 32 20 2d 64 65 66 65 72 72 65 64 20  n.4.2 -deferred 
4450: 66 69 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41 52  fi* t1 {on* NEAR
4460: 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71   fi*}.  do_fts3q
4470: 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e  uery_test 4.$tn.
4480: 34 2e 33 20 2d 64 65 66 65 72 72 65 64 20 66 69  4.3 -deferred fi
4490: 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41 52 2f 31  * t1 {on* NEAR/1
44a0: 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71   fi*}.  do_fts3q
44b0: 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e  uery_test 4.$tn.
44c0: 34 2e 34 20 2d 64 65 66 65 72 72 65 64 20 66 69  4.4 -deferred fi
44d0: 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41 52 2f 32  * t1 {on* NEAR/2
44e0: 20 66 69 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71   fi*}.  do_fts3q
44f0: 75 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e  uery_test 4.$tn.
4500: 34 2e 35 20 2d 64 65 66 65 72 72 65 64 20 66 69  4.5 -deferred fi
4510: 2a 20 74 31 20 7b 6f 6e 2a 20 4e 45 41 52 2f 33  * t1 {on* NEAR/3
4520: 20 66 69 2a 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   fi*}.}..#------
4530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
4580: 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 73 20  wing test cases 
4590: 2d 20 66 74 73 33 61 75 74 6f 2d 35 2e 2a 20 2d  - fts3auto-5.* -
45a0: 20 66 6f 63 75 73 20 6f 6e 20 75 73 69 6e 67 20   focus on using 
45b0: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 2e 0a  prefix indexes..
45c0: 23 0a 73 65 74 20 63 68 75 6e 6b 63 6f 6e 66 69  #.set chunkconfi
45d0: 67 20 5b 66 74 73 33 5f 63 6f 6e 66 69 67 75 72  g [fts3_configur
45e0: 65 5f 69 6e 63 72 5f 6c 6f 61 64 20 31 20 31 5d  e_incr_load 1 1]
45f0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 72 65  .foreach {tn cre
4600: 61 74 65 20 70 65 6e 64 69 6e 67 7d 20 7b 0a 20  ate pending} {. 
4610: 20 31 20 20 20 20 22 66 74 73 34 28 61 2c 20 62   1    "fts4(a, b
4620: 29 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )"              
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 31 0a 20 20 32 20 20 20 20 22 66 74      1.  2    "ft
4650: 73 34 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d 41  s4(a, b, order=A
4660: 53 43 2c 20 70 72 65 66 69 78 3d 31 29 22 20 20  SC, prefix=1)"  
4670: 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 33             1.  3
4680: 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20      "fts4(a, b, 
4690: 6f 72 64 65 72 3d 41 53 43 2c 20 20 70 72 65 66  order=ASC,  pref
46a0: 69 78 3d 5c 22 31 2c 33 5c 22 29 22 20 20 20 20  ix=\"1,3\")"    
46b0: 20 20 30 0a 20 20 34 20 20 20 20 22 66 74 73 34    0.  4    "fts4
46c0: 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d 44 45 53  (a, b, order=DES
46d0: 43 2c 20 70 72 65 66 69 78 3d 5c 22 32 2c 34 5c  C, prefix=\"2,4\
46e0: 22 29 22 20 20 20 20 20 20 30 0a 20 20 35 20 20  ")"      0.  5  
46f0: 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f 72    "fts4(a, b, or
4700: 64 65 72 3d 44 45 53 43 2c 20 70 72 65 66 69 78  der=DESC, prefix
4710: 3d 5c 22 31 5c 22 29 22 20 20 20 20 20 20 20 20  =\"1\")"        
4720: 30 0a 20 20 36 20 20 20 20 22 66 74 73 34 28 61  0.  6    "fts4(a
4730: 2c 20 62 2c 20 6f 72 64 65 72 3d 41 53 43 2c 20  , b, order=ASC, 
4740: 20 70 72 65 66 69 78 3d 5c 22 31 2c 33 5c 22 29   prefix=\"1,3\")
4750: 22 20 20 20 20 20 20 30 0a 7d 20 7b 0a 0a 20 20  "      0.} {..  
4760: 65 78 65 63 73 71 6c 20 5b 73 75 62 73 74 20 7b  execsql [subst {
4770: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
4780: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
4790: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
47a0: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
47b0: 24 63 72 65 61 74 65 3b 0a 20 20 7d 5d 0a 0a 20  $create;.  }].. 
47c0: 20 69 66 20 7b 24 70 65 6e 64 69 6e 67 7d 20 7b   if {$pending} {
47d0: 65 78 65 63 73 71 6c 20 42 45 47 49 4e 7d 0a 0a  execsql BEGIN}..
47e0: 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62 7d 20    foreach {a b} 
47f0: 7b 0a 20 20 20 20 22 74 68 65 20 73 6f 6e 67 20  {.    "the song 
4800: 6f 66 20 73 6f 6e 67 73 20 77 68 69 63 68 20 69  of songs which i
4810: 73 20 73 6f 6c 6f 6d 6f 6e 73 22 0a 20 20 20 20  s solomons".    
4820: 22 6c 65 74 20 68 69 6d 20 6b 69 73 73 20 6d 65  "let him kiss me
4830: 20 77 69 74 68 20 74 68 65 20 6b 69 73 73 65 73   with the kisses
4840: 20 6f 66 20 68 69 73 20 6d 6f 75 74 68 20 66 6f   of his mouth fo
4850: 72 20 74 68 79 20 6c 6f 76 65 20 69 73 20 62 65  r thy love is be
4860: 74 74 65 72 20 74 68 61 6e 20 77 69 6e 65 22 0a  tter than wine".
4870: 20 20 20 20 22 62 65 63 61 75 73 65 20 6f 66 20      "because of 
4880: 74 68 65 20 73 61 76 6f 75 72 20 6f 66 20 74 68  the savour of th
4890: 79 20 67 6f 6f 64 20 6f 69 6e 74 6d 65 6e 74 73  y good ointments
48a0: 20 74 68 79 20 6e 61 6d 65 20 69 73 20 61 73 20   thy name is as 
48b0: 6f 69 6e 74 6d 65 6e 74 20 70 6f 75 72 65 64 20  ointment poured 
48c0: 66 6f 72 74 68 20 74 68 65 72 65 66 6f 72 65 20  forth therefore 
48d0: 64 6f 20 74 68 65 20 76 69 72 67 69 6e 73 20 6c  do the virgins l
48e0: 6f 76 65 20 74 68 65 65 22 0a 20 20 20 20 22 64  ove thee".    "d
48f0: 72 61 77 20 6d 65 20 77 65 20 77 69 6c 6c 20 72  raw me we will r
4900: 75 6e 20 61 66 74 65 72 20 74 68 65 65 20 74 68  un after thee th
4910: 65 20 6b 69 6e 67 20 68 61 74 68 20 62 72 6f 75  e king hath brou
4920: 67 68 74 20 6d 65 20 69 6e 74 6f 20 68 69 73 20  ght me into his 
4930: 63 68 61 6d 62 65 72 73 20 77 65 20 77 69 6c 6c  chambers we will
4940: 20 62 65 20 67 6c 61 64 20 61 6e 64 20 72 65 6a   be glad and rej
4950: 6f 69 63 65 20 69 6e 20 74 68 65 65 20 77 65 20  oice in thee we 
4960: 77 69 6c 6c 20 72 65 6d 65 6d 62 65 72 20 74 68  will remember th
4970: 79 20 6c 6f 76 65 20 6d 6f 72 65 20 74 68 61 6e  y love more than
4980: 20 77 69 6e 65 20 74 68 65 20 75 70 72 69 67 68   wine the uprigh
4990: 74 20 6c 6f 76 65 20 74 68 65 65 22 0a 20 20 20  t love thee".   
49a0: 20 22 69 20 61 6d 20 62 6c 61 63 6b 20 62 75 74   "i am black but
49b0: 20 63 6f 6d 65 6c 79 20 6f 20 79 65 20 64 61 75   comely o ye dau
49c0: 67 68 74 65 72 73 20 6f 66 20 6a 65 72 75 73 61  ghters of jerusa
49d0: 6c 65 6d 20 61 73 20 74 68 65 20 74 65 6e 74 73  lem as the tents
49e0: 20 6f 66 20 6b 65 64 61 72 20 61 73 20 74 68 65   of kedar as the
49f0: 20 63 75 72 74 61 69 6e 73 20 6f 66 20 73 6f 6c   curtains of sol
4a00: 6f 6d 6f 6e 22 0a 20 20 20 20 22 6c 6f 6f 6b 20  omon".    "look 
4a10: 6e 6f 74 20 75 70 6f 6e 20 6d 65 20 62 65 63 61  not upon me beca
4a20: 75 73 65 20 69 20 61 6d 20 62 6c 61 63 6b 20 62  use i am black b
4a30: 65 63 61 75 73 65 20 74 68 65 20 73 75 6e 20 68  ecause the sun h
4a40: 61 74 68 20 6c 6f 6f 6b 65 64 20 75 70 6f 6e 20  ath looked upon 
4a50: 6d 65 20 6d 79 20 6d 6f 74 68 65 72 73 20 63 68  me my mothers ch
4a60: 69 6c 64 72 65 6e 20 77 65 72 65 20 61 6e 67 72  ildren were angr
4a70: 79 20 77 69 74 68 20 6d 65 20 74 68 65 79 20 6d  y with me they m
4a80: 61 64 65 20 6d 65 20 74 68 65 20 6b 65 65 70 65  ade me the keepe
4a90: 72 20 6f 66 20 74 68 65 20 76 69 6e 65 79 61 72  r of the vineyar
4aa0: 64 73 20 62 75 74 20 6d 69 6e 65 20 6f 77 6e 20  ds but mine own 
4ab0: 76 69 6e 65 79 61 72 64 20 68 61 76 65 20 69 20  vineyard have i 
4ac0: 6e 6f 74 20 6b 65 70 74 22 0a 20 20 20 20 22 74  not kept".    "t
4ad0: 65 6c 6c 20 6d 65 20 6f 20 74 68 6f 75 20 77 68  ell me o thou wh
4ae0: 6f 6d 20 6d 79 20 73 6f 75 6c 20 6c 6f 76 65 74  om my soul lovet
4af0: 68 20 77 68 65 72 65 20 74 68 6f 75 20 66 65 65  h where thou fee
4b00: 64 65 73 74 20 77 68 65 72 65 20 74 68 6f 75 20  dest where thou 
4b10: 6d 61 6b 65 73 74 20 74 68 79 20 66 6c 6f 63 6b  makest thy flock
4b20: 20 74 6f 20 72 65 73 74 20 61 74 20 6e 6f 6f 6e   to rest at noon
4b30: 20 66 6f 72 20 77 68 79 20 73 68 6f 75 6c 64 20   for why should 
4b40: 69 20 62 65 20 61 73 20 6f 6e 65 20 74 68 61 74  i be as one that
4b50: 20 74 75 72 6e 65 74 68 20 61 73 69 64 65 20 62   turneth aside b
4b60: 79 20 74 68 65 20 66 6c 6f 63 6b 73 20 6f 66 20  y the flocks of 
4b70: 74 68 79 20 63 6f 6d 70 61 6e 69 6f 6e 73 3f 22  thy companions?"
4b80: 0a 20 20 20 20 22 69 66 20 74 68 6f 75 20 6b 6e  .    "if thou kn
4b90: 6f 77 20 6e 6f 74 20 6f 20 74 68 6f 75 20 66 61  ow not o thou fa
4ba0: 69 72 65 73 74 20 61 6d 6f 6e 67 20 77 6f 6d 65  irest among wome
4bb0: 6e 20 67 6f 20 74 68 79 20 77 61 79 20 66 6f 72  n go thy way for
4bc0: 74 68 20 62 79 20 74 68 65 20 66 6f 6f 74 73 74  th by the footst
4bd0: 65 70 73 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  eps of the flock
4be0: 20 61 6e 64 20 66 65 65 64 20 74 68 79 20 6b 69   and feed thy ki
4bf0: 64 73 20 62 65 73 69 64 65 20 74 68 65 20 73 68  ds beside the sh
4c00: 65 70 68 65 72 64 73 20 74 65 6e 74 73 22 0a 20  epherds tents". 
4c10: 20 20 20 22 69 20 68 61 76 65 20 63 6f 6d 70 61     "i have compa
4c20: 72 65 64 20 74 68 65 65 20 6f 20 6d 79 20 6c 6f  red thee o my lo
4c30: 76 65 20 74 6f 20 61 20 63 6f 6d 70 61 6e 79 20  ve to a company 
4c40: 6f 66 20 68 6f 72 73 65 73 20 69 6e 20 70 68 61  of horses in pha
4c50: 72 61 6f 68 73 20 63 68 61 72 69 6f 74 73 22 0a  raohs chariots".
4c60: 20 20 20 20 22 74 68 79 20 63 68 65 65 6b 73 20      "thy cheeks 
4c70: 61 72 65 20 63 6f 6d 65 6c 79 20 77 69 74 68 20  are comely with 
4c80: 72 6f 77 73 20 6f 66 20 6a 65 77 65 6c 73 20 74  rows of jewels t
4c90: 68 79 20 6e 65 63 6b 20 77 69 74 68 20 63 68 61  hy neck with cha
4ca0: 69 6e 73 20 6f 66 20 67 6f 6c 64 22 0a 20 20 20  ins of gold".   
4cb0: 20 22 77 65 20 77 69 6c 6c 20 6d 61 6b 65 20 74   "we will make t
4cc0: 68 65 65 20 62 6f 72 64 65 72 73 20 6f 66 20 67  hee borders of g
4cd0: 6f 6c 64 20 77 69 74 68 20 73 74 75 64 73 20 6f  old with studs o
4ce0: 66 20 73 69 6c 76 65 72 22 0a 20 20 20 20 22 77  f silver".    "w
4cf0: 68 69 6c 65 20 74 68 65 20 6b 69 6e 67 20 73 69  hile the king si
4d00: 74 74 65 74 68 20 61 74 20 68 69 73 20 74 61 62  tteth at his tab
4d10: 6c 65 20 6d 79 20 73 70 69 6b 65 6e 61 72 64 20  le my spikenard 
4d20: 73 65 6e 64 65 74 68 20 66 6f 72 74 68 20 74 68  sendeth forth th
4d30: 65 20 73 6d 65 6c 6c 20 74 68 65 72 65 6f 66 22  e smell thereof"
4d40: 0a 20 20 20 20 22 61 20 62 75 6e 64 6c 65 20 6f  .    "a bundle o
4d50: 66 20 6d 79 72 72 68 20 69 73 20 6d 79 20 77 65  f myrrh is my we
4d60: 6c 6c 62 65 6c 6f 76 65 64 20 75 6e 74 6f 20 6d  llbeloved unto m
4d70: 65 20 68 65 20 73 68 61 6c 6c 20 6c 69 65 20 61  e he shall lie a
4d80: 6c 6c 20 6e 69 67 68 74 20 62 65 74 77 69 78 74  ll night betwixt
4d90: 20 6d 79 20 62 72 65 61 73 74 73 22 0a 20 20 20   my breasts".   
4da0: 20 22 6d 79 20 62 65 6c 6f 76 65 64 20 69 73 20   "my beloved is 
4db0: 75 6e 74 6f 20 6d 65 20 61 73 20 61 20 63 6c 75  unto me as a clu
4dc0: 73 74 65 72 20 6f 66 20 63 61 6d 70 68 69 72 65  ster of camphire
4dd0: 20 69 6e 20 74 68 65 20 76 69 6e 65 79 61 72 64   in the vineyard
4de0: 73 20 6f 66 20 65 6e 20 67 65 64 69 22 0a 20 20  s of en gedi".  
4df0: 20 20 22 62 65 68 6f 6c 64 20 74 68 6f 75 20 61    "behold thou a
4e00: 72 74 20 66 61 69 72 20 6d 79 20 6c 6f 76 65 20  rt fair my love 
4e10: 62 65 68 6f 6c 64 20 74 68 6f 75 20 61 72 74 20  behold thou art 
4e20: 66 61 69 72 20 74 68 6f 75 20 68 61 73 74 20 64  fair thou hast d
4e30: 6f 76 65 73 20 65 79 65 73 22 0a 20 20 20 20 22  oves eyes".    "
4e40: 62 65 68 6f 6c 64 20 74 68 6f 75 20 61 72 74 20  behold thou art 
4e50: 66 61 69 72 20 6d 79 20 62 65 6c 6f 76 65 64 20  fair my beloved 
4e60: 79 65 61 20 70 6c 65 61 73 61 6e 74 20 61 6c 73  yea pleasant als
4e70: 6f 20 6f 75 72 20 62 65 64 20 69 73 20 67 72 65  o our bed is gre
4e80: 65 6e 22 0a 20 20 20 20 22 74 68 65 20 62 65 61  en".    "the bea
4e90: 6d 73 20 6f 66 20 6f 75 72 20 68 6f 75 73 65 20  ms of our house 
4ea0: 61 72 65 20 63 65 64 61 72 20 61 6e 64 20 6f 75  are cedar and ou
4eb0: 72 20 72 61 66 74 65 72 73 20 6f 66 20 66 69 72  r rafters of fir
4ec0: 22 0a 20 20 7d 20 7b 0a 20 20 20 20 65 78 65 63  ".  } {.    exec
4ed0: 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  sql {INSERT INTO
4ee0: 20 74 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53   t1(a, b) VALUES
4ef0: 28 24 61 2c 20 24 62 29 7d 0a 20 20 7d 0a 0a 0a  ($a, $b)}.  }...
4f00: 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74    do_fts3query_t
4f10: 65 73 74 20 35 2e 24 74 6e 2e 31 2e 31 20 74 31  est 5.$tn.1.1 t1
4f20: 20 7b 73 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71   {s*}.  do_fts3q
4f30: 75 65 72 79 5f 74 65 73 74 20 35 2e 24 74 6e 2e  uery_test 5.$tn.
4f40: 31 2e 32 20 74 31 20 7b 73 6f 2a 7d 0a 20 20 64  1.2 t1 {so*}.  d
4f50: 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74  o_fts3query_test
4f60: 20 35 2e 24 74 6e 2e 31 2e 33 20 74 31 20 7b 22   5.$tn.1.3 t1 {"
4f70: 73 2a 20 6f 2a 22 7d 0a 20 20 64 6f 5f 66 74 73  s* o*"}.  do_fts
4f80: 33 71 75 65 72 79 5f 74 65 73 74 20 35 2e 24 74  3query_test 5.$t
4f90: 6e 2e 31 2e 34 20 74 31 20 7b 62 2a 20 4e 45 41  n.1.4 t1 {b* NEA
4fa0: 52 2f 33 20 61 2a 7d 0a 20 20 64 6f 5f 66 74 73  R/3 a*}.  do_fts
4fb0: 33 71 75 65 72 79 5f 74 65 73 74 20 35 2e 24 74  3query_test 5.$t
4fc0: 6e 2e 31 2e 35 20 74 31 20 7b 61 2a 7d 0a 20 20  n.1.5 t1 {a*}.  
4fd0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
4fe0: 74 20 35 2e 24 74 6e 2e 31 2e 36 20 74 31 20 7b  t 5.$tn.1.6 t1 {
4ff0: 74 68 2a 20 4e 45 41 52 2f 35 20 61 2a 20 4e 45  th* NEAR/5 a* NE
5000: 41 52 2f 35 20 77 2a 7d 0a 20 20 64 6f 5f 66 74  AR/5 w*}.  do_ft
5010: 73 33 71 75 65 72 79 5f 74 65 73 74 20 35 2e 24  s3query_test 5.$
5020: 74 6e 2e 31 2e 37 20 74 31 20 7b 22 62 2a 20 74  tn.1.7 t1 {"b* t
5030: 68 2a 20 61 72 74 2a 20 66 61 69 72 2a 22 7d 0a  h* art* fair*"}.
5040: 0a 20 20 69 66 20 7b 24 70 65 6e 64 69 6e 67 7d  .  if {$pending}
5050: 20 7b 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54   {execsql COMMIT
5060: 7d 0a 7d 0a 65 76 61 6c 20 66 74 73 33 5f 63 6f  }.}.eval fts3_co
5070: 6e 66 69 67 75 72 65 5f 69 6e 63 72 5f 6c 6f 61  nfigure_incr_loa
5080: 64 20 24 63 68 75 6e 6b 63 6f 6e 66 69 67 0a 0a  d $chunkconfig..
5090: 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 65 6e 64  foreach {tn pend
50a0: 69 6e 67 20 63 72 65 61 74 65 7d 20 7b 0a 20 20  ing create} {.  
50b0: 31 20 20 20 20 30 20 22 66 74 73 34 28 61 2c 20  1    0 "fts4(a, 
50c0: 62 2c 20 63 2c 20 64 29 22 0a 20 20 32 20 20 20  b, c, d)".  2   
50d0: 20 31 20 22 66 74 73 34 28 61 2c 20 62 2c 20 63   1 "fts4(a, b, c
50e0: 2c 20 64 29 22 0a 20 20 33 20 20 20 20 30 20 22  , d)".  3    0 "
50f0: 66 74 73 34 28 61 2c 20 62 2c 20 63 2c 20 64 2c  fts4(a, b, c, d,
5100: 20 6f 72 64 65 72 3d 44 45 53 43 29 22 0a 20 20   order=DESC)".  
5110: 34 20 20 20 20 31 20 22 66 74 73 34 28 61 2c 20  4    1 "fts4(a, 
5120: 62 2c 20 63 2c 20 64 2c 20 6f 72 64 65 72 3d 44  b, c, d, order=D
5130: 45 53 43 29 22 0a 7d 20 7b 0a 20 20 65 78 65 63  ESC)".} {.  exec
5140: 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a 20 20 20  sql [subst {.   
5150: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
5160: 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20 43 52  XISTS t1;.    CR
5170: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
5180: 4c 45 20 74 31 20 55 53 49 4e 47 20 24 63 72 65  LE t1 USING $cre
5190: 61 74 65 3b 0a 20 20 7d 5d 0a 0a 0a 20 20 69 66  ate;.  }]...  if
51a0: 20 7b 24 70 65 6e 64 69 6e 67 7d 20 7b 20 65 78   {$pending} { ex
51b0: 65 63 73 71 6c 20 42 45 47 49 4e 20 7d 0a 0a 20  ecsql BEGIN }.. 
51c0: 20 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 20   foreach {a b c 
51d0: 64 7d 20 7b 0a 20 20 20 20 22 41 20 42 20 43 22  d} {.    "A B C"
51e0: 20 22 44 20 45 20 46 22 20 22 47 20 48 20 49 22   "D E F" "G H I"
51f0: 20 22 4a 20 4b 20 4c 22 0a 20 20 20 20 22 42 20   "J K L".    "B 
5200: 43 20 44 22 20 22 45 20 46 20 47 22 20 22 48 20  C D" "E F G" "H 
5210: 49 20 4a 22 20 22 4b 20 4c 20 41 22 0a 20 20 20  I J" "K L A".   
5220: 20 22 43 20 44 20 45 22 20 22 46 20 47 20 48 22   "C D E" "F G H"
5230: 20 22 49 20 4a 20 4b 22 20 22 4c 20 41 20 42 22   "I J K" "L A B"
5240: 0a 20 20 20 20 22 44 20 45 20 46 22 20 22 47 20  .    "D E F" "G 
5250: 48 20 49 22 20 22 4a 20 4b 20 4c 22 20 22 41 20  H I" "J K L" "A 
5260: 42 20 43 22 0a 20 20 20 20 22 45 20 46 20 47 22  B C".    "E F G"
5270: 20 22 48 20 49 20 4a 22 20 22 4b 20 4c 20 41 22   "H I J" "K L A"
5280: 20 22 42 20 43 20 44 22 0a 20 20 20 20 22 46 20   "B C D".    "F 
5290: 47 20 48 22 20 22 49 20 4a 20 4b 22 20 22 4c 20  G H" "I J K" "L 
52a0: 41 20 42 22 20 22 43 20 44 20 45 22 0a 20 20 7d  A B" "C D E".  }
52b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
52c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
52d0: 56 41 4c 55 45 53 28 24 61 2c 20 24 62 2c 20 24  VALUES($a, $b, $
52e0: 63 2c 20 24 64 29 20 7d 0a 20 20 7d 0a 0a 20 20  c, $d) }.  }..  
52f0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
5300: 74 20 36 2e 24 74 6e 2e 31 20 74 31 20 7b 62 3a  t 6.$tn.1 t1 {b:
5310: 47 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  G}.  do_fts3quer
5320: 79 5f 74 65 73 74 20 36 2e 24 74 6e 2e 32 20 74  y_test 6.$tn.2 t
5330: 31 20 7b 62 3a 47 20 41 4e 44 20 63 3a 49 7d 0a  1 {b:G AND c:I}.
5340: 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74    do_fts3query_t
5350: 65 73 74 20 36 2e 24 74 6e 2e 33 20 74 31 20 7b  est 6.$tn.3 t1 {
5360: 62 3a 47 20 4e 45 41 52 20 63 3a 49 7d 0a 20 20  b:G NEAR c:I}.  
5370: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
5380: 74 20 36 2e 24 74 6e 2e 34 20 74 31 20 7b 61 3a  t 6.$tn.4 t1 {a:
5390: 43 20 4f 52 20 62 3a 47 20 4f 52 20 63 3a 4b 20  C OR b:G OR c:K 
53a0: 4f 52 20 64 3a 43 7d 0a 0a 20 20 64 6f 5f 66 74  OR d:C}..  do_ft
53b0: 73 33 71 75 65 72 79 5f 74 65 73 74 20 36 2e 24  s3query_test 6.$
53c0: 74 6e 2e 35 20 74 31 20 7b 61 3a 47 20 4f 52 20  tn.5 t1 {a:G OR 
53d0: 62 3a 47 7d 0a 0a 20 20 63 61 74 63 68 73 71 6c  b:G}..  catchsql
53e0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 0a 0a 66   { COMMIT }.}..f
53f0: 6f 72 65 61 63 68 20 7b 74 6e 20 63 72 65 61 74  oreach {tn creat
5400: 65 7d 20 7b 0a 20 20 31 20 20 20 20 22 66 74 73  e} {.  1    "fts
5410: 34 28 78 29 22 0a 20 20 32 20 20 20 20 22 66 74  4(x)".  2    "ft
5420: 73 34 28 78 2c 20 6f 72 64 65 72 3d 44 45 53 43  s4(x, order=DESC
5430: 29 22 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c  )".} {.  execsql
5440: 20 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 44 52   [subst {.    DR
5450: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
5460: 54 53 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54  TS t1;.    CREAT
5470: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
5480: 74 31 20 55 53 49 4e 47 20 24 63 72 65 61 74 65  t1 USING $create
5490: 3b 0a 20 20 7d 5d 0a 0a 20 20 66 6f 72 65 61 63  ;.  }]..  foreac
54a0: 68 20 7b 78 7d 20 7b 0a 20 20 20 20 22 46 20 45  h {x} {.    "F E
54b0: 20 4e 20 4f 20 54 20 4b 20 58 20 56 20 41 20 58   N O T K X V A X
54c0: 20 49 20 45 20 58 20 41 20 50 20 47 20 51 20 56   I E X A P G Q V
54d0: 20 48 20 55 22 0a 20 20 20 20 22 52 20 56 20 41   H U".    "R V A
54e0: 20 45 20 54 20 43 20 56 20 51 20 4e 20 49 20 45   E T C V Q N I E
54f0: 20 4c 20 4f 20 4e 20 55 20 47 20 4a 20 4b 20 4c   L O N U G J K L
5500: 20 55 22 0a 20 20 20 20 22 55 20 59 20 49 20 47   U".    "U Y I G
5510: 20 57 20 4d 20 56 20 46 20 4a 20 4c 20 58 20 49   W M V F J L X I
5520: 20 44 20 43 20 48 20 46 20 50 20 4a 20 51 20 42   D C H F P J Q B
5530: 22 0a 20 20 20 20 22 53 20 47 20 44 20 5a 20 58  ".    "S G D Z X
5540: 20 52 20 50 20 47 20 53 20 53 20 59 20 42 20 4b   R P G S S Y B K
5550: 20 41 20 53 20 47 20 41 20 49 20 4c 20 4c 22 0a   A S G A I L L".
5560: 20 20 20 20 22 4c 20 53 20 49 20 43 20 48 20 54      "L S I C H T
5570: 20 5a 20 53 20 52 20 51 20 50 20 52 20 4e 20 4b   Z S R Q P R N K
5580: 20 4a 20 58 20 4c 20 46 20 4d 20 4a 22 0a 20 20   J X L F M J".  
5590: 20 20 22 43 20 43 20 43 20 44 20 50 20 58 20 42    "C C C D P X B
55a0: 20 5a 20 43 20 4d 20 41 20 44 20 41 20 43 20 58   Z C M A D A C X
55b0: 20 53 20 42 20 54 20 58 20 56 22 0a 20 20 20 20   S B T X V".    
55c0: 22 57 20 59 20 4a 20 4d 20 44 20 52 20 47 20 56  "W Y J M D R G V
55d0: 20 52 20 4b 20 42 20 58 20 53 20 41 20 57 20 52   R K B X S A W R
55e0: 20 49 20 54 20 4e 20 43 22 0a 20 20 20 20 22 50   I T N C".    "P
55f0: 20 4b 20 4c 20 57 20 54 20 4d 20 53 20 50 20 4f   K L W T M S P O
5600: 20 59 20 59 20 56 20 56 20 4f 20 45 20 48 20 51   Y Y V V O E H Q
5610: 20 41 20 49 20 52 22 0a 20 20 20 20 22 43 20 44   A I R".    "C D
5620: 20 59 20 49 20 43 20 5a 20 46 20 48 20 4a 20 43   Y I C Z F H J C
5630: 20 4f 20 59 20 41 20 51 20 46 20 4c 20 53 20 42   O Y A Q F L S B
5640: 20 44 20 4b 22 0a 20 20 20 20 22 50 20 47 20 53   D K".    "P G S
5650: 20 43 20 59 20 43 20 59 20 56 20 49 20 4d 20 42   C Y C Y V I M B
5660: 20 44 20 53 20 5a 20 44 20 44 20 59 20 57 20 49   D S Z D D Y W I
5670: 20 45 22 0a 20 20 20 20 22 5a 20 4b 20 5a 20 55   E".    "Z K Z U
5680: 20 45 20 45 20 53 20 46 20 59 20 58 20 54 20 55   E E S F Y X T U
5690: 20 41 20 4c 20 57 20 4f 20 55 20 4a 20 43 20 51   A L W O U J C Q
56a0: 22 0a 20 20 20 20 22 50 20 41 20 54 20 5a 20 53  ".    "P A T Z S
56b0: 20 57 20 4c 20 50 20 4c 20 51 20 56 20 59 20 59   W L P L Q V Y Y
56c0: 20 49 20 50 20 57 20 55 20 58 20 53 20 53 22 0a   I P W U X S S".
56d0: 20 20 20 20 22 49 20 55 20 49 20 48 20 55 20 4f      "I U I H U O
56e0: 20 46 20 5a 20 46 20 52 20 48 20 52 20 46 20 54   F Z F R H R F T
56f0: 20 4e 20 44 20 58 20 41 20 47 20 4d 22 0a 20 20   N D X A G M".  
5700: 20 20 22 4e 20 41 20 42 20 4d 20 53 20 48 20 4b    "N A B M S H K
5710: 20 58 20 53 20 4f 20 59 20 44 20 54 20 58 20 53   X S O Y D T X S
5720: 20 42 20 52 20 59 20 48 20 5a 22 0a 20 20 20 20   B R Y H Z".    
5730: 22 4c 20 55 20 44 20 41 20 53 20 4b 20 49 20 4c  "L U D A S K I L
5740: 20 53 20 56 20 5a 20 4a 20 50 20 55 20 42 20 45   S V Z J P U B E
5750: 20 42 20 59 20 48 20 4d 22 0a 20 20 7d 20 7b 0a   B Y H M".  } {.
5760: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
5770: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5780: 55 45 53 28 24 78 29 20 7d 0a 20 20 7d 0a 0a 20  UES($x) }.  }.. 
5790: 20 23 20 41 64 64 20 65 78 74 72 61 20 64 6f 63   # Add extra doc
57a0: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 64 61  uments to the da
57b0: 74 61 62 61 73 65 20 73 75 63 68 20 74 68 61 74  tabase such that
57c0: 20 74 6f 6b 65 6e 20 22 42 22 20 77 69 6c 6c 20   token "B" will 
57d0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20  be considered.  
57e0: 23 20 64 65 66 65 72 72 61 62 6c 65 20 69 66 20  # deferrable if 
57f0: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
5800: 6f 74 68 65 72 20 74 6f 6b 65 6e 73 20 6d 65 61  other tokens mea
5810: 6e 73 20 74 68 61 74 20 32 20 6f 72 20 66 65 77  ns that 2 or few
5820: 65 72 20 64 6f 63 75 6d 65 6e 74 73 0a 20 20 23  er documents.  #
5830: 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64 20   will be loaded 
5840: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 20 20 23  into memory..  #
5850: 0a 20 20 66 74 73 33 5f 6d 61 6b 65 5f 64 65 66  .  fts3_make_def
5860: 65 72 72 61 62 6c 65 20 74 31 20 42 20 32 0a 0a  errable t1 B 2..
5870: 20 20 23 20 42 20 69 73 20 6e 6f 74 20 64 65 66    # B is not def
5880: 65 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  erred in either 
5890: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  of the first two
58a0: 20 74 65 73 74 73 20 62 65 6c 6f 77 2c 20 73 69   tests below, si
58b0: 6e 63 65 20 66 69 6c 74 65 72 69 6e 67 0a 20 20  nce filtering.  
58c0: 23 20 6f 6e 20 22 4d 22 20 6f 72 20 22 44 22 20  # on "M" or "D" 
58d0: 72 65 74 75 72 6e 73 20 31 30 20 64 6f 63 75 6d  returns 10 docum
58e0: 65 6e 74 73 20 6f 72 20 73 6f 2e 20 42 75 74 20  ents or so. But 
58f0: 66 69 6c 74 65 72 69 6e 67 20 6f 6e 20 22 4d 20  filtering on "M 
5900: 2a 20 44 22 20 6f 6e 6c 79 0a 20 20 23 20 72 65  * D" only.  # re
5910: 74 75 72 6e 73 20 32 2c 20 73 6f 20 42 20 69 73  turns 2, so B is
5920: 20 64 65 66 65 72 72 65 64 20 69 6e 20 74 68 69   deferred in thi
5930: 73 20 63 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f  s case..  #.  do
5940: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
5950: 37 2e 24 74 6e 2e 31 20 20 20 20 20 20 20 20 20  7.$tn.1         
5960: 20 20 20 20 74 31 20 7b 22 4d 20 42 22 7d 0a 20      t1 {"M B"}. 
5970: 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65   do_fts3query_te
5980: 73 74 20 37 2e 24 74 6e 2e 32 20 20 20 20 20 20  st 7.$tn.2      
5990: 20 20 20 20 20 20 20 74 31 20 7b 22 42 20 44 22         t1 {"B D"
59a0: 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79  }.  do_fts3query
59b0: 5f 74 65 73 74 20 37 2e 24 74 6e 2e 33 20 2d 64  _test 7.$tn.3 -d
59c0: 65 66 65 72 72 65 64 20 42 20 74 31 20 7b 22 4d  eferred B t1 {"M
59d0: 20 42 20 44 22 7d 0a 7d 0a 0a 73 65 74 20 73 71   B D"}.}..set sq
59e0: 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65  lite_fts3_enable
59f0: 5f 70 61 72 65 6e 74 68 65 73 65 73 20 24 73 66  _parentheses $sf
5a00: 65 70 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ep.finish_test.