/ Hex Artifact Content
Login

Artifact a98cc895bd92df14ce4a6e94f5c68d33edcc1372:


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 73 65 74 20 64 65 66  .        set def
0920: 65 72 72 65 64 20 24 76 0a 20 20 20 20 20 20 7d  erred $v.      }
0930: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b  .      default {
0940: 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22  .        error "
0950: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 24 6b 5c  bad option \"$k\
0960: 22 3a 20 6d 75 73 74 20 62 65 20 2d 64 65 66 65  ": must be -defe
0970: 72 72 65 64 22 0a 20 20 20 20 20 20 7d 0a 20 20  rred".      }.  
0980: 20 20 7d 0a 20 20 7d 0a 0a 20 20 67 65 74 5f 6e    }.  }..  get_n
0990: 65 61 72 5f 72 65 73 75 6c 74 73 20 24 74 62 6c  ear_results $tbl
09a0: 20 24 6d 61 74 63 68 20 24 64 65 66 65 72 72 65   $match $deferre
09b0: 64 20 61 4d 61 74 63 68 69 6e 66 6f 0a 0a 20 20  d aMatchinfo..  
09c0: 73 65 74 20 6d 61 74 63 68 69 6e 66 6f 5f 61 73  set matchinfo_as
09d0: 63 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  c [list].  forea
09e0: 63 68 20 64 6f 63 69 64 20 5b 6c 73 6f 72 74 20  ch docid [lsort 
09f0: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 20 5b  -integer -incr [
0a00: 61 72 72 61 79 20 6e 61 6d 65 73 20 61 4d 61 74  array names aMat
0a10: 63 68 69 6e 66 6f 5d 5d 20 7b 0a 20 20 20 20 6c  chinfo]] {.    l
0a20: 61 70 70 65 6e 64 20 6d 61 74 63 68 69 6e 66 6f  append matchinfo
0a30: 5f 61 73 63 20 24 64 6f 63 69 64 20 24 61 4d 61  _asc $docid $aMa
0a40: 74 63 68 69 6e 66 6f 28 24 64 6f 63 69 64 29 0a  tchinfo($docid).
0a50: 20 20 7d 0a 20 20 73 65 74 20 6d 61 74 63 68 69    }.  set matchi
0a60: 6e 66 6f 5f 64 65 73 63 20 5b 6c 69 73 74 5d 0a  nfo_desc [list].
0a70: 20 20 66 6f 72 65 61 63 68 20 64 6f 63 69 64 20    foreach docid 
0a80: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20  [lsort -integer 
0a90: 2d 64 65 63 72 20 5b 61 72 72 61 79 20 6e 61 6d  -decr [array nam
0aa0: 65 73 20 61 4d 61 74 63 68 69 6e 66 6f 5d 5d 20  es aMatchinfo]] 
0ab0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 61  {.    lappend ma
0ac0: 74 63 68 69 6e 66 6f 5f 64 65 73 63 20 24 64 6f  tchinfo_desc $do
0ad0: 63 69 64 20 24 61 4d 61 74 63 68 69 6e 66 6f 28  cid $aMatchinfo(
0ae0: 24 64 6f 63 69 64 29 0a 20 20 7d 0a 0a 20 20 73  $docid).  }..  s
0af0: 65 74 20 74 69 74 6c 65 20 22 28 5c 22 24 6d 61  et title "(\"$ma
0b00: 74 63 68 5c 22 20 2d 3e 20 5b 6c 6c 65 6e 67 74  tch\" -> [llengt
0b10: 68 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61  h [array names a
0b20: 4d 61 74 63 68 69 6e 66 6f 5d 5d 20 72 6f 77 73  Matchinfo]] rows
0b30: 29 22 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  )"..  do_execsql
0b40: 5f 74 65 73 74 20 24 74 6e 24 74 69 74 6c 65 2e  _test $tn$title.
0b50: 31 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20 64  1 ".    SELECT d
0b60: 6f 63 69 64 20 46 52 4f 4d 20 24 74 62 6c 20 57  ocid FROM $tbl W
0b70: 48 45 52 45 20 24 74 62 6c 20 4d 41 54 43 48 20  HERE $tbl MATCH 
0b80: 27 24 6d 61 74 63 68 27 20 4f 52 44 45 52 20 42  '$match' ORDER B
0b90: 59 20 64 6f 63 69 64 20 41 53 43 0a 20 20 22 20  Y docid ASC.  " 
0ba0: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20  [lsort -integer 
0bb0: 2d 69 6e 63 72 20 5b 61 72 72 61 79 20 6e 61 6d  -incr [array nam
0bc0: 65 73 20 61 4d 61 74 63 68 69 6e 66 6f 5d 5d 20  es aMatchinfo]] 
0bd0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
0be0: 65 73 74 20 24 74 6e 24 74 69 74 6c 65 2e 32 20  est $tn$title.2 
0bf0: 22 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  ".    SELECT doc
0c00: 69 64 20 46 52 4f 4d 20 24 74 62 6c 20 57 48 45  id FROM $tbl WHE
0c10: 52 45 20 24 74 62 6c 20 4d 41 54 43 48 20 27 24  RE $tbl MATCH '$
0c20: 6d 61 74 63 68 27 20 4f 52 44 45 52 20 42 59 20  match' ORDER BY 
0c30: 64 6f 63 69 64 20 44 45 53 43 0a 20 20 22 20 5b  docid DESC.  " [
0c40: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d  lsort -integer -
0c50: 64 65 63 72 20 5b 61 72 72 61 79 20 6e 61 6d 65  decr [array name
0c60: 73 20 61 4d 61 74 63 68 69 6e 66 6f 5d 5d 20 0a  s aMatchinfo]] .
0c70: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0c80: 73 74 20 24 74 6e 24 74 69 74 6c 65 2e 33 20 22  st $tn$title.3 "
0c90: 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69  .    SELECT doci
0ca0: 64 2c 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f  d, mit(matchinfo
0cb0: 28 24 74 62 6c 2c 20 27 78 27 29 29 20 46 52 4f  ($tbl, 'x')) FRO
0cc0: 4d 20 24 74 62 6c 20 0a 20 20 20 20 57 48 45 52  M $tbl .    WHER
0cd0: 45 20 24 74 62 6c 20 4d 41 54 43 48 20 27 24 6d  E $tbl MATCH '$m
0ce0: 61 74 63 68 27 20 4f 52 44 45 52 20 42 59 20 64  atch' ORDER BY d
0cf0: 6f 63 69 64 20 44 45 53 43 0a 20 20 22 20 24 6d  ocid DESC.  " $m
0d00: 61 74 63 68 69 6e 66 6f 5f 64 65 73 63 0a 0a 20  atchinfo_desc.. 
0d10: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0d20: 20 24 74 6e 24 74 69 74 6c 65 2e 34 20 22 0a 20   $tn$title.4 ". 
0d30: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c     SELECT docid,
0d40: 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f 28 24   mit(matchinfo($
0d50: 74 62 6c 2c 20 27 78 27 29 29 20 46 52 4f 4d 20  tbl, 'x')) FROM 
0d60: 24 74 62 6c 20 0a 20 20 20 20 57 48 45 52 45 20  $tbl .    WHERE 
0d70: 24 74 62 6c 20 4d 41 54 43 48 20 27 24 6d 61 74  $tbl MATCH '$mat
0d80: 63 68 27 20 4f 52 44 45 52 20 42 59 20 64 6f 63  ch' ORDER BY doc
0d90: 69 64 20 41 53 43 0a 20 20 22 20 24 6d 61 74 63  id ASC.  " $matc
0da0: 68 69 6e 66 6f 5f 61 73 63 0a 7d 0a 0a 23 20 20  hinfo_asc.}..#  
0db0: 20 20 66 74 73 33 5f 6d 61 6b 65 5f 64 65 66 65    fts3_make_defe
0dc0: 72 72 61 62 6c 65 20 54 41 42 4c 45 20 54 4f 4b  rrable TABLE TOK
0dd0: 45 4e 0a 23 0a 70 72 6f 63 20 66 74 73 33 5f 6d  EN.#.proc fts3_m
0de0: 61 6b 65 5f 64 65 66 65 72 72 61 62 6c 65 20 7b  ake_deferrable {
0df0: 74 62 6c 20 74 6f 6b 65 6e 7d 20 7b 0a 0a 20 20  tbl token} {..  
0e00: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
0e10: 33 5f 70 72 65 70 61 72 65 20 64 62 20 22 53 45  3_prepare db "SE
0e20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 24 74 62 6c  LECT * FROM $tbl
0e30: 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 65  " -1 dummy].  se
0e40: 74 20 6e 61 6d 65 20 5b 73 71 6c 69 74 65 33 5f  t name [sqlite3_
0e50: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 24 73 74 6d  column_name $stm
0e60: 74 20 30 5d 0a 20 20 73 71 6c 69 74 65 33 5f 66  t 0].  sqlite3_f
0e70: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 0a 0a 20  inalize $stmt.. 
0e80: 20 73 65 74 20 6e 52 6f 77 20 5b 64 62 20 6f 6e   set nRow [db on
0e90: 65 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  e "SELECT count(
0ea0: 2a 29 20 46 52 4f 4d 20 24 74 62 6c 22 5d 0a 20  *) FROM $tbl"]. 
0eb0: 20 73 65 74 20 70 67 73 7a 20 5b 64 62 20 6f 6e   set pgsz [db on
0ec0: 65 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  e "PRAGMA page_s
0ed0: 69 7a 65 22 5d 0a 20 20 65 78 65 63 73 71 6c 20  ize"].  execsql 
0ee0: 42 45 47 49 4e 0a 20 20 66 6f 72 20 7b 73 65 74  BEGIN.  for {set
0ef0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 28 24 6e 52   i 0} {$i < ($nR
0f00: 6f 77 20 2a 20 24 70 67 73 7a 20 2a 20 31 2e 32  ow * $pgsz * 1.2
0f10: 29 2f 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20  )/100} {incr i} 
0f20: 7b 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 73  {.    set doc [s
0f30: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24 74  tring repeat "$t
0f40: 6f 6b 65 6e 20 22 20 31 30 30 5d 0a 20 20 20 20  oken " 100].    
0f50: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
0f60: 49 4e 54 4f 20 24 74 62 6c 20 28 24 6e 61 6d 65  INTO $tbl ($name
0f70: 29 20 56 41 4c 55 45 53 28 5c 24 64 6f 63 29 22  ) VALUES(\$doc)"
0f80: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 22  .  }.  execsql "
0f90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74 62 6c  INSERT INTO $tbl
0fa0: 20 28 24 6e 61 6d 65 29 20 56 41 4c 55 45 53 28   ($name) VALUES(
0fb0: 27 61 61 61 61 61 61 61 20 24 7b 74 6f 6b 65 6e  'aaaaaaa ${token
0fc0: 7d 61 61 61 61 61 27 29 22 0a 20 20 65 78 65 63  }aaaaa')".  exec
0fd0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 0a 20 20 72 65  sql COMMIT..  re
0fe0: 74 75 72 6e 20 5b 65 78 70 72 20 24 6e 52 6f 77  turn [expr $nRow
0ff0: 2a 24 70 67 73 7a 5d 0a 7d 0a 0a 23 20 20 20 20  *$pgsz].}..#    
1000: 66 74 73 33 5f 7a 65 72 6f 5f 6c 6f 6e 67 5f 73  fts3_zero_long_s
1010: 65 67 6d 65 6e 74 73 20 54 41 42 4c 45 20 3f 4c  egments TABLE ?L
1020: 49 4d 49 54 3f 0a 23 0a 70 72 6f 63 20 66 74 73  IMIT?.#.proc fts
1030: 33 5f 7a 65 72 6f 5f 6c 6f 6e 67 5f 73 65 67 6d  3_zero_long_segm
1040: 65 6e 74 73 20 7b 74 62 6c 20 6c 69 6d 69 74 7d  ents {tbl limit}
1050: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 20 0a   {.  execsql " .
1060: 20 20 20 20 55 50 44 41 54 45 20 24 7b 74 62 6c      UPDATE ${tbl
1070: 7d 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 20 20  }_segments .    
1080: 53 45 54 20 62 6c 6f 63 6b 20 3d 20 7a 65 72 6f  SET block = zero
1090: 62 6c 6f 62 28 6c 65 6e 67 74 68 28 62 6c 6f 63  blob(length(bloc
10a0: 6b 29 29 20 0a 20 20 20 20 57 48 45 52 45 20 6c  k)) .    WHERE l
10b0: 65 6e 67 74 68 28 62 6c 6f 63 6b 29 3e 24 6c 69  ength(block)>$li
10c0: 6d 69 74 0a 20 20 22 0a 20 20 72 65 74 75 72 6e  mit.  ".  return
10d0: 20 5b 64 62 20 63 68 61 6e 67 65 73 5d 0a 7d 0a   [db changes].}.
10e0: 0a 0a 70 72 6f 63 20 6d 69 74 20 7b 62 6c 6f 62  ..proc mit {blob
10f0: 7d 20 7b 0a 20 20 73 65 74 20 73 63 61 6e 28 6c  } {.  set scan(l
1100: 69 74 74 6c 65 45 6e 64 69 61 6e 29 20 69 2a 0a  ittleEndian) i*.
1110: 20 20 73 65 74 20 73 63 61 6e 28 62 69 67 45 6e    set scan(bigEn
1120: 64 69 61 6e 29 20 49 2a 0a 20 20 62 69 6e 61 72  dian) I*.  binar
1130: 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63  y scan $blob $sc
1140: 61 6e 28 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  an($::tcl_platfo
1150: 72 6d 28 62 79 74 65 4f 72 64 65 72 29 29 20 72  rm(byteOrder)) r
1160: 0a 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 64  .  return $r.}.d
1170: 62 20 66 75 6e 63 20 6d 69 74 20 6d 69 74 0a 0a  b func mit mit..
1180: 70 72 6f 63 20 66 69 78 5f 6e 65 61 72 5f 65 78  proc fix_near_ex
1190: 70 72 20 7b 65 78 70 72 7d 20 7b 20 0a 20 20 73  pr {expr} { .  s
11a0: 65 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20  et out [list].  
11b0: 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b 6c 69 6e  lappend out [lin
11c0: 64 65 78 20 24 65 78 70 72 20 30 5d 0a 20 20 66  dex $expr 0].  f
11d0: 6f 72 65 61 63 68 20 7b 61 20 62 7d 20 5b 6c 72  oreach {a b} [lr
11e0: 61 6e 67 65 20 24 65 78 70 72 20 31 20 65 6e 64  ange $expr 1 end
11f0: 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  ] {.    if {[str
1200: 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73  ing match -nocas
1210: 65 20 6e 65 61 72 20 24 61 5d 7d 20 20 20 7b 20  e near $a]}   { 
1220: 73 65 74 20 61 20 31 30 20 7d 0a 20 20 20 20 69  set a 10 }.    i
1230: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1240: 20 2d 6e 6f 63 61 73 65 20 6e 65 61 72 2f 2a 20   -nocase near/* 
1250: 24 61 5d 7d 20 7b 20 73 65 74 20 61 20 5b 73 74  $a]} { set a [st
1260: 72 69 6e 67 20 72 61 6e 67 65 20 24 61 20 35 20  ring range $a 5 
1270: 65 6e 64 5d 20 7d 0a 20 20 20 20 6c 61 70 70 65  end] }.    lappe
1280: 6e 64 20 6f 75 74 20 24 61 0a 20 20 20 20 6c 61  nd out $a.    la
1290: 70 70 65 6e 64 20 6f 75 74 20 24 62 0a 20 20 7d  ppend out $b.  }
12a0: 0a 20 20 72 65 74 75 72 6e 20 24 6f 75 74 0a 7d  .  return $out.}
12b0: 0a 0a 70 72 6f 63 20 67 65 74 5f 73 69 6e 67 6c  ..proc get_singl
12c0: 65 5f 6e 65 61 72 5f 72 65 73 75 6c 74 73 20 7b  e_near_results {
12d0: 74 62 6c 20 65 78 70 72 20 64 65 66 65 72 72 65  tbl expr deferre
12e0: 64 20 61 72 72 61 79 76 61 72 20 6e 75 6c 6c 76  d arrayvar nullv
12f0: 61 72 7d 20 7b 0a 20 20 75 70 76 61 72 20 24 61  ar} {.  upvar $a
1300: 72 72 61 79 76 61 72 20 61 4d 61 74 63 68 69 6e  rrayvar aMatchin
1310: 66 6f 0a 20 20 75 70 76 61 72 20 24 6e 75 6c 6c  fo.  upvar $null
1320: 76 61 72 20 6e 75 6c 6c 65 6e 74 72 79 0a 20 20  var nullentry.  
1330: 63 61 74 63 68 20 7b 61 72 72 61 79 20 75 6e 73  catch {array uns
1340: 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 7d 0a 0a  et aMatchinfo}..
1350: 20 20 73 65 74 20 65 78 70 72 20 5b 66 69 78 5f    set expr [fix_
1360: 6e 65 61 72 5f 65 78 70 72 20 24 65 78 70 72 5d  near_expr $expr]
1370: 0a 0a 20 20 23 20 43 61 6c 63 75 6c 61 74 65 20  ..  # Calculate 
1380: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 73  the expected res
1390: 75 6c 74 73 20 75 73 69 6e 67 20 5b 66 74 73 33  ults using [fts3
13a0: 5f 6e 65 61 72 5f 6d 61 74 63 68 5d 2e 20 54 68  _near_match]. Th
13b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 23 20  e following.  # 
13c0: 6c 6f 6f 70 20 70 6f 70 75 6c 61 74 65 73 20 74  loop populates t
13d0: 68 65 20 22 68 69 74 73 22 20 61 6e 64 20 22 63  he "hits" and "c
13e0: 6f 75 6e 74 73 22 20 61 72 72 61 79 73 20 61 73  ounts" arrays as
13f0: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 23 20 0a 20   follows:.  # . 
1400: 20 23 20 20 20 31 2e 20 46 6f 72 20 65 61 63 68   #   1. For each
1410: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68 65   document in the
1420: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
1430: 68 65 73 20 74 68 65 20 4e 45 41 52 20 65 78 70  hes the NEAR exp
1440: 72 65 73 73 69 6f 6e 2c 0a 20 20 23 20 20 20 20  ression,.  #    
1450: 20 20 68 69 74 73 28 24 64 6f 63 69 64 29 20 69    hits($docid) i
1460: 73 20 73 65 74 20 74 6f 20 31 2e 20 54 68 65 20  s set to 1. The 
1470: 73 65 74 20 6f 66 20 64 6f 63 69 64 73 20 74 68  set of docids th
1480: 61 74 20 6d 61 74 63 68 20 74 68 65 20 65 78 70  at match the exp
1490: 72 65 73 73 69 6f 6e 0a 20 20 23 20 20 20 20 20  ression.  #     
14a0: 20 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62   can therefore b
14b0: 65 20 66 6f 75 6e 64 20 75 73 69 6e 67 20 5b 61  e found using [a
14c0: 72 72 61 79 20 6e 61 6d 65 73 20 68 69 74 73 5d  rray names hits]
14d0: 2e 0a 20 20 23 0a 20 20 23 20 20 20 32 2e 20 46  ..  #.  #   2. F
14e0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
14f0: 66 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20  f each document 
1500: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 6f  in the table, co
1510: 75 6e 74 73 28 24 64 6f 63 69 64 2c 24 69 43 6f  unts($docid,$iCo
1520: 6c 29 0a 20 20 23 20 20 20 20 20 20 69 73 20 73  l).  #      is s
1530: 65 74 20 74 6f 20 74 68 65 20 2d 70 68 72 61 73  et to the -phras
1540: 65 63 6f 75 6e 74 76 61 72 20 6f 75 74 70 75 74  ecountvar output
1550: 2e 0a 20 20 23 0a 20 20 73 65 74 20 72 65 73 20  ..  #.  set res 
1560: 5b 6c 69 73 74 5d 0a 20 20 63 61 74 63 68 20 7b  [list].  catch {
1570: 20 61 72 72 61 79 20 75 6e 73 65 74 20 68 69 74   array unset hit
1580: 73 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 22 53  s }.  db eval "S
1590: 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 2a 20 46  ELECT docid, * F
15a0: 52 4f 4d 20 24 74 62 6c 22 20 64 20 7b 0a 20 20  ROM $tbl" d {.  
15b0: 20 20 73 65 74 20 69 43 6f 6c 20 30 0a 20 20 20    set iCol 0.   
15c0: 20 66 6f 72 65 61 63 68 20 63 6f 6c 20 5b 6c 72   foreach col [lr
15d0: 61 6e 67 65 20 24 64 28 2a 29 20 31 20 65 6e 64  ange $d(*) 1 end
15e0: 5d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 64 6f  ] {.      set do
15f0: 63 69 64 20 24 64 28 64 6f 63 69 64 29 0a 20 20  cid $d(docid).  
1600: 20 20 20 20 73 65 74 20 68 69 74 20 5b 66 74 73      set hit [fts
1610: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 24 64 28  3_near_match $d(
1620: 24 63 6f 6c 29 20 24 65 78 70 72 20 2d 70 20 63  $col) $expr -p c
1630: 6f 75 6e 74 73 28 24 64 6f 63 69 64 2c 24 69 43  ounts($docid,$iC
1640: 6f 6c 29 5d 0a 20 20 20 20 20 20 69 66 20 7b 24  ol)].      if {$
1650: 68 69 74 7d 20 7b 20 73 65 74 20 68 69 74 73 28  hit} { set hits(
1660: 24 64 6f 63 69 64 29 20 31 20 7d 0a 20 20 20 20  $docid) 1 }.    
1670: 20 20 69 6e 63 72 20 69 43 6f 6c 0a 20 20 20 20    incr iCol.    
1680: 7d 0a 20 20 7d 0a 20 20 73 65 74 20 6e 50 68 72  }.  }.  set nPhr
1690: 61 73 65 20 5b 65 78 70 72 20 28 5b 6c 6c 65 6e  ase [expr ([llen
16a0: 67 74 68 20 24 65 78 70 72 5d 2b 31 29 2f 32 5d  gth $expr]+1)/2]
16b0: 0a 20 20 73 65 74 20 6e 43 6f 6c 20 24 69 43 6f  .  set nCol $iCo
16c0: 6c 0a 0a 20 20 23 20 54 68 69 73 20 62 6c 6f 63  l..  # This bloc
16d0: 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  k populates the 
16e0: 6e 48 69 74 20 61 6e 64 20 6e 44 6f 63 20 61 72  nHit and nDoc ar
16f0: 72 61 79 73 2e 20 46 6f 72 20 65 61 63 68 20 70  rays. For each p
1700: 68 72 61 73 65 2f 63 6f 6c 75 6d 6e 0a 20 20 23  hrase/column.  #
1710: 20 69 6e 20 74 68 65 20 71 75 65 72 79 2f 74 61   in the query/ta
1720: 62 6c 65 2c 20 61 72 72 61 79 20 65 6c 65 6d 65  ble, array eleme
1730: 6e 74 73 20 61 72 65 20 73 65 74 20 61 73 20 66  nts are set as f
1740: 6f 6c 6c 6f 77 73 3a 0a 20 20 23 0a 20 20 23 20  ollows:.  #.  # 
1750: 20 20 6e 48 69 74 28 24 69 50 68 72 61 73 65 2c    nHit($iPhrase,
1760: 24 69 43 6f 6c 29 20 2d 20 54 6f 74 61 6c 20 6e  $iCol) - Total n
1770: 75 6d 62 65 72 20 6f 66 20 68 69 74 73 20 66 6f  umber of hits fo
1780: 72 20 70 68 72 61 73 65 20 24 69 50 68 72 61 73  r phrase $iPhras
1790: 65 20 69 6e 20 0a 20 20 23 20 20 20 20 20 20 20  e in .  #       
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 63 6f 6c 75 6d 6e 20 24 69 43 6f 6c 2e     column $iCol.
17c0: 0a 20 20 23 0a 20 20 23 20 20 20 6e 44 6f 63 28  .  #.  #   nDoc(
17d0: 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 20  $iPhrase,$iCol) 
17e0: 2d 20 4e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  - Number of docu
17f0: 6d 65 6e 74 73 20 77 69 74 68 20 61 74 20 6c 65  ments with at le
1800: 61 73 74 20 6f 6e 65 20 68 69 74 20 66 6f 72 0a  ast one hit for.
1810: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 68 72               phr
1830: 61 73 65 20 24 69 50 68 72 61 73 65 20 69 6e 20  ase $iPhrase in 
1840: 63 6f 6c 75 6d 6e 20 24 69 43 6f 6c 2e 0a 20 20  column $iCol..  
1850: 23 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 50 68  #.  for {set iPh
1860: 72 61 73 65 20 30 7d 20 7b 24 69 50 68 72 61 73  rase 0} {$iPhras
1870: 65 20 3c 20 24 6e 50 68 72 61 73 65 7d 20 7b 69  e < $nPhrase} {i
1880: 6e 63 72 20 69 50 68 72 61 73 65 7d 20 7b 0a 20  ncr iPhrase} {. 
1890: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 43 6f 6c     for {set iCol
18a0: 20 30 7d 20 7b 24 69 43 6f 6c 20 3c 20 24 6e 43   0} {$iCol < $nC
18b0: 6f 6c 7d 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20  ol} {incr iCol} 
18c0: 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 48 69 74  {.      set nHit
18d0: 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29  ($iPhrase,$iCol)
18e0: 20 30 0a 20 20 20 20 20 20 73 65 74 20 6e 44 6f   0.      set nDo
18f0: 63 28 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c  c($iPhrase,$iCol
1900: 29 20 30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ) 0.    }.  }.  
1910: 66 6f 72 65 61 63 68 20 6b 65 79 20 5b 61 72 72  foreach key [arr
1920: 61 79 20 6e 61 6d 65 73 20 63 6f 75 6e 74 73 5d  ay names counts]
1930: 20 7b 0a 20 20 20 20 73 65 74 20 69 43 6f 6c 20   {.    set iCol 
1940: 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24  [lindex [split $
1950: 6b 65 79 20 2c 5d 20 31 5d 0a 20 20 20 20 73 65  key ,] 1].    se
1960: 74 20 69 50 68 72 61 73 65 20 30 0a 20 20 20 20  t iPhrase 0.    
1970: 66 6f 72 65 61 63 68 20 63 20 24 63 6f 75 6e 74  foreach c $count
1980: 73 28 24 6b 65 79 29 20 7b 0a 20 20 20 20 20 20  s($key) {.      
1990: 69 66 20 7b 24 63 3e 30 7d 20 7b 20 69 6e 63 72  if {$c>0} { incr
19a0: 20 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24   nDoc($iPhrase,$
19b0: 69 43 6f 6c 29 20 31 20 7d 0a 20 20 20 20 20 20  iCol) 1 }.      
19c0: 69 6e 63 72 20 6e 48 69 74 28 24 69 50 68 72 61  incr nHit($iPhra
19d0: 73 65 2c 24 69 43 6f 6c 29 20 24 63 0a 20 20 20  se,$iCol) $c.   
19e0: 20 20 20 69 6e 63 72 20 69 50 68 72 61 73 65 0a     incr iPhrase.
19f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20      }.  }..  if 
1a00: 7b 5b 6c 6c 65 6e 67 74 68 20 24 64 65 66 65 72  {[llength $defer
1a10: 72 65 64 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68  red] && [llength
1a20: 20 24 65 78 70 72 5d 3d 3d 31 7d 20 7b 0a 20 20   $expr]==1} {.  
1a30: 20 20 73 65 74 20 70 68 72 61 73 65 20 5b 6c 69    set phrase [li
1a40: 6e 64 65 78 20 24 65 78 70 72 20 30 5d 0a 20 20  ndex $expr 0].  
1a50: 20 20 73 65 74 20 72 65 77 72 69 74 74 65 6e 20    set rewritten 
1a60: 5b 6c 69 73 74 5d 0a 20 20 20 20 73 65 74 20 70  [list].    set p
1a70: 61 72 74 69 61 6c 20 30 0a 20 20 20 20 66 6f 72  artial 0.    for
1a80: 65 61 63 68 20 74 6f 6b 20 24 70 68 72 61 73 65  each tok $phrase
1a90: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 73   {.      if {[ls
1aa0: 65 61 72 63 68 20 24 64 65 66 65 72 72 65 64 20  earch $deferred 
1ab0: 24 74 6f 6b 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20  $tok]>=0} {.    
1ac0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 77 72      lappend rewr
1ad0: 69 74 74 65 6e 20 2a 0a 20 20 20 20 20 20 7d 20  itten *.      } 
1ae0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 6c  else {.        l
1af0: 61 70 70 65 6e 64 20 72 65 77 72 69 74 74 65 6e  append rewritten
1b00: 20 24 74 6f 6b 0a 20 20 20 20 20 20 20 20 73 65   $tok.        se
1b10: 74 20 70 61 72 74 69 61 6c 20 31 0a 20 20 20 20  t partial 1.    
1b20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1b30: 20 7b 24 70 61 72 74 69 61 6c 3d 3d 30 7d 20 7b   {$partial==0} {
1b40: 0a 20 20 20 20 20 20 73 65 74 20 74 62 6c 73 69  .      set tblsi
1b50: 7a 65 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ze [db one "SELE
1b60: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1b70: 20 24 74 62 6c 22 5d 0a 20 20 20 20 20 20 66 6f   $tbl"].      fo
1b80: 72 20 7b 73 65 74 20 69 43 6f 6c 20 30 7d 20 7b  r {set iCol 0} {
1b90: 24 69 43 6f 6c 20 3c 20 24 6e 43 6f 6c 7d 20 7b  $iCol < $nCol} {
1ba0: 69 6e 63 72 20 69 43 6f 6c 7d 20 7b 0a 20 20 20  incr iCol} {.   
1bb0: 20 20 20 20 20 73 65 74 20 6e 48 69 74 28 30 2c       set nHit(0,
1bc0: 24 69 43 6f 6c 29 20 24 74 62 6c 73 69 7a 65 0a  $iCol) $tblsize.
1bd0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 44 6f 63          set nDoc
1be0: 28 30 2c 24 69 43 6f 6c 29 20 24 74 62 6c 73 69  (0,$iCol) $tblsi
1bf0: 7a 65 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ze.      }.    }
1c00: 20 65 6c 73 65 69 66 20 7b 24 72 65 77 72 69 74   elseif {$rewrit
1c10: 74 65 6e 20 21 3d 20 24 70 68 72 61 73 65 7d 20  ten != $phrase} 
1c20: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b  {.      while {[
1c30: 6c 69 6e 64 65 78 20 24 72 65 77 72 69 74 74 65  lindex $rewritte
1c40: 6e 20 65 6e 64 5d 20 3d 3d 20 22 2a 22 7d 20 7b  n end] == "*"} {
1c50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65 77  .        set rew
1c60: 72 69 74 74 65 6e 20 5b 6c 72 61 6e 67 65 20 24  ritten [lrange $
1c70: 72 65 77 72 69 74 74 65 6e 20 30 20 65 6e 64 2d  rewritten 0 end-
1c80: 31 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1].      }.     
1c90: 20 77 68 69 6c 65 20 7b 5b 6c 69 6e 64 65 78 20   while {[lindex 
1ca0: 24 72 65 77 72 69 74 74 65 6e 20 30 5d 20 3d 3d  $rewritten 0] ==
1cb0: 20 22 2a 22 7d 20 7b 0a 20 20 20 20 20 20 20 20   "*"} {.        
1cc0: 73 65 74 20 72 65 77 72 69 74 74 65 6e 20 5b 6c  set rewritten [l
1cd0: 72 61 6e 67 65 20 24 72 65 77 72 69 74 74 65 6e  range $rewritten
1ce0: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 7d 0a   1 end].      }.
1cf0: 20 20 20 20 20 20 67 65 74 5f 73 69 6e 67 6c 65        get_single
1d00: 5f 6e 65 61 72 5f 72 65 73 75 6c 74 73 20 24 74  _near_results $t
1d10: 62 6c 20 5b 6c 69 73 74 20 24 72 65 77 72 69 74  bl [list $rewrit
1d20: 74 65 6e 5d 20 7b 7d 20 61 52 65 77 72 69 74 65  ten] {} aRewrite
1d30: 20 6e 75 6c 6c 65 6e 74 72 79 0a 20 20 20 20 20   nullentry.     
1d40: 20 66 6f 72 65 61 63 68 20 64 6f 63 69 64 20 5b   foreach docid [
1d50: 61 72 72 61 79 20 6e 61 6d 65 73 20 68 69 74 73  array names hits
1d60: 5d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  ] {.        set 
1d70: 61 4d 61 74 63 68 69 6e 66 6f 28 24 64 6f 63 69  aMatchinfo($doci
1d80: 64 29 20 24 61 52 65 77 72 69 74 65 28 24 64 6f  d) $aRewrite($do
1d90: 63 69 64 29 0a 20 20 20 20 20 20 7d 0a 20 20 20  cid).      }.   
1da0: 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a     return.    }.
1db0: 20 20 7d 0a 0a 20 20 23 20 53 65 74 20 75 70 20    }..  # Set up 
1dc0: 74 68 65 20 61 4d 61 74 63 68 69 6e 66 6f 20 61  the aMatchinfo a
1dd0: 72 72 61 79 2e 20 46 6f 72 20 65 61 63 68 20 64  rray. For each d
1de0: 6f 63 75 6d 65 6e 74 2c 20 73 65 74 20 61 4d 61  ocument, set aMa
1df0: 74 63 68 69 6e 66 6f 28 24 64 6f 63 69 64 29 20  tchinfo($docid) 
1e00: 74 6f 0a 20 20 23 20 63 6f 6e 74 61 69 6e 20 74  to.  # contain t
1e10: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6d 61 74  he output of mat
1e20: 63 68 69 6e 66 6f 28 27 78 27 29 20 66 6f 72 20  chinfo('x') for 
1e30: 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 0a 20 20  the document..  
1e40: 23 0a 20 20 66 6f 72 65 61 63 68 20 64 6f 63 69  #.  foreach doci
1e50: 64 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 68  d [array names h
1e60: 69 74 73 5d 20 7b 0a 20 20 20 20 73 65 74 20 6d  its] {.    set m
1e70: 69 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66 6f 72  i [list].    for
1e80: 20 7b 73 65 74 20 69 50 68 72 61 73 65 20 30 7d   {set iPhrase 0}
1e90: 20 7b 24 69 50 68 72 61 73 65 3c 24 6e 50 68 72   {$iPhrase<$nPhr
1ea0: 61 73 65 7d 20 7b 69 6e 63 72 20 69 50 68 72 61  ase} {incr iPhra
1eb0: 73 65 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 20  se} {.      for 
1ec0: 7b 73 65 74 20 69 43 6f 6c 20 30 7d 20 7b 24 69  {set iCol 0} {$i
1ed0: 43 6f 6c 3c 24 6e 43 6f 6c 7d 20 7b 69 6e 63 72  Col<$nCol} {incr
1ee0: 20 69 43 6f 6c 7d 20 7b 0a 20 20 20 20 20 20 20   iCol} {.       
1ef0: 20 6c 61 70 70 65 6e 64 20 6d 69 20 5b 6c 69 6e   lappend mi [lin
1f00: 64 65 78 20 24 63 6f 75 6e 74 73 28 24 64 6f 63  dex $counts($doc
1f10: 69 64 2c 24 69 43 6f 6c 29 20 24 69 50 68 72 61  id,$iCol) $iPhra
1f20: 73 65 5d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  se].        lapp
1f30: 65 6e 64 20 6d 69 20 24 6e 48 69 74 28 24 69 50  end mi $nHit($iP
1f40: 68 72 61 73 65 2c 24 69 43 6f 6c 29 0a 20 20 20  hrase,$iCol).   
1f50: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 20       lappend mi 
1f60: 24 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24  $nDoc($iPhrase,$
1f70: 69 43 6f 6c 29 0a 20 20 20 20 20 20 7d 0a 20 20  iCol).      }.  
1f80: 20 20 7d 0a 20 20 20 20 73 65 74 20 61 4d 61 74    }.    set aMat
1f90: 63 68 69 6e 66 6f 28 24 64 6f 63 69 64 29 20 24  chinfo($docid) $
1fa0: 6d 69 0a 20 20 7d 0a 0a 20 20 23 20 53 65 74 20  mi.  }..  # Set 
1fb0: 75 70 20 74 68 65 20 6e 75 6c 6c 65 6e 74 72 79  up the nullentry
1fc0: 20 6f 75 74 70 75 74 2e 0a 20 20 23 0a 20 20 73   output..  #.  s
1fd0: 65 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b 6c 69  et nullentry [li
1fe0: 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  st].  for {set i
1ff0: 50 68 72 61 73 65 20 30 7d 20 7b 24 69 50 68 72  Phrase 0} {$iPhr
2000: 61 73 65 3c 24 6e 50 68 72 61 73 65 7d 20 7b 69  ase<$nPhrase} {i
2010: 6e 63 72 20 69 50 68 72 61 73 65 7d 20 7b 0a 20  ncr iPhrase} {. 
2020: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 43 6f 6c     for {set iCol
2030: 20 30 7d 20 7b 24 69 43 6f 6c 3c 24 6e 43 6f 6c   0} {$iCol<$nCol
2040: 7d 20 7b 69 6e 63 72 20 69 43 6f 6c 7d 20 7b 0a  } {incr iCol} {.
2050: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 75        lappend nu
2060: 6c 6c 65 6e 74 72 79 20 30 20 24 6e 48 69 74 28  llentry 0 $nHit(
2070: 24 69 50 68 72 61 73 65 2c 24 69 43 6f 6c 29 20  $iPhrase,$iCol) 
2080: 24 6e 44 6f 63 28 24 69 50 68 72 61 73 65 2c 24  $nDoc($iPhrase,$
2090: 69 43 6f 6c 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  iCol).    }.  }.
20a0: 7d 0a 0a 0a 70 72 6f 63 20 6d 61 74 63 68 69 6e  }...proc matchin
20b0: 67 5f 62 72 61 63 6b 65 74 73 20 7b 65 78 70 72  g_brackets {expr
20c0: 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  } {.  if {[strin
20d0: 67 20 72 61 6e 67 65 20 24 65 78 70 72 20 30 20  g range $expr 0 
20e0: 30 5d 21 3d 22 28 22 20 7c 7c 20 5b 73 74 72 69  0]!="(" || [stri
20f0: 6e 67 20 72 61 6e 67 65 20 24 65 78 70 72 20 65  ng range $expr e
2100: 6e 64 20 65 6e 64 5d 20 21 3d 22 29 22 7d 20 7b  nd end] !=")"} {
2110: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 20 0a   .    return 0 .
2120: 20 20 7d 0a 0a 20 20 73 65 74 20 69 42 72 61 63    }..  set iBrac
2130: 6b 65 74 20 31 0a 20 20 73 65 74 20 6e 45 78 70  ket 1.  set nExp
2140: 72 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  r [string length
2150: 20 24 65 78 70 72 5d 0a 20 20 66 6f 72 20 7b 73   $expr].  for {s
2160: 65 74 20 69 20 31 7d 20 7b 24 69 42 72 61 63 6b  et i 1} {$iBrack
2170: 65 74 20 26 26 20 24 69 20 3c 20 24 6e 45 78 70  et && $i < $nExp
2180: 72 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  r} {incr i} {.  
2190: 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67 20    set c [string 
21a0: 72 61 6e 67 65 20 24 65 78 70 72 20 24 69 20 24  range $expr $i $
21b0: 69 5d 0a 20 20 20 20 69 66 20 7b 24 63 20 3d 3d  i].    if {$c ==
21c0: 20 22 28 22 7d 20 7b 69 6e 63 72 20 69 42 72 61   "("} {incr iBra
21d0: 63 6b 65 74 7d 0a 20 20 20 20 69 66 20 7b 24 63  cket}.    if {$c
21e0: 20 3d 3d 20 22 29 22 7d 20 7b 69 6e 63 72 20 69   == ")"} {incr i
21f0: 42 72 61 63 6b 65 74 20 2d 31 7d 0a 20 20 7d 0a  Bracket -1}.  }.
2200: 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20  .  return [expr 
2210: 28 24 69 42 72 61 63 6b 65 74 3d 3d 30 20 26 26  ($iBracket==0 &&
2220: 20 24 69 3d 3d 24 6e 45 78 70 72 29 5d 0a 7d 0a   $i==$nExpr)].}.
2230: 0a 70 72 6f 63 20 67 65 74 5f 6e 65 61 72 5f 72  .proc get_near_r
2240: 65 73 75 6c 74 73 20 7b 74 62 6c 20 65 78 70 72  esults {tbl expr
2250: 20 64 65 66 65 72 72 65 64 20 61 72 72 61 79 76   deferred arrayv
2260: 61 72 20 7b 6e 75 6c 6c 76 61 72 20 22 22 7d 7d  ar {nullvar ""}}
2270: 20 7b 0a 20 20 75 70 76 61 72 20 24 61 72 72 61   {.  upvar $arra
2280: 79 76 61 72 20 61 4d 61 74 63 68 69 6e 66 6f 0a  yvar aMatchinfo.
2290: 20 20 69 66 20 7b 24 6e 75 6c 6c 76 61 72 20 21    if {$nullvar !
22a0: 3d 20 22 22 7d 20 7b 20 75 70 76 61 72 20 24 6e  = ""} { upvar $n
22b0: 75 6c 6c 76 61 72 20 6e 75 6c 6c 65 6e 74 72 79  ullvar nullentry
22c0: 20 7d 0a 0a 20 20 73 65 74 20 65 78 70 72 20 5b   }..  set expr [
22d0: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 65 78 70  string trim $exp
22e0: 72 5d 0a 20 20 77 68 69 6c 65 20 7b 20 5b 6d 61  r].  while { [ma
22f0: 74 63 68 69 6e 67 5f 62 72 61 63 6b 65 74 73 20  tching_brackets 
2300: 24 65 78 70 72 5d 20 7d 20 7b 0a 20 20 20 20 73  $expr] } {.    s
2310: 65 74 20 65 78 70 72 20 5b 73 74 72 69 6e 67 20  et expr [string 
2320: 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e  trim [string ran
2330: 67 65 20 24 65 78 70 72 20 31 20 65 6e 64 2d 31  ge $expr 1 end-1
2340: 5d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 70 72  ]].  }..  set pr
2350: 65 63 28 4e 4f 54 29 20 31 0a 20 20 73 65 74 20  ec(NOT) 1.  set 
2360: 70 72 65 63 28 41 4e 44 29 20 32 0a 20 20 73 65  prec(AND) 2.  se
2370: 74 20 70 72 65 63 28 4f 52 29 20 20 33 0a 0a 20  t prec(OR)  3.. 
2380: 20 73 65 74 20 63 75 72 72 65 6e 74 70 72 65 63   set currentprec
2390: 20 30 0a 20 20 73 65 74 20 69 42 72 61 63 6b 65   0.  set iBracke
23a0: 74 20 30 0a 20 20 73 65 74 20 65 78 70 72 5f 6c  t 0.  set expr_l
23b0: 65 6e 67 74 68 20 5b 6c 6c 65 6e 67 74 68 20 24  ength [llength $
23c0: 65 78 70 72 5d 0a 20 20 66 6f 72 20 7b 73 65 74  expr].  for {set
23d0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 65 78 70   i 0} {$i < $exp
23e0: 72 5f 6c 65 6e 67 74 68 7d 20 7b 69 6e 63 72 20  r_length} {incr 
23f0: 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 6f 70 20  i} {.    set op 
2400: 5b 6c 69 6e 64 65 78 20 24 65 78 70 72 20 24 69  [lindex $expr $i
2410: 5d 0a 20 20 20 20 69 66 20 7b 24 69 42 72 61 63  ].    if {$iBrac
2420: 6b 65 74 3d 3d 30 20 26 26 20 5b 69 6e 66 6f 20  ket==0 && [info 
2430: 65 78 69 73 74 73 20 70 72 65 63 28 24 6f 70 29  exists prec($op)
2440: 5d 20 26 26 20 24 70 72 65 63 28 24 6f 70 29 3e  ] && $prec($op)>
2450: 3d 24 63 75 72 72 65 6e 74 70 72 65 63 20 7d 20  =$currentprec } 
2460: 7b 0a 20 20 20 20 20 20 73 65 74 20 6f 70 69 64  {.      set opid
2470: 78 20 24 69 0a 20 20 20 20 20 20 73 65 74 20 63  x $i.      set c
2480: 75 72 72 65 6e 74 70 72 65 63 20 24 70 72 65 63  urrentprec $prec
2490: 28 24 6f 70 29 0a 20 20 20 20 7d 20 65 6c 73 65  ($op).    } else
24a0: 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65   {.      for {se
24b0: 74 20 6a 20 30 7d 20 7b 24 6a 20 3c 20 5b 73 74  t j 0} {$j < [st
24c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6f 70 5d  ring length $op]
24d0: 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20  } {incr j} {.   
24e0: 20 20 20 20 20 73 65 74 20 63 20 5b 73 74 72 69       set c [stri
24f0: 6e 67 20 72 61 6e 67 65 20 24 6f 70 20 24 6a 20  ng range $op $j 
2500: 24 6a 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  $j].        if {
2510: 24 63 20 3d 3d 20 22 28 22 7d 20 7b 20 69 6e 63  $c == "("} { inc
2520: 72 20 69 42 72 61 63 6b 65 74 20 2b 31 20 7d 0a  r iBracket +1 }.
2530: 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 20 3d          if {$c =
2540: 3d 20 22 29 22 7d 20 7b 20 69 6e 63 72 20 69 42  = ")"} { incr iB
2550: 72 61 63 6b 65 74 20 2d 31 20 7d 0a 20 20 20 20  racket -1 }.    
2560: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2570: 69 66 20 7b 24 69 42 72 61 63 6b 65 74 21 3d 30  if {$iBracket!=0
2580: 7d 20 7b 20 65 72 72 6f 72 20 22 6d 69 73 6d 61  } { error "misma
2590: 74 63 68 65 64 20 62 72 61 63 6b 65 74 73 20 69  tched brackets i
25a0: 6e 3a 20 24 65 78 70 72 22 20 7d 0a 0a 20 20 69  n: $expr" }..  i
25b0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
25c0: 6f 70 69 64 78 5d 3d 3d 30 7d 20 7b 0a 20 20 20  opidx]==0} {.   
25d0: 20 67 65 74 5f 73 69 6e 67 6c 65 5f 6e 65 61 72   get_single_near
25e0: 5f 72 65 73 75 6c 74 73 20 24 74 62 6c 20 24 65  _results $tbl $e
25f0: 78 70 72 20 24 64 65 66 65 72 72 65 64 20 61 4d  xpr $deferred aM
2600: 61 74 63 68 69 6e 66 6f 20 6e 75 6c 6c 65 6e 74  atchinfo nullent
2610: 72 79 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  ry.  } else {.  
2620: 20 20 73 65 74 20 65 4c 65 66 74 20 20 5b 6c 72    set eLeft  [lr
2630: 61 6e 67 65 20 24 65 78 70 72 20 30 20 5b 65 78  ange $expr 0 [ex
2640: 70 72 20 24 6f 70 69 64 78 2d 31 5d 5d 0a 20 20  pr $opidx-1]].  
2650: 20 20 73 65 74 20 65 52 69 67 68 74 20 5b 6c 72    set eRight [lr
2660: 61 6e 67 65 20 24 65 78 70 72 20 5b 65 78 70 72  ange $expr [expr
2670: 20 24 6f 70 69 64 78 2b 31 5d 20 65 6e 64 5d 0a   $opidx+1] end].
2680: 0a 20 20 20 20 67 65 74 5f 6e 65 61 72 5f 72 65  .    get_near_re
2690: 73 75 6c 74 73 20 24 74 62 6c 20 24 65 4c 65 66  sults $tbl $eLef
26a0: 74 20 20 24 64 65 66 65 72 72 65 64 20 61 4c 65  t  $deferred aLe
26b0: 66 74 20 20 6e 75 6c 6c 6c 65 66 74 0a 20 20 20  ft  nullleft.   
26c0: 20 67 65 74 5f 6e 65 61 72 5f 72 65 73 75 6c 74   get_near_result
26d0: 73 20 24 74 62 6c 20 24 65 52 69 67 68 74 20 24  s $tbl $eRight $
26e0: 64 65 66 65 72 72 65 64 20 61 52 69 67 68 74 20  deferred aRight 
26f0: 6e 75 6c 6c 72 69 67 68 74 0a 0a 20 20 20 20 73  nullright..    s
2700: 77 69 74 63 68 20 2d 2d 20 5b 6c 69 6e 64 65 78  witch -- [lindex
2710: 20 24 65 78 70 72 20 24 6f 70 69 64 78 5d 20 7b   $expr $opidx] {
2720: 0a 20 20 20 20 20 20 22 4e 4f 54 22 20 7b 0a 20  .      "NOT" {. 
2730: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 68         foreach h
2740: 69 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20  it [array names 
2750: 61 4c 65 66 74 5d 20 7b 0a 20 20 20 20 20 20 20  aLeft] {.       
2760: 20 20 20 69 66 20 7b 30 3d 3d 5b 69 6e 66 6f 20     if {0==[info 
2770: 65 78 69 73 74 73 20 61 52 69 67 68 74 28 24 68  exists aRight($h
2780: 69 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  it)]} {.        
2790: 20 20 20 20 73 65 74 20 61 4d 61 74 63 68 69 6e      set aMatchin
27a0: 66 6f 28 24 68 69 74 29 20 24 61 4c 65 66 74 28  fo($hit) $aLeft(
27b0: 24 68 69 74 29 0a 20 20 20 20 20 20 20 20 20 20  $hit).          
27c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27d0: 20 20 20 20 73 65 74 20 6e 75 6c 6c 65 6e 74 72      set nullentr
27e0: 79 20 24 6e 75 6c 6c 6c 65 66 74 0a 20 20 20 20  y $nullleft.    
27f0: 20 20 7d 0a 0a 20 20 20 20 20 20 22 41 4e 44 22    }..      "AND"
2800: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   {.        forea
2810: 63 68 20 68 69 74 20 5b 61 72 72 61 79 20 6e 61  ch hit [array na
2820: 6d 65 73 20 61 4c 65 66 74 5d 20 7b 0a 20 20 20  mes aLeft] {.   
2830: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
2840: 20 65 78 69 73 74 73 20 61 52 69 67 68 74 28 24   exists aRight($
2850: 68 69 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20  hit)]} {.       
2860: 20 20 20 20 20 73 65 74 20 61 4d 61 74 63 68 69       set aMatchi
2870: 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e 63 61  nfo($hit) [conca
2880: 74 20 24 61 4c 65 66 74 28 24 68 69 74 29 20 24  t $aLeft($hit) $
2890: 61 52 69 67 68 74 28 24 68 69 74 29 5d 0a 20 20  aRight($hit)].  
28a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20    }.        set 
28c0: 6e 75 6c 6c 65 6e 74 72 79 20 5b 63 6f 6e 63 61  nullentry [conca
28d0: 74 20 24 6e 75 6c 6c 6c 65 66 74 20 24 6e 75 6c  t $nullleft $nul
28e0: 6c 72 69 67 68 74 5d 0a 20 20 20 20 20 20 7d 0a  lright].      }.
28f0: 0a 20 20 20 20 20 20 22 4f 52 22 20 7b 0a 20 20  .      "OR" {.  
2900: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 68 69        foreach hi
2910: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61  t [array names a
2920: 4c 65 66 74 5d 20 7b 0a 20 20 20 20 20 20 20 20  Left] {.        
2930: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2940: 74 73 20 61 52 69 67 68 74 28 24 68 69 74 29 5d  ts aRight($hit)]
2950: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2960: 73 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 28 24  set aMatchinfo($
2970: 68 69 74 29 20 5b 63 6f 6e 63 61 74 20 24 61 4c  hit) [concat $aL
2980: 65 66 74 28 24 68 69 74 29 20 24 61 52 69 67 68  eft($hit) $aRigh
2990: 74 28 24 68 69 74 29 5d 0a 20 20 20 20 20 20 20  t($hit)].       
29a0: 20 20 20 20 20 75 6e 73 65 74 20 61 52 69 67 68       unset aRigh
29b0: 74 28 24 68 69 74 29 0a 20 20 20 20 20 20 20 20  t($hit).        
29c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
29d0: 20 20 20 20 20 20 20 73 65 74 20 61 4d 61 74 63         set aMatc
29e0: 68 69 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f 6e  hinfo($hit) [con
29f0: 63 61 74 20 24 61 4c 65 66 74 28 24 68 69 74 29  cat $aLeft($hit)
2a00: 20 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20 20 20   $nullright].   
2a10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a20: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   }.        forea
2a30: 63 68 20 68 69 74 20 5b 61 72 72 61 79 20 6e 61  ch hit [array na
2a40: 6d 65 73 20 61 52 69 67 68 74 5d 20 7b 0a 20 20  mes aRight] {.  
2a50: 20 20 20 20 20 20 20 20 73 65 74 20 61 4d 61 74          set aMat
2a60: 63 68 69 6e 66 6f 28 24 68 69 74 29 20 5b 63 6f  chinfo($hit) [co
2a70: 6e 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74 20 24  ncat $nullleft $
2a80: 61 52 69 67 68 74 28 24 68 69 74 29 5d 0a 20 20  aRight($hit)].  
2a90: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2aa0: 20 73 65 74 20 6e 75 6c 6c 65 6e 74 72 79 20 5b   set nullentry [
2ab0: 63 6f 6e 63 61 74 20 24 6e 75 6c 6c 6c 65 66 74  concat $nullleft
2ac0: 20 24 6e 75 6c 6c 72 69 67 68 74 5d 0a 20 20 20   $nullright].   
2ad0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2ae0: 0a 0a 0a 23 20 45 6e 64 20 6f 66 20 74 65 73 74  ...# End of test
2af0: 20 70 72 6f 63 73 2e 20 41 63 74 75 61 6c 20 74   procs. Actual t
2b00: 65 73 74 73 20 61 72 65 20 62 65 6c 6f 77 20 74  ests are below t
2b10: 68 69 73 20 6c 69 6e 65 2e 0a 23 2d 2d 2d 2d 2d  his line..#-----
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  -----..#--------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
2bc0: 6e 67 20 74 65 73 74 20 63 61 73 65 73 20 2d 20  ng test cases - 
2bd0: 66 74 73 33 61 75 74 6f 2d 31 2e 2a 20 2d 20 66  fts3auto-1.* - f
2be0: 6f 63 75 73 20 6f 6e 20 74 65 73 74 69 6e 67 20  ocus on testing 
2bf0: 74 68 65 20 54 63 6c 20 0a 23 20 63 6f 6d 6d 61  the Tcl .# comma
2c00: 6e 64 20 5b 66 74 73 33 5f 6e 65 61 72 5f 6d 61  nd [fts3_near_ma
2c10: 74 63 68 5d 2c 20 77 68 69 63 68 20 69 73 20 75  tch], which is u
2c20: 73 65 64 20 62 79 20 6f 74 68 65 72 20 74 65 73  sed by other tes
2c30: 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  ts in this file.
2c40: 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 66 74 73  .#.proc test_fts
2c50: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 7b 74 6e  3_near_match {tn
2c60: 20 64 6f 63 20 65 78 70 72 20 72 65 73 7d 20 7b   doc expr res} {
2c70: 0a 20 20 66 74 73 33 5f 6e 65 61 72 5f 6d 61 74  .  fts3_near_mat
2c80: 63 68 20 24 64 6f 63 20 24 65 78 70 72 20 2d 70  ch $doc $expr -p
2c90: 68 72 61 73 65 63 6f 75 6e 74 76 61 72 20 70 0a  hrasecountvar p.
2ca0: 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 74 65 73    uplevel do_tes
2cb0: 74 20 5b 6c 69 73 74 20 24 74 6e 5d 20 5b 6c 69  t [list $tn] [li
2cc0: 73 74 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20  st [list set {} 
2cd0: 24 70 5d 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d  $p]] [list $res]
2ce0: 0a 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65  .}..test_fts3_ne
2cf0: 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 31 20 7b  ar_match 1.1.1 {
2d00: 61 20 62 20 63 20 61 20 62 7d 20 61 20 20 20 20  a b c a b} a    
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2d20: 32 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65 61  2}.test_fts3_nea
2d30: 72 5f 6d 61 74 63 68 20 31 2e 31 2e 32 20 7b 61  r_match 1.1.2 {a
2d40: 20 62 20 63 20 61 20 62 7d 20 7b 61 20 35 20 62   b c a b} {a 5 b
2d50: 20 36 20 63 7d 20 20 20 20 20 20 20 20 20 7b 32   6 c}         {2
2d60: 20 32 20 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f   2 1}.test_fts3_
2d70: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 33  near_match 1.1.3
2d80: 20 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 22 61   {a b c a b} {"a
2d90: 20 62 22 7d 20 20 20 20 20 20 20 20 20 20 20 20   b"}            
2da0: 20 7b 32 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e   {2}.test_fts3_n
2db0: 65 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 34 20  ear_match 1.1.4 
2dc0: 7b 61 20 62 20 63 20 61 20 62 7d 20 7b 22 62 20  {a b c a b} {"b 
2dd0: 63 22 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  c"}             
2de0: 7b 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65  {1}.test_fts3_ne
2df0: 61 72 5f 6d 61 74 63 68 20 31 2e 31 2e 35 20 7b  ar_match 1.1.5 {
2e00: 61 20 62 20 63 20 61 20 62 7d 20 7b 22 63 20 63  a b c a b} {"c c
2e10: 22 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  "}             {
2e20: 30 7d 0a 0a 74 65 73 74 5f 66 74 73 33 5f 6e 65  0}..test_fts3_ne
2e30: 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 31 20 22  ar_match 1.2.1 "
2e40: 61 20 62 20 63 20 64 20 65 20 66 20 67 22 20 7b  a b c d e f g" {
2e50: 62 20 32 20 66 7d 20 20 20 20 20 20 20 20 20 7b  b 2 f}         {
2e60: 30 20 30 7d 0a 74 65 73 74 5f 66 74 73 33 5f 6e  0 0}.test_fts3_n
2e70: 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 32 20  ear_match 1.2.2 
2e80: 22 61 20 62 20 63 20 64 20 65 20 66 20 67 22 20  "a b c d e f g" 
2e90: 7b 62 20 33 20 66 7d 20 20 20 20 20 20 20 20 20  {b 3 f}         
2ea0: 7b 31 20 31 7d 0a 74 65 73 74 5f 66 74 73 33 5f  {1 1}.test_fts3_
2eb0: 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e 33  near_match 1.2.3
2ec0: 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67 22   "a b c d e f g"
2ed0: 20 7b 66 20 32 20 62 7d 20 20 20 20 20 20 20 20   {f 2 b}        
2ee0: 20 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74 73 33   {0 0}.test_fts3
2ef0: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32 2e  _near_match 1.2.
2f00: 34 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67  4 "a b c d e f g
2f10: 22 20 7b 66 20 33 20 62 7d 20 20 20 20 20 20 20  " {f 3 b}       
2f20: 20 20 7b 31 20 31 7d 0a 74 65 73 74 5f 66 74 73    {1 1}.test_fts
2f30: 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 32  3_near_match 1.2
2f40: 2e 35 20 22 61 20 62 20 63 20 64 20 65 20 66 20  .5 "a b c d e f 
2f50: 67 22 20 7b 22 61 20 62 22 20 32 20 22 66 20 67  g" {"a b" 2 "f g
2f60: 22 7d 20 7b 30 20 30 7d 0a 74 65 73 74 5f 66 74  "} {0 0}.test_ft
2f70: 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e  s3_near_match 1.
2f80: 32 2e 36 20 22 61 20 62 20 63 20 64 20 65 20 66  2.6 "a b c d e f
2f90: 20 67 22 20 7b 22 61 20 62 22 20 33 20 22 66 20   g" {"a b" 3 "f 
2fa0: 67 22 7d 20 7b 31 20 31 7d 0a 0a 73 65 74 20 41  g"} {1 1}..set A
2fb0: 20 22 61 20 62 20 63 20 64 20 65 20 66 20 67 20   "a b c d e f g 
2fc0: 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20  h i j k l m n o 
2fd0: 70 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20  p q r s t u v w 
2fe0: 78 20 79 20 7a 22 0a 74 65 73 74 5f 66 74 73 33  x y z".test_fts3
2ff0: 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31 2e 33 2e  _near_match 1.3.
3000: 31 20 24 41 20 7b 22 63 20 64 22 20 35 20 22 69  1 $A {"c d" 5 "i
3010: 20 6a 22 20 31 20 22 65 20 66 22 7d 20 20 20 20   j" 1 "e f"}    
3020: 20 20 7b 30 20 30 20 30 7d 0a 74 65 73 74 5f 66    {0 0 0}.test_f
3030: 74 73 33 5f 6e 65 61 72 5f 6d 61 74 63 68 20 31  ts3_near_match 1
3040: 2e 33 2e 32 20 24 41 20 7b 22 63 20 64 22 20 35  .3.2 $A {"c d" 5
3050: 20 22 69 20 6a 22 20 32 20 22 65 20 66 22 7d 20   "i j" 2 "e f"} 
3060: 20 20 20 20 20 7b 31 20 31 20 31 7d 0a 0a 23 2d       {1 1 1}..#-
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
30c0: 20 63 61 73 65 73 20 66 74 73 33 61 75 74 6f 2d   cases fts3auto-
30d0: 32 2e 2a 20 72 75 6e 20 73 6f 6d 65 20 73 69 6d  2.* run some sim
30e0: 70 6c 65 20 74 65 73 74 73 20 75 73 69 6e 67 20  ple tests using 
30f0: 74 68 65 20 0a 23 20 5b 64 6f 5f 66 74 73 33 71  the .# [do_fts3q
3100: 75 65 72 79 5f 74 65 73 74 5d 20 70 72 6f 63 2e  uery_test] proc.
3110: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63  .#.foreach {tn c
3120: 72 65 61 74 65 7d 20 7b 0a 20 20 31 20 20 20 20  reate} {.  1    
3130: 22 66 74 73 34 28 61 2c 20 62 29 22 0a 20 20 32  "fts4(a, b)".  2
3140: 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20      "fts4(a, b, 
3150: 6f 72 64 65 72 3d 44 45 53 43 29 22 0a 20 20 33  order=DESC)".  3
3160: 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20      "fts4(a, b, 
3170: 6f 72 64 65 72 3d 41 53 43 29 22 0a 20 20 34 20  order=ASC)".  4 
3180: 20 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 70     "fts4(a, b, p
3190: 72 65 66 69 78 3d 31 29 22 0a 20 20 35 20 20 20  refix=1)".  5   
31a0: 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f 72 64   "fts4(a, b, ord
31b0: 65 72 3d 44 45 53 43 2c 20 70 72 65 66 69 78 3d  er=DESC, prefix=
31c0: 31 29 22 0a 20 20 36 20 20 20 20 22 66 74 73 34  1)".  6    "fts4
31d0: 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d 41 53 43  (a, b, order=ASC
31e0: 2c 20 70 72 65 66 69 78 3d 31 29 22 0a 7d 20 7b  , prefix=1)".} {
31f0: 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 74 6e  .  do_test 2.$tn
3200: 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .1 {.    catchsq
3210: 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74  l { DROP TABLE t
3220: 31 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 }.    execsql 
3230: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
3240: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
3250: 24 63 72 65 61 74 65 22 0a 20 20 20 20 66 6f 72  $create".    for
3260: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 33   {set i 0} {$i<3
3270: 32 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  2} {incr i} {.  
3280: 20 20 20 20 73 65 74 20 64 6f 63 20 5b 6c 69 73      set doc [lis
3290: 74 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 69 26  t].      if {$i&
32a0: 30 78 30 31 7d 20 7b 6c 61 70 70 65 6e 64 20 64  0x01} {lappend d
32b0: 6f 63 20 6f 6e 65 7d 0a 20 20 20 20 20 20 69 66  oc one}.      if
32c0: 20 7b 24 69 26 30 78 30 32 7d 20 7b 6c 61 70 70   {$i&0x02} {lapp
32d0: 65 6e 64 20 64 6f 63 20 74 77 6f 7d 0a 20 20 20  end doc two}.   
32e0: 20 20 20 69 66 20 7b 24 69 26 30 78 30 34 7d 20     if {$i&0x04} 
32f0: 7b 6c 61 70 70 65 6e 64 20 64 6f 63 20 74 68 72  {lappend doc thr
3300: 65 65 7d 0a 20 20 20 20 20 20 69 66 20 7b 24 69  ee}.      if {$i
3310: 26 30 78 30 38 7d 20 7b 6c 61 70 70 65 6e 64 20  &0x08} {lappend 
3320: 64 6f 63 20 66 6f 75 72 7d 0a 20 20 20 20 20 20  doc four}.      
3330: 69 66 20 7b 24 69 26 30 78 31 30 7d 20 7b 6c 61  if {$i&0x10} {la
3340: 70 70 65 6e 64 20 64 6f 63 20 66 69 76 65 7d 0a  ppend doc five}.
3350: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20        execsql { 
3360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3370: 41 4c 55 45 53 28 24 64 6f 63 2c 20 6e 75 6c 6c  ALUES($doc, null
3380: 29 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ) }.    }.  } {}
3390: 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32  ..  foreach {tn2
33a0: 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20   expr} {.    1  
33b0: 20 20 20 7b 6f 6e 65 7d 0a 20 20 20 20 32 20 20     {one}.    2  
33c0: 20 20 20 7b 6f 6e 65 20 4e 45 41 52 2f 31 20 66     {one NEAR/1 f
33d0: 69 76 65 7d 0a 20 20 20 20 33 20 20 20 20 20 7b  ive}.    3     {
33e0: 74 2a 7d 0a 20 20 20 20 34 20 20 20 20 20 7b 74  t*}.    4     {t
33f0: 2a 20 4e 45 41 52 2f 30 20 66 69 76 65 7d 0a 20  * NEAR/0 five}. 
3400: 20 20 20 35 20 20 20 20 20 7b 6f 2a 20 4e 45 41     5     {o* NEA
3410: 52 2f 31 20 66 2a 7d 0a 20 20 20 20 36 20 20 20  R/1 f*}.    6   
3420: 20 20 7b 6f 6e 65 20 4e 45 41 52 20 66 69 76 65    {one NEAR five
3430: 20 4e 45 41 52 20 74 77 6f 20 4e 45 41 52 20 66   NEAR two NEAR f
3440: 6f 75 72 20 4e 45 41 52 20 74 68 72 65 65 7d 0a  our NEAR three}.
3450: 20 20 20 20 37 20 20 20 20 20 7b 6f 6e 65 20 4e      7     {one N
3460: 45 41 52 20 78 79 7a 7d 0a 20 20 20 20 38 20 20  EAR xyz}.    8  
3470: 20 20 20 7b 6f 6e 65 20 4f 52 20 74 77 6f 7d 0a     {one OR two}.
3480: 20 20 20 20 39 20 20 20 20 20 7b 6f 6e 65 20 41      9     {one A
3490: 4e 44 20 74 77 6f 7d 0a 20 20 20 20 31 30 20 20  ND two}.    10  
34a0: 20 20 7b 6f 6e 65 20 4e 4f 54 20 74 77 6f 7d 0a    {one NOT two}.
34b0: 20 20 20 20 31 31 20 20 20 20 7b 6f 6e 65 20 41      11    {one A
34c0: 4e 44 20 74 77 6f 20 4f 52 20 74 68 72 65 65 7d  ND two OR three}
34d0: 0a 20 20 20 20 31 32 20 20 20 20 7b 74 68 72 65  .    12    {thre
34e0: 65 20 4f 52 20 6f 6e 65 20 41 4e 44 20 74 77 6f  e OR one AND two
34f0: 7d 0a 20 20 20 20 31 33 20 20 20 20 7b 28 74 68  }.    13    {(th
3500: 72 65 65 20 4f 52 20 6f 6e 65 29 20 41 4e 44 20  ree OR one) AND 
3510: 74 77 6f 7d 0a 20 20 20 20 31 34 20 20 20 20 7b  two}.    14    {
3520: 28 74 68 72 65 65 20 4f 52 20 6f 6e 65 29 20 41  (three OR one) A
3530: 4e 44 20 74 77 6f 20 4e 4f 54 20 28 66 69 76 65  ND two NOT (five
3540: 20 4e 4f 54 20 66 6f 75 72 29 7d 0a 20 20 20 20   NOT four)}.    
3550: 31 35 20 20 20 20 7b 22 6f 6e 65 20 74 77 6f 22  15    {"one two"
3560: 7d 0a 20 20 20 20 31 36 20 20 20 20 7b 22 6f 6e  }.    16    {"on
3570: 65 20 74 77 6f 22 20 4e 4f 54 20 22 74 68 72 65  e two" NOT "thre
3580: 65 20 66 6f 75 72 22 7d 0a 20 20 7d 20 7b 0a 20  e four"}.  } {. 
3590: 20 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f     do_fts3query_
35a0: 74 65 73 74 20 32 2e 24 74 6e 2e 32 2e 24 74 6e  test 2.$tn.2.$tn
35b0: 32 20 74 31 20 24 65 78 70 72 0a 20 20 7d 0a 7d  2 t1 $expr.  }.}
35c0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3610: 53 6f 6d 65 20 74 65 73 74 20 63 61 73 65 73 20  Some test cases 
3620: 69 6e 76 6f 6c 76 69 6e 67 20 64 65 66 65 72 72  involving deferr
3630: 65 64 20 74 6f 6b 65 6e 73 2e 0a 23 0a 0a 66 6f  ed tokens..#..fo
3640: 72 65 61 63 68 20 7b 74 6e 20 63 72 65 61 74 65  reach {tn create
3650: 7d 20 7b 0a 20 20 31 20 20 20 20 22 66 74 73 34  } {.  1    "fts4
3660: 28 78 29 22 0a 20 20 32 20 20 20 20 22 66 74 73  (x)".  2    "fts
3670: 34 28 78 2c 20 6f 72 64 65 72 3d 44 45 53 43 29  4(x, order=DESC)
3680: 22 0a 7d 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  ".} {.  catchsql
3690: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31   { DROP TABLE t1
36a0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 20 22 43   }.  execsql  "C
36b0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
36c0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 24 63 72  BLE t1 USING $cr
36d0: 65 61 74 65 22 0a 20 20 64 6f 5f 65 78 65 63 73  eate".  do_execs
36e0: 71 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 31 20  ql_test 3.$tn.1 
36f0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
3700: 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20 56  O t1(docid, x) V
3710: 41 4c 55 45 53 28 2d 32 2c 20 27 61 20 62 20 63  ALUES(-2, 'a b c
3720: 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b   d e f g h i j k
3730: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
3740: 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29  NTO t1(docid, x)
3750: 20 56 41 4c 55 45 53 28 2d 31 2c 20 27 62 20 63   VALUES(-1, 'b c
3760: 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b   d e f g h i j k
3770: 20 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   a');.    INSERT
3780: 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20   INTO t1(docid, 
3790: 78 29 20 56 41 4c 55 45 53 28 30 2c 20 27 63 20  x) VALUES(0, 'c 
37a0: 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20  d e f g h i j k 
37b0: 61 20 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  a b');.    INSER
37c0: 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c  T INTO t1(docid,
37d0: 20 78 29 20 56 41 4c 55 45 53 28 31 2c 20 27 64   x) VALUES(1, 'd
37e0: 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 61   e f g h i j k a
37f0: 20 62 20 63 27 29 3b 0a 20 20 20 20 49 4e 53 45   b c');.    INSE
3800: 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69 64  RT INTO t1(docid
3810: 2c 20 78 29 20 56 41 4c 55 45 53 28 32 2c 20 27  , x) VALUES(2, '
3820: 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 61 20  e f g h i j k a 
3830: 62 20 63 20 64 27 29 3b 0a 20 20 20 20 49 4e 53  b c d');.    INS
3840: 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69  ERT INTO t1(doci
3850: 64 2c 20 78 29 20 56 41 4c 55 45 53 28 33 2c 20  d, x) VALUES(3, 
3860: 27 66 20 67 20 68 20 69 20 6a 20 6b 20 61 20 62  'f g h i j k a b
3870: 20 63 20 64 20 65 27 29 3b 0a 20 20 20 20 49 4e   c d e');.    IN
3880: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63  SERT INTO t1(doc
3890: 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 34 2c  id, x) VALUES(4,
38a0: 20 27 61 20 63 20 65 20 67 20 69 20 6b 27 29 3b   'a c e g i k');
38b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
38c0: 20 74 31 28 64 6f 63 69 64 2c 20 78 29 20 56 41   t1(docid, x) VA
38d0: 4c 55 45 53 28 35 2c 20 27 61 20 64 20 67 20 6a  LUES(5, 'a d g j
38e0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
38f0: 4e 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 78 29  NTO t1(docid, x)
3900: 20 56 41 4c 55 45 53 28 36 2c 20 27 63 20 61 20   VALUES(6, 'c a 
3910: 62 27 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20  b');.  }..  set 
3920: 6c 69 6d 69 74 20 5b 66 74 73 33 5f 6d 61 6b 65  limit [fts3_make
3930: 5f 64 65 66 65 72 72 61 62 6c 65 20 74 31 20 63  _deferrable t1 c
3940: 5d 0a 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72  ]..  do_fts3quer
3950: 79 5f 74 65 73 74 20 33 2e 24 74 6e 2e 32 2e 31  y_test 3.$tn.2.1
3960: 20 74 31 20 7b 61 20 4f 52 20 63 7d 0a 0a 20 20   t1 {a OR c}..  
3970: 64 6f 5f 74 65 73 74 20 33 2e 24 74 6e 2e 33 20  do_test 3.$tn.3 
3980: 7b 20 0a 20 20 20 20 66 74 73 33 5f 7a 65 72 6f  { .    fts3_zero
3990: 5f 6c 6f 6e 67 5f 73 65 67 6d 65 6e 74 73 20 74  _long_segments t
39a0: 31 20 24 6c 69 6d 69 74 20 0a 20 20 7d 20 7b 31  1 $limit .  } {1
39b0: 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  }..  foreach {tn
39c0: 32 20 65 78 70 72 20 64 65 66 7d 20 7b 0a 20 20  2 expr def} {.  
39d0: 20 20 31 20 20 20 20 20 7b 61 20 4e 45 41 52 20    1     {a NEAR 
39e0: 63 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d  c}            {}
39f0: 0a 20 20 20 20 32 20 20 20 20 20 7b 61 20 41 4e  .    2     {a AN
3a00: 44 20 63 7d 20 20 20 20 20 20 20 20 20 20 20 20  D c}            
3a10: 20 63 0a 20 20 20 20 33 20 20 20 20 20 7b 22 61   c.    3     {"a
3a20: 20 63 22 7d 20 20 20 20 20 20 20 20 20 20 20 20   c"}            
3a30: 20 20 20 63 0a 20 20 20 20 34 20 20 20 20 20 7b     c.    4     {
3a40: 22 63 20 61 22 7d 20 20 20 20 20 20 20 20 20 20  "c a"}          
3a50: 20 20 20 20 20 63 0a 20 20 20 20 35 20 20 20 20       c.    5    
3a60: 20 7b 22 61 20 63 22 20 4e 45 41 52 2f 31 20 67   {"a c" NEAR/1 g
3a70: 7d 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 36 20  }      {}.    6 
3a80: 20 20 20 20 7b 22 61 20 63 22 20 4e 45 41 52 2f      {"a c" NEAR/
3a90: 30 20 67 7d 20 20 20 20 20 20 7b 7d 0a 20 20 7d  0 g}      {}.  }
3aa0: 20 7b 0a 20 20 20 20 64 6f 5f 66 74 73 33 71 75   {.    do_fts3qu
3ab0: 65 72 79 5f 74 65 73 74 20 33 2e 24 74 6e 2e 34  ery_test 3.$tn.4
3ac0: 2e 24 74 6e 32 20 2d 64 65 66 65 72 72 65 64 20  .$tn2 -deferred 
3ad0: 24 64 65 66 20 74 31 20 24 65 78 70 72 0a 20 20  $def t1 $expr.  
3ae0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
3af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 0a 23 20 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  .# .foreach {tn 
3b40: 63 72 65 61 74 65 7d 20 7b 0a 20 20 31 20 20 20  create} {.  1   
3b50: 20 22 66 74 73 34 28 78 2c 20 79 29 22 0a 20 20   "fts4(x, y)".  
3b60: 32 20 20 20 20 22 66 74 73 34 28 78 2c 20 79 2c  2    "fts4(x, y,
3b70: 20 6f 72 64 65 72 3d 44 45 53 43 29 22 0a 20 20   order=DESC)".  
3b80: 33 20 20 20 20 22 66 74 73 34 28 78 2c 20 79 2c  3    "fts4(x, y,
3b90: 20 6f 72 64 65 72 3d 44 45 53 43 2c 20 70 72 65   order=DESC, pre
3ba0: 66 69 78 3d 32 29 22 0a 7d 20 7b 0a 0a 20 20 65  fix=2)".} {..  e
3bb0: 78 65 63 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a  xecsql [subst {.
3bc0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
3bd0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  1;.    CREATE VI
3be0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
3bf0: 53 49 4e 47 20 24 63 72 65 61 74 65 3b 0a 20 20  SING $create;.  
3c00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3c10: 20 56 41 4c 55 45 53 28 27 6f 6e 65 20 74 77 6f   VALUES('one two
3c20: 20 66 69 76 65 20 66 6f 75 72 20 66 69 76 65 27   five four five'
3c30: 2c 20 27 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  , '');.    INSER
3c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3c50: 28 27 27 2c 20 27 6f 6e 65 20 74 77 6f 20 66 69  ('', 'one two fi
3c60: 76 65 20 66 6f 75 72 20 66 69 76 65 27 29 3b 0a  ve four five');.
3c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3c80: 74 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 20 74  t1 VALUES('one t
3c90: 77 6f 27 2c 20 27 66 69 76 65 20 66 6f 75 72 20  wo', 'five four 
3ca0: 66 69 76 65 27 29 3b 0a 20 20 7d 5d 0a 0a 20 20  five');.  }]..  
3cb0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
3cc0: 74 20 34 2e 24 74 6e 2e 31 2e 31 20 74 31 20 7b  t 4.$tn.1.1 t1 {
3cd0: 6f 6e 65 20 41 4e 44 20 66 69 76 65 7d 0a 20 20  one AND five}.  
3ce0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
3cf0: 74 20 34 2e 24 74 6e 2e 31 2e 32 20 74 31 20 7b  t 4.$tn.1.2 t1 {
3d00: 6f 6e 65 20 4e 45 41 52 20 66 69 76 65 7d 0a 20  one NEAR five}. 
3d10: 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65   do_fts3query_te
3d20: 73 74 20 34 2e 24 74 6e 2e 31 2e 33 20 74 31 20  st 4.$tn.1.3 t1 
3d30: 7b 6f 6e 65 20 4e 45 41 52 2f 31 20 66 69 76 65  {one NEAR/1 five
3d40: 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79  }.  do_fts3query
3d50: 5f 74 65 73 74 20 34 2e 24 74 6e 2e 31 2e 34 20  _test 4.$tn.1.4 
3d60: 74 31 20 7b 6f 6e 65 20 4e 45 41 52 2f 32 20 66  t1 {one NEAR/2 f
3d70: 69 76 65 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75  ive}.  do_fts3qu
3d80: 65 72 79 5f 74 65 73 74 20 34 2e 24 74 6e 2e 31  ery_test 4.$tn.1
3d90: 2e 35 20 74 31 20 7b 6f 6e 65 20 4e 45 41 52 2f  .5 t1 {one NEAR/
3da0: 33 20 66 69 76 65 7d 0a 0a 20 20 64 6f 5f 74 65  3 five}..  do_te
3db0: 73 74 20 34 2e 24 74 6e 2e 32 20 7b 20 0a 20 20  st 4.$tn.2 { .  
3dc0: 20 20 73 65 74 20 6c 69 6d 69 74 20 5b 66 74 73    set limit [fts
3dd0: 33 5f 6d 61 6b 65 5f 64 65 66 65 72 72 61 62 6c  3_make_deferrabl
3de0: 65 20 74 31 20 66 69 76 65 5d 0a 20 20 20 20 65  e t1 five].    e
3df0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
3e00: 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55  INTO t1(t1) VALU
3e10: 45 53 28 27 6f 70 74 69 6d 69 7a 65 27 29 20 7d  ES('optimize') }
3e20: 0a 20 20 20 20 65 78 70 72 20 7b 5b 66 74 73 33  .    expr {[fts3
3e30: 5f 7a 65 72 6f 5f 6c 6f 6e 67 5f 73 65 67 6d 65  _zero_long_segme
3e40: 6e 74 73 20 74 31 20 24 6c 69 6d 69 74 5d 3e 30  nts t1 $limit]>0
3e50: 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20 64 6f 5f  }.  } {1}..  do_
3e60: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34  fts3query_test 4
3e70: 2e 24 74 6e 2e 33 2e 31 20 2d 64 65 66 65 72 72  .$tn.3.1 -deferr
3e80: 65 64 20 66 69 76 65 20 74 31 20 7b 6f 6e 65 20  ed five t1 {one 
3e90: 41 4e 44 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66  AND five}.  do_f
3ea0: 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e  ts3query_test 4.
3eb0: 24 74 6e 2e 33 2e 32 20 2d 64 65 66 65 72 72 65  $tn.3.2 -deferre
3ec0: 64 20 66 69 76 65 20 74 31 20 7b 6f 6e 65 20 4e  d five t1 {one N
3ed0: 45 41 52 20 66 69 76 65 7d 0a 20 20 64 6f 5f 66  EAR five}.  do_f
3ee0: 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 34 2e  ts3query_test 4.
3ef0: 24 74 6e 2e 33 2e 33 20 2d 64 65 66 65 72 72 65  $tn.3.3 -deferre
3f00: 64 20 66 69 76 65 20 74 31 20 7b 6f 6e 65 20 4e  d five t1 {one N
3f10: 45 41 52 2f 31 20 66 69 76 65 7d 0a 20 20 64 6f  EAR/1 five}.  do
3f20: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
3f30: 34 2e 24 74 6e 2e 33 2e 34 20 2d 64 65 66 65 72  4.$tn.3.4 -defer
3f40: 72 65 64 20 66 69 76 65 20 74 31 20 7b 6f 6e 65  red five t1 {one
3f50: 20 4e 45 41 52 2f 32 20 66 69 76 65 7d 0a 20 20   NEAR/2 five}.  
3f60: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
3f70: 74 20 34 2e 24 74 6e 2e 33 2e 35 20 2d 64 65 66  t 4.$tn.3.5 -def
3f80: 65 72 72 65 64 20 66 69 76 65 20 74 31 20 7b 6f  erred five t1 {o
3f90: 6e 65 20 4e 45 41 52 2f 33 20 66 69 76 65 7d 0a  ne NEAR/3 five}.
3fa0: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
3fb0: 74 65 73 74 20 34 2e 24 74 6e 2e 34 2e 31 20 2d  test 4.$tn.4.1 -
3fc0: 64 65 66 65 72 72 65 64 20 66 69 2a 20 74 31 20  deferred fi* t1 
3fd0: 7b 6f 6e 2a 20 41 4e 44 20 66 69 2a 7d 0a 20 20  {on* AND fi*}.  
3fe0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
3ff0: 74 20 34 2e 24 74 6e 2e 34 2e 32 20 2d 64 65 66  t 4.$tn.4.2 -def
4000: 65 72 72 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e  erred fi* t1 {on
4010: 2a 20 4e 45 41 52 20 66 69 2a 7d 0a 20 20 64 6f  * NEAR fi*}.  do
4020: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
4030: 34 2e 24 74 6e 2e 34 2e 33 20 2d 64 65 66 65 72  4.$tn.4.3 -defer
4040: 72 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20  red fi* t1 {on* 
4050: 4e 45 41 52 2f 31 20 66 69 2a 7d 0a 20 20 64 6f  NEAR/1 fi*}.  do
4060: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
4070: 34 2e 24 74 6e 2e 34 2e 34 20 2d 64 65 66 65 72  4.$tn.4.4 -defer
4080: 72 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20  red fi* t1 {on* 
4090: 4e 45 41 52 2f 32 20 66 69 2a 7d 0a 20 20 64 6f  NEAR/2 fi*}.  do
40a0: 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20  _fts3query_test 
40b0: 34 2e 24 74 6e 2e 34 2e 35 20 2d 64 65 66 65 72  4.$tn.4.5 -defer
40c0: 72 65 64 20 66 69 2a 20 74 31 20 7b 6f 6e 2a 20  red fi* t1 {on* 
40d0: 4e 45 41 52 2f 33 20 66 69 2a 7d 0a 7d 0a 0a 23  NEAR/3 fi*}.}..#
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
4130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
4140: 63 61 73 65 73 20 2d 20 66 74 73 33 61 75 74 6f  cases - fts3auto
4150: 2d 35 2e 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20  -5.* - focus on 
4160: 75 73 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64  using prefix ind
4170: 65 78 65 73 2e 0a 23 0a 73 65 74 20 63 68 75 6e  exes..#.set chun
4180: 6b 63 6f 6e 66 69 67 20 5b 66 74 73 33 5f 63 6f  kconfig [fts3_co
4190: 6e 66 69 67 75 72 65 5f 69 6e 63 72 5f 6c 6f 61  nfigure_incr_loa
41a0: 64 20 31 20 31 5d 0a 66 6f 72 65 61 63 68 20 7b  d 1 1].foreach {
41b0: 74 6e 20 63 72 65 61 74 65 7d 20 7b 0a 20 20 31  tn create} {.  1
41c0: 20 20 20 20 22 66 74 73 34 28 61 2c 20 62 29 22      "fts4(a, b)"
41d0: 0a 20 20 32 20 20 20 20 22 66 74 73 34 28 61 2c  .  2    "fts4(a,
41e0: 20 62 2c 20 6f 72 64 65 72 3d 44 45 53 43 2c 20   b, order=DESC, 
41f0: 70 72 65 66 69 78 3d 31 29 22 0a 20 20 33 20 20  prefix=1)".  3  
4200: 20 20 22 66 74 73 34 28 61 2c 20 62 2c 20 6f 72    "fts4(a, b, or
4210: 64 65 72 3d 41 53 43 2c 20 20 70 72 65 66 69 78  der=ASC,  prefix
4220: 3d 31 2c 33 29 22 0a 20 20 34 20 20 20 20 22 66  =1,3)".  4    "f
4230: 74 73 34 28 61 2c 20 62 2c 20 6f 72 64 65 72 3d  ts4(a, b, order=
4240: 44 45 53 43 2c 20 70 72 65 66 69 78 3d 32 2c 34  DESC, prefix=2,4
4250: 29 22 0a 7d 20 7b 0a 0a 20 20 65 78 65 63 73 71  )".} {..  execsq
4260: 6c 20 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 44  l [subst {.    D
4270: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
4280: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
4290: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
42a0: 24 63 72 65 61 74 65 3b 0a 20 20 7d 5d 0a 0a 20  $create;.  }].. 
42b0: 20 66 6f 72 65 61 63 68 20 7b 61 20 62 7d 20 7b   foreach {a b} {
42c0: 0a 20 20 20 20 22 74 68 65 20 73 6f 6e 67 20 6f  .    "the song o
42d0: 66 20 73 6f 6e 67 73 20 77 68 69 63 68 20 69 73  f songs which is
42e0: 20 73 6f 6c 6f 6d 6f 6e 73 22 0a 20 20 20 20 22   solomons".    "
42f0: 6c 65 74 20 68 69 6d 20 6b 69 73 73 20 6d 65 20  let him kiss me 
4300: 77 69 74 68 20 74 68 65 20 6b 69 73 73 65 73 20  with the kisses 
4310: 6f 66 20 68 69 73 20 6d 6f 75 74 68 20 66 6f 72  of his mouth for
4320: 20 74 68 79 20 6c 6f 76 65 20 69 73 20 62 65 74   thy love is bet
4330: 74 65 72 20 74 68 61 6e 20 77 69 6e 65 22 0a 20  ter than wine". 
4340: 20 20 20 22 62 65 63 61 75 73 65 20 6f 66 20 74     "because of t
4350: 68 65 20 73 61 76 6f 75 72 20 6f 66 20 74 68 79  he savour of thy
4360: 20 67 6f 6f 64 20 6f 69 6e 74 6d 65 6e 74 73 20   good ointments 
4370: 74 68 79 20 6e 61 6d 65 20 69 73 20 61 73 20 6f  thy name is as o
4380: 69 6e 74 6d 65 6e 74 20 70 6f 75 72 65 64 20 66  intment poured f
4390: 6f 72 74 68 20 74 68 65 72 65 66 6f 72 65 20 64  orth therefore d
43a0: 6f 20 74 68 65 20 76 69 72 67 69 6e 73 20 6c 6f  o the virgins lo
43b0: 76 65 20 74 68 65 65 22 0a 20 20 20 20 22 64 72  ve thee".    "dr
43c0: 61 77 20 6d 65 20 77 65 20 77 69 6c 6c 20 72 75  aw me we will ru
43d0: 6e 20 61 66 74 65 72 20 74 68 65 65 20 74 68 65  n after thee the
43e0: 20 6b 69 6e 67 20 68 61 74 68 20 62 72 6f 75 67   king hath broug
43f0: 68 74 20 6d 65 20 69 6e 74 6f 20 68 69 73 20 63  ht me into his c
4400: 68 61 6d 62 65 72 73 20 77 65 20 77 69 6c 6c 20  hambers we will 
4410: 62 65 20 67 6c 61 64 20 61 6e 64 20 72 65 6a 6f  be glad and rejo
4420: 69 63 65 20 69 6e 20 74 68 65 65 20 77 65 20 77  ice in thee we w
4430: 69 6c 6c 20 72 65 6d 65 6d 62 65 72 20 74 68 79  ill remember thy
4440: 20 6c 6f 76 65 20 6d 6f 72 65 20 74 68 61 6e 20   love more than 
4450: 77 69 6e 65 20 74 68 65 20 75 70 72 69 67 68 74  wine the upright
4460: 20 6c 6f 76 65 20 74 68 65 65 22 0a 20 20 20 20   love thee".    
4470: 22 69 20 61 6d 20 62 6c 61 63 6b 20 62 75 74 20  "i am black but 
4480: 63 6f 6d 65 6c 79 20 6f 20 79 65 20 64 61 75 67  comely o ye daug
4490: 68 74 65 72 73 20 6f 66 20 6a 65 72 75 73 61 6c  hters of jerusal
44a0: 65 6d 20 61 73 20 74 68 65 20 74 65 6e 74 73 20  em as the tents 
44b0: 6f 66 20 6b 65 64 61 72 20 61 73 20 74 68 65 20  of kedar as the 
44c0: 63 75 72 74 61 69 6e 73 20 6f 66 20 73 6f 6c 6f  curtains of solo
44d0: 6d 6f 6e 22 0a 20 20 20 20 22 6c 6f 6f 6b 20 6e  mon".    "look n
44e0: 6f 74 20 75 70 6f 6e 20 6d 65 20 62 65 63 61 75  ot upon me becau
44f0: 73 65 20 69 20 61 6d 20 62 6c 61 63 6b 20 62 65  se i am black be
4500: 63 61 75 73 65 20 74 68 65 20 73 75 6e 20 68 61  cause the sun ha
4510: 74 68 20 6c 6f 6f 6b 65 64 20 75 70 6f 6e 20 6d  th looked upon m
4520: 65 20 6d 79 20 6d 6f 74 68 65 72 73 20 63 68 69  e my mothers chi
4530: 6c 64 72 65 6e 20 77 65 72 65 20 61 6e 67 72 79  ldren were angry
4540: 20 77 69 74 68 20 6d 65 20 74 68 65 79 20 6d 61   with me they ma
4550: 64 65 20 6d 65 20 74 68 65 20 6b 65 65 70 65 72  de me the keeper
4560: 20 6f 66 20 74 68 65 20 76 69 6e 65 79 61 72 64   of the vineyard
4570: 73 20 62 75 74 20 6d 69 6e 65 20 6f 77 6e 20 76  s but mine own v
4580: 69 6e 65 79 61 72 64 20 68 61 76 65 20 69 20 6e  ineyard have i n
4590: 6f 74 20 6b 65 70 74 22 0a 20 20 20 20 22 74 65  ot kept".    "te
45a0: 6c 6c 20 6d 65 20 6f 20 74 68 6f 75 20 77 68 6f  ll me o thou who
45b0: 6d 20 6d 79 20 73 6f 75 6c 20 6c 6f 76 65 74 68  m my soul loveth
45c0: 20 77 68 65 72 65 20 74 68 6f 75 20 66 65 65 64   where thou feed
45d0: 65 73 74 20 77 68 65 72 65 20 74 68 6f 75 20 6d  est where thou m
45e0: 61 6b 65 73 74 20 74 68 79 20 66 6c 6f 63 6b 20  akest thy flock 
45f0: 74 6f 20 72 65 73 74 20 61 74 20 6e 6f 6f 6e 20  to rest at noon 
4600: 66 6f 72 20 77 68 79 20 73 68 6f 75 6c 64 20 69  for why should i
4610: 20 62 65 20 61 73 20 6f 6e 65 20 74 68 61 74 20   be as one that 
4620: 74 75 72 6e 65 74 68 20 61 73 69 64 65 20 62 79  turneth aside by
4630: 20 74 68 65 20 66 6c 6f 63 6b 73 20 6f 66 20 74   the flocks of t
4640: 68 79 20 63 6f 6d 70 61 6e 69 6f 6e 73 3f 22 0a  hy companions?".
4650: 20 20 20 20 22 69 66 20 74 68 6f 75 20 6b 6e 6f      "if thou kno
4660: 77 20 6e 6f 74 20 6f 20 74 68 6f 75 20 66 61 69  w not o thou fai
4670: 72 65 73 74 20 61 6d 6f 6e 67 20 77 6f 6d 65 6e  rest among women
4680: 20 67 6f 20 74 68 79 20 77 61 79 20 66 6f 72 74   go thy way fort
4690: 68 20 62 79 20 74 68 65 20 66 6f 6f 74 73 74 65  h by the footste
46a0: 70 73 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  ps of the flock 
46b0: 61 6e 64 20 66 65 65 64 20 74 68 79 20 6b 69 64  and feed thy kid
46c0: 73 20 62 65 73 69 64 65 20 74 68 65 20 73 68 65  s beside the she
46d0: 70 68 65 72 64 73 20 74 65 6e 74 73 22 0a 20 20  pherds tents".  
46e0: 20 20 22 69 20 68 61 76 65 20 63 6f 6d 70 61 72    "i have compar
46f0: 65 64 20 74 68 65 65 20 6f 20 6d 79 20 6c 6f 76  ed thee o my lov
4700: 65 20 74 6f 20 61 20 63 6f 6d 70 61 6e 79 20 6f  e to a company o
4710: 66 20 68 6f 72 73 65 73 20 69 6e 20 70 68 61 72  f horses in phar
4720: 61 6f 68 73 20 63 68 61 72 69 6f 74 73 22 0a 20  aohs chariots". 
4730: 20 20 20 22 74 68 79 20 63 68 65 65 6b 73 20 61     "thy cheeks a
4740: 72 65 20 63 6f 6d 65 6c 79 20 77 69 74 68 20 72  re comely with r
4750: 6f 77 73 20 6f 66 20 6a 65 77 65 6c 73 20 74 68  ows of jewels th
4760: 79 20 6e 65 63 6b 20 77 69 74 68 20 63 68 61 69  y neck with chai
4770: 6e 73 20 6f 66 20 67 6f 6c 64 22 0a 20 20 20 20  ns of gold".    
4780: 22 77 65 20 77 69 6c 6c 20 6d 61 6b 65 20 74 68  "we will make th
4790: 65 65 20 62 6f 72 64 65 72 73 20 6f 66 20 67 6f  ee borders of go
47a0: 6c 64 20 77 69 74 68 20 73 74 75 64 73 20 6f 66  ld with studs of
47b0: 20 73 69 6c 76 65 72 22 0a 20 20 20 20 22 77 68   silver".    "wh
47c0: 69 6c 65 20 74 68 65 20 6b 69 6e 67 20 73 69 74  ile the king sit
47d0: 74 65 74 68 20 61 74 20 68 69 73 20 74 61 62 6c  teth at his tabl
47e0: 65 20 6d 79 20 73 70 69 6b 65 6e 61 72 64 20 73  e my spikenard s
47f0: 65 6e 64 65 74 68 20 66 6f 72 74 68 20 74 68 65  endeth forth the
4800: 20 73 6d 65 6c 6c 20 74 68 65 72 65 6f 66 22 0a   smell thereof".
4810: 20 20 20 20 22 61 20 62 75 6e 64 6c 65 20 6f 66      "a bundle of
4820: 20 6d 79 72 72 68 20 69 73 20 6d 79 20 77 65 6c   myrrh is my wel
4830: 6c 62 65 6c 6f 76 65 64 20 75 6e 74 6f 20 6d 65  lbeloved unto me
4840: 20 68 65 20 73 68 61 6c 6c 20 6c 69 65 20 61 6c   he shall lie al
4850: 6c 20 6e 69 67 68 74 20 62 65 74 77 69 78 74 20  l night betwixt 
4860: 6d 79 20 62 72 65 61 73 74 73 22 0a 20 20 20 20  my breasts".    
4870: 22 6d 79 20 62 65 6c 6f 76 65 64 20 69 73 20 75  "my beloved is u
4880: 6e 74 6f 20 6d 65 20 61 73 20 61 20 63 6c 75 73  nto me as a clus
4890: 74 65 72 20 6f 66 20 63 61 6d 70 68 69 72 65 20  ter of camphire 
48a0: 69 6e 20 74 68 65 20 76 69 6e 65 79 61 72 64 73  in the vineyards
48b0: 20 6f 66 20 65 6e 20 67 65 64 69 22 0a 20 20 20   of en gedi".   
48c0: 20 22 62 65 68 6f 6c 64 20 74 68 6f 75 20 61 72   "behold thou ar
48d0: 74 20 66 61 69 72 20 6d 79 20 6c 6f 76 65 20 62  t fair my love b
48e0: 65 68 6f 6c 64 20 74 68 6f 75 20 61 72 74 20 66  ehold thou art f
48f0: 61 69 72 20 74 68 6f 75 20 68 61 73 74 20 64 6f  air thou hast do
4900: 76 65 73 20 65 79 65 73 22 0a 20 20 20 20 22 62  ves eyes".    "b
4910: 65 68 6f 6c 64 20 74 68 6f 75 20 61 72 74 20 66  ehold thou art f
4920: 61 69 72 20 6d 79 20 62 65 6c 6f 76 65 64 20 79  air my beloved y
4930: 65 61 20 70 6c 65 61 73 61 6e 74 20 61 6c 73 6f  ea pleasant also
4940: 20 6f 75 72 20 62 65 64 20 69 73 20 67 72 65 65   our bed is gree
4950: 6e 22 0a 20 20 20 20 22 74 68 65 20 62 65 61 6d  n".    "the beam
4960: 73 20 6f 66 20 6f 75 72 20 68 6f 75 73 65 20 61  s of our house a
4970: 72 65 20 63 65 64 61 72 20 61 6e 64 20 6f 75 72  re cedar and our
4980: 20 72 61 66 74 65 72 73 20 6f 66 20 66 69 72 22   rafters of fir"
4990: 0a 20 20 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  .  } {.    execs
49a0: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
49b0: 74 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28  t1(a, b) VALUES(
49c0: 24 61 2c 20 24 62 29 7d 0a 20 20 7d 0a 0a 20 20  $a, $b)}.  }..  
49d0: 64 6f 5f 66 74 73 33 71 75 65 72 79 5f 74 65 73  do_fts3query_tes
49e0: 74 20 35 2e 24 74 6e 2e 31 2e 31 20 74 31 20 7b  t 5.$tn.1.1 t1 {
49f0: 73 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71 75 65  s*}.  do_fts3que
4a00: 72 79 5f 74 65 73 74 20 35 2e 24 74 6e 2e 31 2e  ry_test 5.$tn.1.
4a10: 32 20 74 31 20 7b 73 6f 2a 7d 0a 20 20 64 6f 5f  2 t1 {so*}.  do_
4a20: 66 74 73 33 71 75 65 72 79 5f 74 65 73 74 20 35  fts3query_test 5
4a30: 2e 24 74 6e 2e 31 2e 33 20 74 31 20 7b 22 73 2a  .$tn.1.3 t1 {"s*
4a40: 20 6f 2a 22 7d 0a 20 20 64 6f 5f 66 74 73 33 71   o*"}.  do_fts3q
4a50: 75 65 72 79 5f 74 65 73 74 20 35 2e 24 74 6e 2e  uery_test 5.$tn.
4a60: 31 2e 34 20 74 31 20 7b 62 2a 20 4e 45 41 52 2f  1.4 t1 {b* NEAR/
4a70: 33 20 61 2a 7d 0a 20 20 64 6f 5f 66 74 73 33 71  3 a*}.  do_fts3q
4a80: 75 65 72 79 5f 74 65 73 74 20 35 2e 24 74 6e 2e  uery_test 5.$tn.
4a90: 31 2e 35 20 74 31 20 7b 74 68 2a 20 4e 45 41 52  1.5 t1 {th* NEAR
4aa0: 2f 35 20 61 2a 20 4e 45 41 52 2f 35 20 77 2a 7d  /5 a* NEAR/5 w*}
4ab0: 0a 20 20 64 6f 5f 66 74 73 33 71 75 65 72 79 5f  .  do_fts3query_
4ac0: 74 65 73 74 20 35 2e 24 74 6e 2e 31 2e 36 20 74  test 5.$tn.1.6 t
4ad0: 31 20 7b 22 62 2a 20 74 68 2a 20 61 72 74 2a 20  1 {"b* th* art* 
4ae0: 66 61 69 72 2a 22 7d 0a 7d 0a 65 76 61 6c 20 66  fair*"}.}.eval f
4af0: 74 73 33 5f 63 6f 6e 66 69 67 75 72 65 5f 69 6e  ts3_configure_in
4b00: 63 72 5f 6c 6f 61 64 20 24 63 68 75 6e 6b 63 6f  cr_load $chunkco
4b10: 6e 66 69 67 0a 0a 73 65 74 20 73 71 6c 69 74 65  nfig..set sqlite
4b20: 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
4b30: 65 6e 74 68 65 73 65 73 20 24 73 66 65 70 0a 66  entheses $sfep.f
4b40: 69 6e 69 73 68 5f 74 65 73 74 0a 0a              inish_test..