/ Hex Artifact Content
Login

Artifact 1320d8826a845e38a96e769562bf83d7a92a15d0:


0000: 23 20 32 30 30 39 20 44 65 63 65 6d 62 65 72 20  # 2009 December 
0010: 30 33 0a 23 0a 23 20 20 20 20 4d 61 79 20 79 6f  03.#.#    May yo
0020: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0030: 74 20 65 76 69 6c 2e 0a 23 20 20 20 20 4d 61 79  t evil..#    May
0040: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
0050: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
0060: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
0070: 74 68 65 72 73 2e 0a 23 20 20 20 20 4d 61 79 20  thers..#    May 
0080: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0090: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
00a0: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
00b0: 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..#.#**********
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 2a 2a 2a 2a 0a 23 0a  *************.#.
0100: 23 20 42 72 75 74 65 20 66 6f 72 63 65 20 28 72  # Brute force (r
0110: 61 6e 64 6f 6d 20 64 61 74 61 29 20 74 65 73 74  andom data) test
0120: 73 20 66 6f 72 20 46 54 53 33 2e 0a 23 0a 0a 23  s for FTS3..#..#
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 54 68  ---------.#.# Th
0180: 65 20 46 54 53 33 20 74 65 73 74 73 20 69 6d 70  e FTS3 tests imp
0190: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 69 73  lemented in this
01a0: 20 66 69 6c 65 20 66 6f 63 75 73 20 6f 6e 20 74   file focus on t
01b0: 65 73 74 69 6e 67 20 74 68 61 74 20 46 54 53 33  esting that FTS3
01c0: 0a 23 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  .# returns the c
01d0: 6f 72 72 65 63 74 20 73 65 74 20 6f 66 20 64 6f  orrect set of do
01e0: 63 75 6d 65 6e 74 73 20 66 6f 72 20 76 61 72 69  cuments for vari
01f0: 6f 75 73 20 74 79 70 65 73 20 6f 66 20 66 75 6c  ous types of ful
0200: 6c 2d 74 65 78 74 0a 23 20 71 75 65 72 79 2e 20  l-text.# query. 
0210: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 75 73 69  This is done usi
0220: 6e 67 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  ng pseudo-random
0230: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 64 61 74  ly generated dat
0240: 61 20 61 6e 64 20 71 75 65 72 69 65 73 2e 0a 23  a and queries..#
0250: 20 54 68 65 20 65 78 70 65 63 74 65 64 20 72 65   The expected re
0260: 73 75 6c 74 20 6f 66 20 65 61 63 68 20 71 75 65  sult of each que
0270: 72 79 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  ry is calculated
0280: 20 75 73 69 6e 67 20 54 63 6c 20 63 6f 64 65 2e   using Tcl code.
0290: 0a 23 0a 23 20 20 20 31 2e 20 54 68 65 20 64 61  .#.#   1. The da
02a0: 74 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61  tabase is initia
02b0: 6c 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  lized to contain
02c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
02d0: 77 69 74 68 20 74 68 72 65 65 0a 23 20 20 20 20  with three.#    
02e0: 20 20 63 6f 6c 75 6d 6e 73 2e 20 31 30 30 20 72    columns. 100 r
02f0: 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74 65 64  ows are inserted
0300: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2e   into the table.
0310: 20 45 61 63 68 20 6f 66 20 74 68 65 20 74 68 72   Each of the thr
0320: 65 65 0a 23 20 20 20 20 20 20 76 61 6c 75 65 73  ee.#      values
0330: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 69 73 20   in each row is 
0340: 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 73 69  a document consi
0350: 73 74 69 6e 67 20 6f 66 20 62 65 74 77 65 65 6e  sting of between
0360: 20 30 20 61 6e 64 20 31 30 30 0a 23 20 20 20 20   0 and 100.#    
0370: 20 20 74 65 72 6d 73 2e 20 54 65 72 6d 73 20 61    terms. Terms a
0380: 72 65 20 73 65 6c 65 63 74 65 64 20 66 72 6f 6d  re selected from
0390: 20 61 20 76 6f 63 61 62 75 6c 61 72 79 20 6f 66   a vocabulary of
03a0: 20 24 47 28 6e 56 6f 63 61 62 29 20 74 65 72 6d   $G(nVocab) term
03b0: 73 2e 0a 23 0a 23 20 20 20 32 2e 20 54 68 65 20  s..#.#   2. The 
03c0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 70 65 72  following is per
03d0: 66 6f 72 6d 65 64 20 31 30 30 20 74 69 6d 65 73  formed 100 times
03e0: 3a 0a 23 0a 23 20 20 20 20 20 20 61 2e 20 41 20  :.#.#      a. A 
03f0: 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20  row is inserted 
0400: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
0410: 65 2e 20 54 68 65 20 72 6f 77 20 63 6f 6e 74 65  e. The row conte
0420: 6e 74 73 20 61 72 65 20 0a 23 20 20 20 20 20 20  nts are .#      
0430: 20 20 20 67 65 6e 65 72 61 74 65 64 20 61 73 20     generated as 
0440: 69 6e 20 73 74 65 70 20 31 2e 20 54 68 65 20 64  in step 1. The d
0450: 6f 63 69 64 20 69 73 20 61 20 70 73 65 75 64 6f  ocid is a pseudo
0460: 2d 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74  -randomly select
0470: 65 64 0a 23 20 20 20 20 20 20 20 20 20 76 61 6c  ed.#         val
0480: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  ue between 0 and
0490: 20 31 30 30 30 30 30 30 2e 0a 23 20 0a 23 20 20   1000000..# .#  
04a0: 20 20 20 20 62 2e 20 41 20 70 73 75 65 64 6f 2d      b. A psuedo-
04b0: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
04c0: 64 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  d row is updated
04d0: 2e 20 4f 6e 65 20 6f 66 20 69 74 73 20 63 6f 6c  . One of its col
04e0: 75 6d 6e 73 20 69 73 0a 23 20 20 20 20 20 20 20  umns is.#       
04f0: 20 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e    set to contain
0500: 20 61 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 20   a new document 
0510: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
0520: 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65   same way as the
0530: 0a 23 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d  .#         docum
0540: 65 6e 74 73 20 69 6e 20 73 74 65 70 20 31 2e 0a  ents in step 1..
0550: 23 20 0a 23 20 20 20 20 20 20 63 2e 20 41 20 70  # .#      c. A p
0560: 73 75 65 64 6f 2d 72 61 6e 64 6f 6d 6c 79 20 73  suedo-randomly s
0570: 65 6c 65 63 74 65 64 20 72 6f 77 20 69 73 20 64  elected row is d
0580: 65 6c 65 74 65 64 2e 0a 23 20 0a 23 20 20 20 20  eleted..# .#    
0590: 20 20 64 2e 20 46 6f 72 20 65 61 63 68 20 6f 66    d. For each of
05a0: 20 73 65 76 65 72 61 6c 20 74 79 70 65 73 20 6f   several types o
05b0: 66 20 66 74 73 33 20 71 75 65 72 69 65 73 2c 20  f fts3 queries, 
05c0: 31 30 20 53 45 4c 45 43 54 20 71 75 65 72 69 65  10 SELECT querie
05d0: 73 0a 23 20 20 20 20 20 20 20 20 20 6f 66 20 74  s.#         of t
05e0: 68 65 20 66 6f 72 6d 3a 0a 23 20 0a 23 20 20 20  he form:.# .#   
05f0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 64          SELECT d
0600: 6f 63 69 64 20 46 52 4f 4d 20 3c 74 62 6c 3e 20  ocid FROM <tbl> 
0610: 57 48 45 52 45 20 3c 74 62 6c 3e 20 4d 41 54 43  WHERE <tbl> MATC
0620: 48 20 27 3c 71 75 65 72 79 3e 27 0a 23 20 0a 23  H '<query>'.# .#
0630: 20 20 20 20 20 20 20 20 20 61 72 65 20 65 76 61           are eva
0640: 6c 75 61 74 65 64 2e 20 54 68 65 20 72 65 73 75  luated. The resu
0650: 6c 74 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  lts are compared
0660: 20 74 6f 20 74 68 6f 73 65 20 63 61 6c 63 75 6c   to those calcul
0670: 61 74 65 64 20 62 79 0a 23 20 20 20 20 20 20 20  ated by.#       
0680: 20 20 54 63 6c 20 63 6f 64 65 20 69 6e 20 74 68    Tcl code in th
0690: 69 73 20 66 69 6c 65 2e 20 54 68 65 20 70 61 74  is file. The pat
06a0: 74 65 72 6e 73 20 75 73 65 64 20 66 6f 72 20 74  terns used for t
06b0: 68 65 20 64 69 66 66 65 72 65 6e 74 20 71 75 65  he different que
06c0: 72 79 0a 23 20 20 20 20 20 20 20 20 20 74 79 70  ry.#         typ
06d0: 65 73 20 61 72 65 3a 0a 23 20 0a 23 20 20 20 20  es are:.# .#    
06e0: 20 20 20 20 20 20 20 31 2e 20 20 71 75 65 72 79         1.  query
06f0: 20 3d 20 3c 74 65 72 6d 3e 0a 23 20 20 20 20 20   = <term>.#     
0700: 20 20 20 20 20 20 32 2e 20 20 71 75 65 72 79 20        2.  query 
0710: 3d 20 3c 70 72 65 66 69 78 3e 0a 23 20 20 20 20  = <prefix>.#    
0720: 20 20 20 20 20 20 20 33 2e 20 20 71 75 65 72 79         3.  query
0730: 20 3d 20 22 3c 74 65 72 6d 3e 20 3c 74 65 72 6d   = "<term> <term
0740: 3e 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 34  >".#           4
0750: 2e 20 20 71 75 65 72 79 20 3d 20 22 3c 74 65 72  .  query = "<ter
0760: 6d 3e 20 3c 74 65 72 6d 3e 20 3c 74 65 72 6d 3e  m> <term> <term>
0770: 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 35 2e  ".#           5.
0780: 20 20 71 75 65 72 79 20 3d 20 22 3c 70 72 65 66    query = "<pref
0790: 69 78 3e 20 3c 70 72 65 66 69 78 3e 20 3c 70 72  ix> <prefix> <pr
07a0: 65 66 69 78 3e 22 0a 23 20 20 20 20 20 20 20 20  efix>".#        
07b0: 20 20 20 36 2e 20 20 71 75 65 72 79 20 3d 20 3c     6.  query = <
07c0: 74 65 72 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d  term> NEAR <term
07d0: 3e 0a 23 20 20 20 20 20 20 20 20 20 20 20 37 2e  >.#           7.
07e0: 20 20 71 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e    query = <term>
07f0: 20 4e 45 41 52 2f 31 31 20 3c 74 65 72 6d 3e 20   NEAR/11 <term> 
0800: 4e 45 41 52 2f 31 31 20 3c 74 65 72 6d 3e 0a 23  NEAR/11 <term>.#
0810: 20 20 20 20 20 20 20 20 20 20 20 38 2e 20 20 71             8.  q
0820: 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4f 52  uery = <term> OR
0830: 20 3c 74 65 72 6d 3e 0a 23 20 20 20 20 20 20 20   <term>.#       
0840: 20 20 20 20 39 2e 20 20 71 75 65 72 79 20 3d 20      9.  query = 
0850: 3c 74 65 72 6d 3e 20 4e 4f 54 20 3c 74 65 72 6d  <term> NOT <term
0860: 3e 0a 23 20 20 20 20 20 20 20 20 20 20 20 31 30  >.#           10
0870: 2e 20 71 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e  . query = <term>
0880: 20 41 4e 44 20 3c 74 65 72 6d 3e 0a 23 20 20 20   AND <term>.#   
0890: 20 20 20 20 20 20 20 20 31 31 2e 20 71 75 65 72          11. quer
08a0: 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45 41 52 20  y = <term> NEAR 
08b0: 3c 74 65 72 6d 3e 20 4f 52 20 3c 74 65 72 6d 3e  <term> OR <term>
08c0: 20 4e 45 41 52 20 3c 74 65 72 6d 3e 0a 23 20 20   NEAR <term>.#  
08d0: 20 20 20 20 20 20 20 20 20 31 32 2e 20 71 75 65           12. que
08e0: 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45 41 52  ry = <term> NEAR
08f0: 20 3c 74 65 72 6d 3e 20 4e 4f 54 20 3c 74 65 72   <term> NOT <ter
0900: 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d 3e 0a 23  m> NEAR <term>.#
0910: 20 20 20 20 20 20 20 20 20 20 20 31 33 2e 20 71             13. q
0920: 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45  uery = <term> NE
0930: 41 52 20 3c 74 65 72 6d 3e 20 41 4e 44 20 3c 74  AR <term> AND <t
0940: 65 72 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d 3e  erm> NEAR <term>
0950: 0a 23 20 0a 23 20 20 20 20 20 20 20 20 20 77 68  .# .#         wh
0960: 65 72 65 20 3c 74 65 72 6d 3e 20 69 73 20 61 20  ere <term> is a 
0970: 74 65 72 6d 20 70 73 75 65 64 6f 2d 72 61 6e 64  term psuedo-rand
0980: 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20 66 72  omly selected fr
0990: 6f 6d 20 74 68 65 20 76 6f 63 61 62 75 6c 61 72  om the vocabular
09a0: 79 0a 23 20 20 20 20 20 20 20 20 20 61 6e 64 20  y.#         and 
09b0: 70 72 65 66 69 78 20 69 73 20 74 68 65 20 66 69  prefix is the fi
09c0: 72 73 74 20 32 20 63 68 61 72 61 63 74 65 72 73  rst 2 characters
09d0: 20 6f 66 20 73 75 63 68 20 61 20 74 65 72 6d 20   of such a term 
09e0: 66 6f 6c 6c 6f 77 65 64 20 62 79 0a 23 20 20 20  followed by.#   
09f0: 20 20 20 20 20 20 61 20 22 2a 22 20 63 68 61 72        a "*" char
0a00: 61 63 74 65 72 2e 0a 23 20 20 20 20 20 0a 23 20  acter..#     .# 
0a10: 20 20 20 20 20 45 76 65 72 79 20 73 65 63 6f 6e       Every secon
0a20: 64 20 69 74 65 72 61 74 69 6f 6e 2c 20 73 74 65  d iteration, ste
0a30: 70 73 20 28 61 29 20 74 68 72 6f 75 67 68 20 28  ps (a) through (
0a40: 64 29 20 61 62 6f 76 65 20 61 72 65 20 70 65 72  d) above are per
0a50: 66 6f 72 6d 65 64 0a 23 20 20 20 20 20 20 77 69  formed.#      wi
0a60: 74 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 72  thin a single tr
0a70: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
0a80: 66 6f 72 63 65 73 20 74 68 65 20 71 75 65 72 69  forces the queri
0a90: 65 73 20 69 6e 20 28 64 29 20 74 6f 0a 23 20 20  es in (d) to.#  
0aa0: 20 20 20 20 72 65 61 64 20 64 61 74 61 20 66 72      read data fr
0ab0: 6f 6d 20 62 6f 74 68 20 74 68 65 20 64 61 74 61  om both the data
0ac0: 62 61 73 65 20 61 6e 64 20 74 68 65 20 69 6e 2d  base and the in-
0ad0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
0ae0: 65 0a 23 20 20 20 20 20 20 74 68 61 74 20 63 61  e.#      that ca
0af0: 63 68 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65  ches the full-te
0b00: 78 74 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  xt index entries
0b10: 20 63 72 65 61 74 65 64 20 62 79 20 73 74 65 70   created by step
0b20: 73 20 28 61 29 2c 20 28 62 29 0a 23 20 20 20 20  s (a), (b).#    
0b30: 20 20 61 6e 64 20 28 63 29 20 75 6e 74 69 6c 20    and (c) until 
0b40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0b50: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a  is committed..#.
0b60: 23 20 54 68 65 20 70 72 6f 63 65 64 75 72 65 20  # The procedure 
0b70: 61 62 6f 76 65 20 69 73 20 72 75 6e 20 35 20 74  above is run 5 t
0b80: 69 6d 65 73 2c 20 75 73 69 6e 67 20 61 64 76 69  imes, using advi
0b90: 73 6f 72 79 20 66 74 73 33 20 6e 6f 64 65 20 73  sory fts3 node s
0ba0: 69 7a 65 73 20 6f 66 20 35 30 2c 0a 23 20 35 30  izes of 50,.# 50
0bb0: 30 2c 20 31 30 30 30 20 61 6e 64 20 32 30 30 30  0, 1000 and 2000
0bc0: 20 62 79 74 65 73 2e 0a 23 0a 23 20 41 66 74 65   bytes..#.# Afte
0bd0: 72 20 74 68 65 20 74 65 73 74 20 75 73 69 6e 67  r the test using
0be0: 20 61 6e 20 61 64 76 69 73 6f 72 79 20 6e 6f 64   an advisory nod
0bf0: 65 2d 73 69 7a 65 20 6f 66 20 35 30 2c 20 61 6e  e-size of 50, an
0c00: 20 4f 4f 4d 20 74 65 73 74 20 69 73 20 72 75 6e   OOM test is run
0c10: 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64 61 74   using.# the dat
0c20: 61 62 61 73 65 2e 20 54 68 69 73 20 74 65 73 74  abase. This test
0c30: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
0c40: 74 65 70 20 28 64 29 20 61 62 6f 76 65 2c 20 65  tep (d) above, e
0c50: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 74 65  xcept that it te
0c60: 73 74 73 0a 23 20 74 68 65 20 65 66 66 65 63 74  sts.# the effect
0c70: 73 20 6f 66 20 74 72 61 6e 73 69 65 6e 74 20 61  s of transient a
0c80: 6e 64 20 70 65 72 73 69 73 74 65 6e 74 20 4f 4f  nd persistent OO
0c90: 4d 20 63 6f 6e 64 69 74 69 6f 6e 73 20 65 6e 63  M conditions enc
0ca0: 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 0a 23  ountered while.#
0cb0: 20 65 78 65 63 75 74 69 6e 67 20 65 61 63 68 20   executing each 
0cc0: 71 75 65 72 79 2e 0a 23 0a 0a 73 65 74 20 74 65  query..#..set te
0cd0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0ce0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0cf0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0d00: 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20 74 68 69  er.tcl..# If thi
0d10: 73 20 62 75 69 6c 64 20 64 6f 65 73 20 6e 6f 74  s build does not
0d20: 20 69 6e 63 6c 75 64 65 20 46 54 53 33 2c 20 73   include FTS3, s
0d30: 6b 69 70 20 74 68 65 20 74 65 73 74 73 20 69 6e  kip the tests in
0d40: 20 74 68 69 73 20 66 69 6c 65 2e 0a 23 0a 69 66   this file..#.if
0d50: 63 61 70 61 62 6c 65 20 21 66 74 73 33 20 7b 20  capable !fts3 { 
0d60: 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65  finish_test ; re
0d70: 74 75 72 6e 20 7d 0a 73 6f 75 72 63 65 20 24 74  turn }.source $t
0d80: 65 73 74 64 69 72 2f 66 74 73 33 5f 63 6f 6d 6d  estdir/fts3_comm
0d90: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
0da0: 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f  estdir/malloc_co
0db0: 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 47 28  mmon.tcl..set G(
0dc0: 6e 56 6f 63 61 62 29 20 31 30 30 0a 0a 73 65 74  nVocab) 100..set
0dd0: 20 6e 56 6f 63 61 62 20 31 30 30 0a 73 65 74 20   nVocab 100.set 
0de0: 6c 56 6f 63 61 62 20 5b 6c 69 73 74 5d 0a 0a 65  lVocab [list]..e
0df0: 78 70 72 20 73 72 61 6e 64 28 30 29 0a 0a 23 20  xpr srand(0)..# 
0e00: 47 65 6e 65 72 61 74 65 20 61 20 76 6f 63 61 62  Generate a vocab
0e10: 75 6c 61 72 79 20 6f 66 20 6e 56 6f 63 61 62 20  ulary of nVocab 
0e20: 77 6f 72 64 73 2e 20 45 61 63 68 20 77 6f 72 64  words. Each word
0e30: 20 69 73 20 33 20 63 68 61 72 61 63 74 65 72 73   is 3 characters
0e40: 20 6c 6f 6e 67 2e 0a 23 0a 73 65 74 20 6c 43 68   long..#.set lCh
0e50: 61 72 20 7b 61 20 62 20 63 20 64 20 65 20 66 20  ar {a b c d e f 
0e60: 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20  g h i j k l m n 
0e70: 6f 20 70 20 71 20 72 20 73 20 74 20 75 20 76 20  o p q r s t u v 
0e80: 77 20 78 20 79 20 7a 7d 0a 66 6f 72 20 7b 73 65  w x y z}.for {se
0e90: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 56  t i 0} {$i < $nV
0ea0: 6f 63 61 62 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  ocab} {incr i} {
0eb0: 0a 20 20 73 65 74 20 6c 65 6e 20 5b 65 78 70 72  .  set len [expr
0ec0: 20 69 6e 74 28 72 61 6e 64 28 29 2a 33 29 2b 32   int(rand()*3)+2
0ed0: 5d 0a 20 20 73 65 74 20 20 20 20 77 6f 72 64 20  ].  set    word 
0ee0: 5b 6c 69 6e 64 65 78 20 24 6c 43 68 61 72 20 5b  [lindex $lChar [
0ef0: 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28 29 2a  expr int(rand()*
0f00: 32 36 29 5d 5d 0a 20 20 61 70 70 65 6e 64 20 77  26)]].  append w
0f10: 6f 72 64 20 5b 6c 69 6e 64 65 78 20 24 6c 43 68  ord [lindex $lCh
0f20: 61 72 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e  ar [expr int(ran
0f30: 64 28 29 2a 32 36 29 5d 5d 0a 20 20 69 66 20 7b  d()*26)]].  if {
0f40: 24 6c 65 6e 3e 32 7d 20 7b 20 61 70 70 65 6e 64  $len>2} { append
0f50: 20 77 6f 72 64 20 5b 6c 69 6e 64 65 78 20 24 6c   word [lindex $l
0f60: 43 68 61 72 20 5b 65 78 70 72 20 69 6e 74 28 72  Char [expr int(r
0f70: 61 6e 64 28 29 2a 32 36 29 5d 5d 20 7d 0a 20 20  and()*26)]] }.  
0f80: 69 66 20 7b 24 6c 65 6e 3e 33 7d 20 7b 20 61 70  if {$len>3} { ap
0f90: 70 65 6e 64 20 77 6f 72 64 20 5b 6c 69 6e 64 65  pend word [linde
0fa0: 78 20 24 6c 43 68 61 72 20 5b 65 78 70 72 20 69  x $lChar [expr i
0fb0: 6e 74 28 72 61 6e 64 28 29 2a 32 36 29 5d 5d 20  nt(rand()*26)]] 
0fc0: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 6c 56 6f 63  }.  lappend lVoc
0fd0: 61 62 20 24 77 6f 72 64 0a 7d 0a 0a 70 72 6f 63  ab $word.}..proc
0fe0: 20 72 61 6e 64 6f 6d 5f 74 65 72 6d 20 7b 7d 20   random_term {} 
0ff0: 7b 0a 20 20 6c 69 6e 64 65 78 20 24 3a 3a 6c 56  {.  lindex $::lV
1000: 6f 63 61 62 20 5b 65 78 70 72 20 7b 69 6e 74 28  ocab [expr {int(
1010: 72 61 6e 64 28 29 2a 24 3a 3a 6e 56 6f 63 61 62  rand()*$::nVocab
1020: 29 7d 5d 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20  )}].}..# Return 
1030: 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 73 69  a document consi
1040: 73 74 69 6e 67 20 6f 66 20 24 6e 57 6f 72 64 20  sting of $nWord 
1050: 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65  arbitrarily sele
1060: 63 74 65 64 20 74 65 72 6d 73 0a 23 20 66 72 6f  cted terms.# fro
1070: 6d 20 74 68 65 20 24 3a 3a 6c 56 6f 63 61 62 20  m the $::lVocab 
1080: 6c 69 73 74 2e 0a 23 0a 70 72 6f 63 20 67 65 6e  list..#.proc gen
1090: 65 72 61 74 65 5f 64 6f 63 20 7b 6e 57 6f 72 64  erate_doc {nWord
10a0: 7d 20 7b 0a 20 20 73 65 74 20 64 6f 63 20 5b 6c  } {.  set doc [l
10b0: 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  ist].  for {set 
10c0: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 57 6f 72  i 0} {$i < $nWor
10d0: 64 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  d} {incr i} {.  
10e0: 20 20 6c 61 70 70 65 6e 64 20 64 6f 63 20 5b 72    lappend doc [r
10f0: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 7d 0a  andom_term].  }.
1100: 20 20 72 65 74 75 72 6e 20 24 64 6f 63 0a 7d 0a    return $doc.}.
1110: 0a 0a 0a 23 20 50 72 69 6d 69 74 69 76 65 73 20  ...# Primitives 
1120: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 61  to update the ta
1130: 62 6c 65 2e 0a 23 0a 75 6e 73 65 74 20 2d 6e 6f  ble..#.unset -no
1140: 63 6f 6d 70 6c 61 69 6e 20 74 31 0a 70 72 6f 63  complain t1.proc
1150: 20 69 6e 73 65 72 74 5f 72 6f 77 20 7b 72 6f 77   insert_row {row
1160: 69 64 7d 20 7b 0a 20 20 73 65 74 20 61 20 5b 67  id} {.  set a [g
1170: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70  enerate_doc [exp
1180: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30  r int((rand()*10
1190: 30 29 29 5d 5d 0a 20 20 73 65 74 20 62 20 5b 67  0))]].  set b [g
11a0: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70  enerate_doc [exp
11b0: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30  r int((rand()*10
11c0: 30 29 29 5d 5d 0a 20 20 73 65 74 20 63 20 5b 67  0))]].  set c [g
11d0: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70  enerate_doc [exp
11e0: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30  r int((rand()*10
11f0: 30 29 29 5d 5d 0a 20 20 65 78 65 63 73 71 6c 20  0))]].  execsql 
1200: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
1210: 28 64 6f 63 69 64 2c 20 61 2c 20 62 2c 20 63 29  (docid, a, b, c)
1220: 20 56 41 4c 55 45 53 28 24 72 6f 77 69 64 2c 20   VALUES($rowid, 
1230: 24 61 2c 20 24 62 2c 20 24 63 29 20 7d 0a 20 20  $a, $b, $c) }.  
1240: 73 65 74 20 3a 3a 74 31 28 24 72 6f 77 69 64 29  set ::t1($rowid)
1250: 20 5b 6c 69 73 74 20 24 61 20 24 62 20 24 63 5d   [list $a $b $c]
1260: 0a 7d 0a 70 72 6f 63 20 64 65 6c 65 74 65 5f 72  .}.proc delete_r
1270: 6f 77 20 7b 72 6f 77 69 64 7d 20 7b 0a 20 20 65  ow {rowid} {.  e
1280: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
1290: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
12a0: 77 69 64 20 3d 20 24 72 6f 77 69 64 20 7d 0a 20  wid = $rowid }. 
12b0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a   catch {unset ::
12c0: 74 31 28 24 72 6f 77 69 64 29 7d 0a 7d 0a 70 72  t1($rowid)}.}.pr
12d0: 6f 63 20 75 70 64 61 74 65 5f 72 6f 77 20 7b 72  oc update_row {r
12e0: 6f 77 69 64 7d 20 7b 0a 20 20 73 65 74 20 63 6f  owid} {.  set co
12f0: 6c 73 20 7b 61 20 62 20 63 7d 0a 20 20 73 65 74  ls {a b c}.  set
1300: 20 69 43 6f 6c 20 5b 65 78 70 72 20 69 6e 74 28   iCol [expr int(
1310: 72 61 6e 64 28 29 2a 33 29 5d 0a 20 20 73 65 74  rand()*3)].  set
1320: 20 64 6f 63 20 20 5b 67 65 6e 65 72 61 74 65 5f   doc  [generate_
1330: 64 6f 63 20 5b 65 78 70 72 20 69 6e 74 28 28 72  doc [expr int((r
1340: 61 6e 64 28 29 2a 31 30 30 29 29 5d 5d 0a 20 20  and()*100))]].  
1350: 6c 73 65 74 20 3a 3a 74 31 28 24 72 6f 77 69 64  lset ::t1($rowid
1360: 29 20 24 69 43 6f 6c 20 24 64 6f 63 0a 20 20 65  ) $iCol $doc.  e
1370: 78 65 63 73 71 6c 20 22 55 50 44 41 54 45 20 74  xecsql "UPDATE t
1380: 31 20 53 45 54 20 5b 6c 69 6e 64 65 78 20 24 63  1 SET [lindex $c
1390: 6f 6c 73 20 24 69 43 6f 6c 5d 20 3d 20 5c 24 64  ols $iCol] = \$d
13a0: 6f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  oc WHERE rowid =
13b0: 20 5c 24 72 6f 77 69 64 22 0a 7d 0a 0a 70 72 6f   \$rowid".}..pro
13c0: 63 20 73 69 6d 70 6c 65 5f 70 68 72 61 73 65 20  c simple_phrase 
13d0: 7b 7a 50 72 65 66 69 78 7d 20 7b 0a 20 20 73 65  {zPrefix} {.  se
13e0: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 0a 20 20  t ret [list]..  
13f0: 73 65 74 20 72 65 67 20 5b 73 74 72 69 6e 67 20  set reg [string 
1400: 6d 61 70 20 7b 2a 20 7b 5b 5e 20 5d 2a 7d 7d 20  map {* {[^ ]*}} 
1410: 24 7a 50 72 65 66 69 78 5d 0a 20 20 73 65 74 20  $zPrefix].  set 
1420: 72 65 67 20 22 20 24 72 65 67 20 22 0a 0a 20 20  reg " $reg "..  
1430: 66 6f 72 65 61 63 68 20 6b 65 79 20 5b 6c 73 6f  foreach key [lso
1440: 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72  rt -integer [arr
1450: 61 79 20 6e 61 6d 65 73 20 3a 3a 74 31 5d 5d 20  ay names ::t1]] 
1460: 7b 0a 20 20 20 20 73 65 74 20 76 61 6c 75 65 20  {.    set value 
1470: 24 3a 3a 74 31 28 24 6b 65 79 29 0a 20 20 20 20  $::t1($key).    
1480: 73 65 74 20 63 6e 74 20 5b 6c 69 73 74 5d 0a 20  set cnt [list]. 
1490: 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6c 20 24     foreach col $
14a0: 76 61 6c 75 65 20 7b 0a 20 20 20 20 20 20 69 66  value {.      if
14b0: 20 7b 5b 72 65 67 65 78 70 20 24 72 65 67 20 22   {[regexp $reg "
14c0: 20 24 63 6f 6c 20 22 5d 7d 20 7b 20 6c 61 70 70   $col "]} { lapp
14d0: 65 6e 64 20 72 65 74 20 24 6b 65 79 20 3b 20 62  end ret $key ; b
14e0: 72 65 61 6b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  reak }.    }.  }
14f0: 0a 0a 20 20 23 6c 73 6f 72 74 20 2d 75 6e 69 71  ..  #lsort -uniq
1500: 20 2d 69 6e 74 65 67 65 72 20 24 72 65 74 0a 20   -integer $ret. 
1510: 20 73 65 74 20 72 65 74 0a 7d 0a 0a 23 20 54 68   set ret.}..# Th
1520: 69 73 20 5b 70 72 6f 63 5d 20 69 73 20 75 73 65  is [proc] is use
1530: 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 46 54  d to test the FT
1540: 53 33 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66  S3 matchinfo() f
1550: 75 6e 63 74 69 6f 6e 2e 0a 23 20 0a 70 72 6f 63  unction..# .proc
1560: 20 73 69 6d 70 6c 65 5f 74 6f 6b 65 6e 5f 6d 61   simple_token_ma
1570: 74 63 68 69 6e 66 6f 20 7b 7a 54 6f 6b 65 6e 20  tchinfo {zToken 
1580: 62 44 65 73 63 7d 20 7b 0a 0a 20 20 73 65 74 20  bDesc} {..  set 
1590: 6e 44 6f 63 28 30 29 20 30 0a 20 20 73 65 74 20  nDoc(0) 0.  set 
15a0: 6e 44 6f 63 28 31 29 20 30 0a 20 20 73 65 74 20  nDoc(1) 0.  set 
15b0: 6e 44 6f 63 28 32 29 20 30 0a 20 20 73 65 74 20  nDoc(2) 0.  set 
15c0: 6e 48 69 74 28 30 29 20 30 0a 20 20 73 65 74 20  nHit(0) 0.  set 
15d0: 6e 48 69 74 28 31 29 20 30 0a 20 20 73 65 74 20  nHit(1) 0.  set 
15e0: 6e 48 69 74 28 32 29 20 30 0a 0a 20 20 73 65 74  nHit(2) 0..  set
15f0: 20 64 69 72 20 2d 69 6e 63 0a 20 20 69 66 20 7b   dir -inc.  if {
1600: 24 62 44 65 73 63 7d 20 7b 20 73 65 74 20 64 69  $bDesc} { set di
1610: 72 20 2d 64 65 63 20 7d 0a 0a 20 20 66 6f 72 65  r -dec }..  fore
1620: 61 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20 6e  ach key [array n
1630: 61 6d 65 73 20 3a 3a 74 31 5d 20 7b 0a 20 20 20  ames ::t1] {.   
1640: 20 73 65 74 20 76 61 6c 75 65 20 24 3a 3a 74 31   set value $::t1
1650: 28 24 6b 65 79 29 0a 20 20 20 20 73 65 74 20 61  ($key).    set a
1660: 28 24 6b 65 79 29 20 5b 6c 69 73 74 5d 0a 20 20  ($key) [list].  
1670: 20 20 66 6f 72 65 61 63 68 20 69 20 7b 30 20 31    foreach i {0 1
1680: 20 32 7d 20 63 6f 6c 20 24 76 61 6c 75 65 20 7b   2} col $value {
1690: 0a 20 20 20 20 20 20 73 65 74 20 68 69 74 20 5b  .      set hit [
16a0: 6c 6c 65 6e 67 74 68 20 5b 6c 73 65 61 72 63 68  llength [lsearch
16b0: 20 2d 61 6c 6c 20 24 63 6f 6c 20 24 7a 54 6f 6b   -all $col $zTok
16c0: 65 6e 5d 5d 0a 20 20 20 20 20 20 6c 61 70 70 65  en]].      lappe
16d0: 6e 64 20 61 28 24 6b 65 79 29 20 24 68 69 74 0a  nd a($key) $hit.
16e0: 20 20 20 20 20 20 69 6e 63 72 20 6e 48 69 74 28        incr nHit(
16f0: 24 69 29 20 24 68 69 74 0a 20 20 20 20 20 20 69  $i) $hit.      i
1700: 66 20 7b 24 68 69 74 3e 30 7d 20 7b 20 69 6e 63  f {$hit>0} { inc
1710: 72 20 6e 44 6f 63 28 24 69 29 20 7d 0a 20 20 20  r nDoc($i) }.   
1720: 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65   }.  }..  set re
1730: 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  t [list].  forea
1740: 63 68 20 64 6f 63 69 64 20 5b 6c 73 6f 72 74 20  ch docid [lsort 
1750: 2d 69 6e 74 65 67 65 72 20 24 64 69 72 20 5b 61  -integer $dir [a
1760: 72 72 61 79 20 6e 61 6d 65 73 20 61 5d 5d 20 7b  rray names a]] {
1770: 0a 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65  .    if { [linde
1780: 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65  x [lsort -intege
1790: 72 20 24 61 28 24 64 6f 63 69 64 29 5d 20 65 6e  r $a($docid)] en
17a0: 64 5d 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  d] } {.      set
17b0: 20 6d 61 74 63 68 69 6e 66 6f 20 5b 6c 69 73 74   matchinfo [list
17c0: 20 31 20 33 5d 0a 20 20 20 20 20 20 66 6f 72 65   1 3].      fore
17d0: 61 63 68 20 69 20 7b 30 20 31 20 32 7d 20 68 69  ach i {0 1 2} hi
17e0: 74 20 24 61 28 24 64 6f 63 69 64 29 20 7b 0a 20  t $a($docid) {. 
17f0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d         lappend m
1800: 61 74 63 68 69 6e 66 6f 20 24 68 69 74 20 24 6e  atchinfo $hit $n
1810: 48 69 74 28 24 69 29 20 24 6e 44 6f 63 28 24 69  Hit($i) $nDoc($i
1820: 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ).      }.      
1830: 6c 61 70 70 65 6e 64 20 72 65 74 20 24 64 6f 63  lappend ret $doc
1840: 69 64 20 24 6d 61 74 63 68 69 6e 66 6f 0a 20 20  id $matchinfo.  
1850: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72    }.  }..  set r
1860: 65 74 0a 7d 20 0a 0a 70 72 6f 63 20 73 69 6d 70  et.} ..proc simp
1870: 6c 65 5f 6e 65 61 72 20 7b 74 65 72 6d 6c 69 73  le_near {termlis
1880: 74 20 6e 4e 65 61 72 7d 20 7b 0a 20 20 73 65 74  t nNear} {.  set
1890: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 0a 20 20 66   ret [list]..  f
18a0: 6f 72 65 61 63 68 20 7b 6b 65 79 20 76 61 6c 75  oreach {key valu
18b0: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 3a 3a  e} [array get ::
18c0: 74 31 5d 20 7b 0a 20 20 20 20 66 6f 72 65 61 63  t1] {.    foreac
18d0: 68 20 76 20 24 76 61 6c 75 65 20 7b 0a 0a 20 20  h v $value {..  
18e0: 20 20 20 20 73 65 74 20 6c 20 5b 6c 73 65 61 72      set l [lsear
18f0: 63 68 20 2d 65 78 61 63 74 20 2d 61 6c 6c 20 24  ch -exact -all $
1900: 76 20 5b 6c 69 6e 64 65 78 20 24 74 65 72 6d 6c  v [lindex $terml
1910: 69 73 74 20 30 5d 5d 0a 20 20 20 20 20 20 66 6f  ist 0]].      fo
1920: 72 65 61 63 68 20 54 20 5b 6c 72 61 6e 67 65 20  reach T [lrange 
1930: 24 74 65 72 6d 6c 69 73 74 20 31 20 65 6e 64 5d  $termlist 1 end]
1940: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c   {.        set l
1950: 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20 20 20  2 [list].       
1960: 20 66 6f 72 65 61 63 68 20 69 20 24 6c 20 7b 0a   foreach i $l {.
1970: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 53            set iS
1980: 74 61 72 74 20 5b 65 78 70 72 20 24 69 20 2d 20  tart [expr $i - 
1990: 24 6e 4e 65 61 72 20 2d 20 31 5d 0a 20 20 20 20  $nNear - 1].    
19a0: 20 20 20 20 20 20 73 65 74 20 69 45 6e 64 20 5b        set iEnd [
19b0: 65 78 70 72 20 24 69 20 2b 20 24 6e 4e 65 61 72  expr $i + $nNear
19c0: 20 2b 20 31 5d 0a 20 20 20 20 20 20 20 20 20 20   + 1].          
19d0: 69 66 20 7b 24 69 53 74 61 72 74 20 3c 20 30 7d  if {$iStart < 0}
19e0: 20 7b 73 65 74 20 69 53 74 61 72 74 20 30 7d 0a   {set iStart 0}.
19f0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1a00: 68 20 69 32 20 5b 6c 73 65 61 72 63 68 20 2d 65  h i2 [lsearch -e
1a10: 78 61 63 74 20 2d 61 6c 6c 20 5b 6c 72 61 6e 67  xact -all [lrang
1a20: 65 20 24 76 20 24 69 53 74 61 72 74 20 24 69 45  e $v $iStart $iE
1a30: 6e 64 5d 20 24 54 5d 20 7b 0a 20 20 20 20 20 20  nd] $T] {.      
1a40: 20 20 20 20 20 20 69 6e 63 72 20 69 32 20 24 69        incr i2 $i
1a50: 53 74 61 72 74 0a 20 20 20 20 20 20 20 20 20 20  Start.          
1a60: 20 20 69 66 20 7b 24 69 32 20 21 3d 20 24 69 7d    if {$i2 != $i}
1a70: 20 7b 20 6c 61 70 70 65 6e 64 20 6c 32 20 24 69   { lappend l2 $i
1a80: 32 20 7d 20 0a 20 20 20 20 20 20 20 20 20 20 7d  2 } .          }
1a90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1aa0: 20 20 20 73 65 74 20 6c 20 5b 6c 73 6f 72 74 20     set l [lsort 
1ab0: 2d 75 6e 69 71 20 2d 69 6e 74 65 67 65 72 20 24  -uniq -integer $
1ac0: 6c 32 5d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l2].      }..   
1ad0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
1ae0: 24 6c 5d 7d 20 7b 0a 23 70 75 74 73 20 22 4d 41  $l]} {.#puts "MA
1af0: 54 43 48 28 24 6b 65 79 29 3a 20 24 76 22 0a 20  TCH($key): $v". 
1b00: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
1b10: 65 74 20 24 6b 65 79 0a 20 20 20 20 20 20 7d 20  et $key.      } 
1b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6c 73  .    }.  }..  ls
1b30: 6f 72 74 20 2d 75 6e 69 71 75 65 20 2d 69 6e 74  ort -unique -int
1b40: 65 67 65 72 20 24 72 65 74 0a 7d 0a 0a 23 20 54  eger $ret.}..# T
1b50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
1b60: 65 65 20 70 72 6f 63 73 3a 0a 23 20 0a 23 20 20  ee procs:.# .#  
1b70: 20 73 65 74 75 70 5f 6e 6f 74 20 41 20 42 0a 23   setup_not A B.#
1b80: 20 20 20 73 65 74 75 70 5f 6f 72 20 20 41 20 42     setup_or  A B
1b90: 0a 23 20 20 20 73 65 74 75 70 5f 61 6e 64 20 41  .#   setup_and A
1ba0: 20 42 0a 23 0a 23 20 65 61 63 68 20 74 61 6b 65   B.#.# each take
1bb0: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20   two arguments. 
1bc0: 42 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 6d  Both arguments m
1bd0: 75 73 74 20 62 65 20 6c 69 73 74 73 20 6f 66 20  ust be lists of 
1be0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 0a 23  integer values.#
1bf0: 20 73 6f 72 74 65 64 20 62 79 20 76 61 6c 75 65   sorted by value
1c00: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
1c10: 75 65 20 69 73 20 74 68 65 20 6c 69 73 74 20 70  ue is the list p
1c20: 72 6f 64 75 63 65 64 20 62 79 20 65 76 61 6c 75  roduced by evalu
1c30: 61 74 69 6e 67 0a 23 20 74 68 65 20 65 71 75 69  ating.# the equi
1c40: 76 61 6c 65 6e 74 20 6f 66 20 22 41 20 6f 70 20  valent of "A op 
1c50: 42 22 2c 20 77 68 65 72 65 20 6f 70 20 69 73 20  B", where op is 
1c60: 74 68 65 20 46 54 53 33 20 6f 70 65 72 61 74 6f  the FTS3 operato
1c70: 72 20 4e 4f 54 2c 20 4f 52 20 6f 72 0a 23 20 41  r NOT, OR or.# A
1c80: 4e 44 2e 0a 23 0a 70 72 6f 63 20 73 65 74 6f 70  ND..#.proc setop
1c90: 5f 6e 6f 74 20 7b 41 20 42 7d 20 7b 0a 20 20 66  _not {A B} {.  f
1ca0: 6f 72 65 61 63 68 20 62 20 24 42 20 7b 20 73 65  oreach b $B { se
1cb0: 74 20 6e 28 24 62 29 20 7b 7d 20 7d 0a 20 20 73  t n($b) {} }.  s
1cc0: 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20  et ret [list].  
1cd0: 66 6f 72 65 61 63 68 20 61 20 24 41 20 7b 20 69  foreach a $A { i
1ce0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1cf0: 20 6e 28 24 61 29 5d 7d 20 7b 6c 61 70 70 65 6e   n($a)]} {lappen
1d00: 64 20 72 65 74 20 24 61 7d 20 7d 0a 20 20 72 65  d ret $a} }.  re
1d10: 74 75 72 6e 20 24 72 65 74 0a 7d 0a 70 72 6f 63  turn $ret.}.proc
1d20: 20 73 65 74 6f 70 5f 6f 72 20 7b 41 20 42 7d 20   setop_or {A B} 
1d30: 7b 0a 20 20 6c 73 6f 72 74 20 2d 69 6e 74 65 67  {.  lsort -integ
1d40: 65 72 20 2d 75 6e 69 71 20 5b 63 6f 6e 63 61 74  er -uniq [concat
1d50: 20 24 41 20 24 42 5d 0a 7d 0a 70 72 6f 63 20 73   $A $B].}.proc s
1d60: 65 74 6f 70 5f 61 6e 64 20 7b 41 20 42 7d 20 7b  etop_and {A B} {
1d70: 0a 20 20 66 6f 72 65 61 63 68 20 62 20 24 42 20  .  foreach b $B 
1d80: 7b 20 73 65 74 20 6e 28 24 62 29 20 7b 7d 20 7d  { set n($b) {} }
1d90: 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74  .  set ret [list
1da0: 5d 0a 20 20 66 6f 72 65 61 63 68 20 61 20 24 41  ].  foreach a $A
1db0: 20 7b 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69   { if {[info exi
1dc0: 73 74 73 20 6e 28 24 61 29 5d 7d 20 7b 6c 61 70  sts n($a)]} {lap
1dd0: 70 65 6e 64 20 72 65 74 20 24 61 7d 20 7d 0a 20  pend ret $a} }. 
1de0: 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a   return $ret.}..
1df0: 70 72 6f 63 20 6d 69 74 20 7b 62 6c 6f 62 7d 20  proc mit {blob} 
1e00: 7b 0a 20 20 73 65 74 20 73 63 61 6e 28 6c 69 74  {.  set scan(lit
1e10: 74 6c 65 45 6e 64 69 61 6e 29 20 69 2a 0a 20 20  tleEndian) i*.  
1e20: 73 65 74 20 73 63 61 6e 28 62 69 67 45 6e 64 69  set scan(bigEndi
1e30: 61 6e 29 20 49 2a 0a 20 20 62 69 6e 61 72 79 20  an) I*.  binary 
1e40: 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61 6e  scan $blob $scan
1e50: 28 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  ($::tcl_platform
1e60: 28 62 79 74 65 4f 72 64 65 72 29 29 20 72 0a 20  (byteOrder)) r. 
1e70: 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 64 62 20   return $r.}.db 
1e80: 66 75 6e 63 20 6d 69 74 20 6d 69 74 0a 73 65 74  func mit mit.set
1e90: 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61   sqlite_fts3_ena
1ea0: 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20  ble_parentheses 
1eb0: 31 0a 0a 70 72 6f 63 20 64 6f 5f 6f 72 64 65 72  1..proc do_order
1ec0: 62 79 64 6f 63 69 64 5f 74 65 73 74 20 7b 74 6e  bydocid_test {tn
1ed0: 20 73 71 6c 20 72 65 73 7d 20 7b 0a 20 20 75 70   sql res} {.  up
1ee0: 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 73  level [list do_s
1ef0: 65 6c 65 63 74 5f 74 65 73 74 20 24 74 6e 2e 61  elect_test $tn.a
1f00: 73 63 20 22 24 73 71 6c 20 4f 52 44 45 52 20 42  sc "$sql ORDER B
1f10: 59 20 64 6f 63 69 64 20 41 53 43 22 20 24 72 65  Y docid ASC" $re
1f20: 73 5d 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69  s].  uplevel [li
1f30: 73 74 20 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  st do_select_tes
1f40: 74 20 24 74 6e 2e 64 65 73 63 20 22 24 73 71 6c  t $tn.desc "$sql
1f50: 20 4f 52 44 45 52 20 42 59 20 64 6f 63 69 64 20   ORDER BY docid 
1f60: 44 45 53 43 22 20 5c 0a 20 20 20 20 5b 6c 73 6f  DESC" \.    [lso
1f70: 72 74 20 2d 69 6e 74 20 2d 64 65 63 20 24 72 65  rt -int -dec $re
1f80: 73 5d 0a 20 20 5d 0a 7d 0a 0a 73 65 74 20 4e 55  s].  ].}..set NU
1f90: 4d 5f 54 52 49 41 4c 53 20 31 30 30 0a 0a 66 6f  M_TRIALS 100..fo
1fa0: 72 65 61 63 68 20 7b 6e 6f 64 65 73 69 7a 65 20  reach {nodesize 
1fb0: 6f 72 64 65 72 7d 20 7b 0a 20 20 35 30 20 20 20  order} {.  50   
1fc0: 20 44 45 53 43 0a 20 20 35 30 20 20 20 20 41 53   DESC.  50    AS
1fd0: 43 0a 20 20 35 30 30 20 20 20 41 53 43 0a 20 20  C.  500   ASC.  
1fe0: 31 30 30 30 20 20 44 45 53 43 0a 20 20 32 30 30  1000  DESC.  200
1ff0: 30 20 20 41 53 43 0a 7d 20 7b 0a 20 20 63 61 74  0  ASC.} {.  cat
2000: 63 68 20 7b 20 61 72 72 61 79 20 75 6e 73 65 74  ch { array unset
2010: 20 3a 3a 74 31 20 7d 0a 20 20 73 65 74 20 74 65   ::t1 }.  set te
2020: 73 74 6e 61 6d 65 20 22 24 6e 6f 64 65 73 69 7a  stname "$nodesiz
2030: 65 2f 24 6f 72 64 65 72 22 0a 0a 20 20 23 20 43  e/$order"..  # C
2040: 72 65 61 74 65 20 74 68 65 20 46 54 53 33 20 74  reate the FTS3 t
2050: 61 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20 69  able. Populate i
2060: 74 20 28 61 6e 64 20 74 68 65 20 54 63 6c 20 61  t (and the Tcl a
2070: 72 72 61 79 29 20 77 69 74 68 20 31 30 30 20 72  rray) with 100 r
2080: 6f 77 73 2e 0a 20 20 23 0a 20 20 64 62 20 74 72  ows..  #.  db tr
2090: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20  ansaction {.    
20a0: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
20b0: 54 41 42 4c 45 20 74 31 20 7d 0a 20 20 20 20 65  TABLE t1 }.    e
20c0: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 56  xecsql "CREATE V
20d0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20  IRTUAL TABLE t1 
20e0: 55 53 49 4e 47 20 66 74 73 34 28 61 2c 20 62 2c  USING fts4(a, b,
20f0: 20 63 2c 20 6f 72 64 65 72 3d 24 6f 72 64 65 72   c, order=$order
2100: 29 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  )".    execsql "
2110: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 74  INSERT INTO t1(t
2120: 31 29 20 56 41 4c 55 45 53 28 27 6e 6f 64 65 73  1) VALUES('nodes
2130: 69 7a 65 3d 24 6e 6f 64 65 73 69 7a 65 27 29 22  ize=$nodesize')"
2140: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
2150: 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69  0} {$i < 100} {i
2160: 6e 63 72 20 69 7d 20 7b 20 69 6e 73 65 72 74 5f  ncr i} { insert_
2170: 72 6f 77 20 24 69 20 7d 0a 20 20 7d 0a 20 20 0a  row $i }.  }.  .
2180: 20 20 66 6f 72 20 7b 73 65 74 20 69 54 65 73 74    for {set iTest
2190: 20 31 7d 20 7b 24 69 54 65 73 74 20 3c 3d 20 24   1} {$iTest <= $
21a0: 4e 55 4d 5f 54 52 49 41 4c 53 7d 20 7b 69 6e 63  NUM_TRIALS} {inc
21b0: 72 20 69 54 65 73 74 7d 20 7b 0a 20 20 20 20 63  r iTest} {.    c
21c0: 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 0a  atchsql COMMIT..
21d0: 20 20 20 20 73 65 74 20 44 4f 5f 4d 41 4c 4c 4f      set DO_MALLO
21e0: 43 5f 54 45 53 54 20 30 0a 20 20 20 20 73 65 74  C_TEST 0.    set
21f0: 20 6e 52 65 70 20 31 30 0a 20 20 20 20 69 66 20   nRep 10.    if 
2200: 7b 24 69 54 65 73 74 3d 3d 31 30 30 20 26 26 20  {$iTest==100 && 
2210: 24 6e 6f 64 65 73 69 7a 65 3d 3d 35 30 7d 20 7b  $nodesize==50} {
2220: 20 0a 20 20 20 20 20 20 73 65 74 20 44 4f 5f 4d   .      set DO_M
2230: 41 4c 4c 4f 43 5f 54 45 53 54 20 31 20 0a 20 20  ALLOC_TEST 1 .  
2240: 20 20 20 20 73 65 74 20 6e 52 65 70 20 32 0a 20      set nRep 2. 
2250: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 3a 3a     }..    set ::
2260: 74 65 73 74 70 72 65 66 69 78 20 66 74 73 33 72  testprefix fts3r
2270: 6e 64 2d 31 2e 24 74 65 73 74 6e 61 6d 65 2e 24  nd-1.$testname.$
2280: 69 54 65 73 74 0a 20 20 0a 20 20 20 20 23 20 44  iTest.  .    # D
2290: 65 6c 65 74 65 20 6f 6e 65 20 72 6f 77 2c 20 75  elete one row, u
22a0: 70 64 61 74 65 20 6f 6e 65 20 72 6f 77 20 61 6e  pdate one row an
22b0: 64 20 69 6e 73 65 72 74 20 6f 6e 65 20 72 6f 77  d insert one row
22c0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
22d0: 72 6f 77 73 20 5b 61 72 72 61 79 20 6e 61 6d 65  rows [array name
22e0: 73 20 3a 3a 74 31 5d 0a 20 20 20 20 73 65 74 20  s ::t1].    set 
22f0: 6e 52 6f 77 20 5b 6c 6c 65 6e 67 74 68 20 24 72  nRow [llength $r
2300: 6f 77 73 5d 0a 20 20 20 20 73 65 74 20 69 55 70  ows].    set iUp
2310: 64 61 74 65 20 5b 6c 69 6e 64 65 78 20 24 72 6f  date [lindex $ro
2320: 77 73 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61  ws [expr {int(ra
2330: 6e 64 28 29 2a 24 6e 52 6f 77 29 7d 5d 5d 0a 20  nd()*$nRow)}]]. 
2340: 20 20 20 73 65 74 20 69 44 65 6c 65 74 65 20 24     set iDelete $
2350: 69 55 70 64 61 74 65 0a 20 20 20 20 77 68 69 6c  iUpdate.    whil
2360: 65 20 7b 24 69 44 65 6c 65 74 65 20 3d 3d 20 24  e {$iDelete == $
2370: 69 55 70 64 61 74 65 7d 20 7b 0a 20 20 20 20 20  iUpdate} {.     
2380: 20 73 65 74 20 69 44 65 6c 65 74 65 20 5b 6c 69   set iDelete [li
2390: 6e 64 65 78 20 24 72 6f 77 73 20 5b 65 78 70 72  ndex $rows [expr
23a0: 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 24 6e 52   {int(rand()*$nR
23b0: 6f 77 29 7d 5d 5d 0a 20 20 20 20 7d 0a 20 20 20  ow)}]].    }.   
23c0: 20 73 65 74 20 69 49 6e 73 65 72 74 20 24 69 55   set iInsert $iU
23d0: 70 64 61 74 65 0a 20 20 20 20 77 68 69 6c 65 20  pdate.    while 
23e0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
23f0: 74 31 28 24 69 49 6e 73 65 72 74 29 5d 7d 20 7b  t1($iInsert)]} {
2400: 0a 20 20 20 20 20 20 73 65 74 20 69 49 6e 73 65  .      set iInse
2410: 72 74 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61  rt [expr {int(ra
2420: 6e 64 28 29 2a 31 30 30 30 30 30 30 29 7d 5d 0a  nd()*1000000)}].
2430: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
2440: 6c 20 42 45 47 49 4e 0a 20 20 20 20 20 20 69 6e  l BEGIN.      in
2450: 73 65 72 74 5f 72 6f 77 20 24 69 49 6e 73 65 72  sert_row $iInser
2460: 74 0a 20 20 20 20 20 20 75 70 64 61 74 65 5f 72  t.      update_r
2470: 6f 77 20 24 69 55 70 64 61 74 65 0a 20 20 20 20  ow $iUpdate.    
2480: 20 20 64 65 6c 65 74 65 5f 72 6f 77 20 24 69 44    delete_row $iD
2490: 65 6c 65 74 65 0a 20 20 20 20 69 66 20 7b 30 3d  elete.    if {0=
24a0: 3d 28 24 69 54 65 73 74 25 32 29 7d 20 7b 20 65  =($iTest%2)} { e
24b0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 7d 0a  xecsql COMMIT }.
24c0: 0a 20 20 20 20 69 66 20 7b 30 3d 3d 28 24 69 54  .    if {0==($iT
24d0: 65 73 74 25 32 29 7d 20 7b 20 0a 20 20 20 20 20  est%2)} { .     
24e0: 20 23 64 6f 5f 74 65 73 74 20 30 20 7b 20 66 74   #do_test 0 { ft
24f0: 73 33 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  s3_integrity_che
2500: 63 6b 20 74 31 20 7d 20 6f 6b 20 0a 20 20 20 20  ck t1 } ok .    
2510: 7d 0a 0a 20 20 20 20 23 20 50 69 63 6b 20 31 30  }..    # Pick 10
2520: 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2530: 76 6f 63 61 62 75 6c 61 72 79 2e 20 43 68 65 63  vocabulary. Chec
2540: 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2550: 74 73 20 6f 66 20 71 75 65 72 79 69 6e 67 0a 20  ts of querying. 
2560: 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73     # the databas
2570: 65 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66  e for the set of
2580: 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61   documents conta
2590: 69 6e 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  ining each of th
25a0: 65 73 65 20 74 65 72 6d 73 0a 20 20 20 20 23 20  ese terms.    # 
25b0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
25c0: 68 65 20 72 65 73 75 6c 74 20 6f 62 74 61 69 6e  he result obtain
25d0: 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  ed by scanning t
25e0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25f0: 68 65 20 54 63 6c 20 0a 20 20 20 20 23 20 61 72  he Tcl .    # ar
2600: 72 61 79 20 66 6f 72 20 65 61 63 68 20 74 65 72  ray for each ter
2610: 6d 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 6f 72  m..    #.    for
2620: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
2630: 20 31 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a   10} {incr i} {.
2640: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 20 5b        set term [
2650: 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 20  random_term].   
2660: 20 20 20 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73     do_select_tes
2670: 74 20 31 2e 24 69 2e 61 73 63 20 7b 0a 20 20 20  t 1.$i.asc {.   
2680: 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69       SELECT doci
2690: 64 2c 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f  d, mit(matchinfo
26a0: 28 74 31 29 29 20 46 52 4f 4d 20 74 31 20 57 48  (t1)) FROM t1 WH
26b0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 24 74 65  ERE t1 MATCH $te
26c0: 72 6d 0a 20 20 20 20 20 20 20 20 4f 52 44 45 52  rm.        ORDER
26d0: 20 42 59 20 64 6f 63 69 64 20 41 53 43 0a 20 20   BY docid ASC.  
26e0: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 74 6f      } [simple_to
26f0: 6b 65 6e 5f 6d 61 74 63 68 69 6e 66 6f 20 24 74  ken_matchinfo $t
2700: 65 72 6d 20 30 5d 0a 20 20 20 20 20 20 64 6f 5f  erm 0].      do_
2710: 73 65 6c 65 63 74 5f 74 65 73 74 20 31 2e 24 69  select_test 1.$i
2720: 2e 64 65 73 63 20 7b 0a 20 20 20 20 20 20 20 20  .desc {.        
2730: 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6d 69  SELECT docid, mi
2740: 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 29  t(matchinfo(t1))
2750: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
2760: 31 20 4d 41 54 43 48 20 24 74 65 72 6d 0a 20 20  1 MATCH $term.  
2770: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 64        ORDER BY d
2780: 6f 63 69 64 20 44 45 53 43 0a 20 20 20 20 20 20  ocid DESC.      
2790: 7d 20 5b 73 69 6d 70 6c 65 5f 74 6f 6b 65 6e 5f  } [simple_token_
27a0: 6d 61 74 63 68 69 6e 66 6f 20 24 74 65 72 6d 20  matchinfo $term 
27b0: 31 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  1].    }..    # 
27c0: 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20 74  This time, use t
27d0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 68 61  he first two cha
27e0: 72 61 63 74 65 72 73 20 6f 66 20 65 61 63 68 20  racters of each 
27f0: 74 65 72 6d 20 61 73 20 61 20 74 65 72 6d 20 70  term as a term p
2800: 72 65 66 69 78 0a 20 20 20 20 23 20 74 6f 20 71  refix.    # to q
2810: 75 65 72 79 20 66 6f 72 2e 20 54 65 73 74 20 74  uery for. Test t
2820: 68 61 74 20 71 75 65 72 79 69 6e 67 20 74 68 65  hat querying the
2830: 20 54 63 6c 20 61 72 72 61 79 20 70 72 6f 64 75   Tcl array produ
2840: 63 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ces the same res
2850: 75 6c 74 73 0a 20 20 20 20 23 20 61 73 20 71 75  ults.    # as qu
2860: 65 72 79 69 6e 67 20 74 68 65 20 46 54 53 33 20  erying the FTS3 
2870: 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70 72  table for the pr
2880: 65 66 69 78 2e 0a 20 20 20 20 23 0a 20 20 20 20  efix..    #.    
2890: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
28a0: 69 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72  i < $nRep} {incr
28b0: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20   i} {.      set 
28c0: 70 72 65 66 69 78 20 5b 73 74 72 69 6e 67 20 72  prefix [string r
28d0: 61 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f 74 65 72  ange [random_ter
28e0: 6d 5d 20 30 20 65 6e 64 2d 31 5d 0a 20 20 20 20  m] 0 end-1].    
28f0: 20 20 73 65 74 20 6d 61 74 63 68 20 22 24 7b 70    set match "${p
2900: 72 65 66 69 78 7d 2a 22 0a 20 20 20 20 20 20 64  refix}*".      d
2910: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74  o_orderbydocid_t
2920: 65 73 74 20 32 2e 24 69 20 7b 0a 20 20 20 20 20  est 2.$i {.     
2930: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
2940: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2950: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20   MATCH $match.  
2960: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68      } [simple_ph
2970: 72 61 73 65 20 24 6d 61 74 63 68 5d 0a 20 20 20  rase $match].   
2980: 20 7d 0a 0a 20 20 20 20 23 20 53 69 6d 69 6c 61   }..    # Simila
2990: 72 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2c 20  r to the above, 
29a0: 65 78 63 65 70 74 20 66 6f 72 20 70 68 72 61 73  except for phras
29b0: 65 20 71 75 65 72 69 65 73 2e 0a 20 20 20 20 23  e queries..    #
29c0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
29d0: 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 70 7d 20  0} {$i < $nRep} 
29e0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20  {incr i} {.     
29f0: 20 73 65 74 20 74 65 72 6d 20 5b 6c 69 73 74 20   set term [list 
2a00: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 5b 72  [random_term] [r
2a10: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 5d 0a 20 20 20  andom_term]].   
2a20: 20 20 20 73 65 74 20 6d 61 74 63 68 20 22 5c 22     set match "\"
2a30: 24 74 65 72 6d 5c 22 22 0a 20 20 20 20 20 20 64  $term\"".      d
2a40: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74  o_orderbydocid_t
2a50: 65 73 74 20 33 2e 24 69 20 7b 0a 20 20 20 20 20  est 3.$i {.     
2a60: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
2a70: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2a80: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20   MATCH $match.  
2a90: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68      } [simple_ph
2aa0: 72 61 73 65 20 24 74 65 72 6d 5d 0a 20 20 20 20  rase $term].    
2ab0: 7d 0a 0a 20 20 20 20 23 20 54 68 72 65 65 20 77  }..    # Three w
2ac0: 6f 72 64 20 70 68 72 61 73 65 73 2e 0a 20 20 20  ord phrases..   
2ad0: 20 23 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   #.    for {set 
2ae0: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 70  i 0} {$i < $nRep
2af0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
2b00: 20 20 20 73 65 74 20 74 65 72 6d 20 5b 6c 69 73     set term [lis
2b10: 74 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20  t [random_term] 
2b20: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 5b 72  [random_term] [r
2b30: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 5d 0a 20 20 20  andom_term]].   
2b40: 20 20 20 73 65 74 20 6d 61 74 63 68 20 22 5c 22     set match "\"
2b50: 24 74 65 72 6d 5c 22 22 0a 20 20 20 20 20 20 64  $term\"".      d
2b60: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74  o_orderbydocid_t
2b70: 65 73 74 20 34 2e 24 69 20 7b 0a 20 20 20 20 20  est 4.$i {.     
2b80: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
2b90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2ba0: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20   MATCH $match.  
2bb0: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68      } [simple_ph
2bc0: 72 61 73 65 20 24 74 65 72 6d 5d 0a 20 20 20 20  rase $term].    
2bd0: 7d 0a 0a 20 20 20 20 23 20 54 68 72 65 65 20 77  }..    # Three w
2be0: 6f 72 64 20 70 68 72 61 73 65 73 20 6d 61 64 65  ord phrases made
2bf0: 20 75 70 20 6f 66 20 74 65 72 6d 2d 70 72 65 66   up of term-pref
2c00: 69 78 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20  ixes..    #.    
2c10: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
2c20: 69 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72  i < $nRep} {incr
2c30: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20   i} {.      set 
2c40: 20 20 20 71 75 65 72 79 20 22 5b 73 74 72 69 6e     query "[strin
2c50: 67 20 72 61 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f  g range [random_
2c60: 74 65 72 6d 5d 20 30 20 65 6e 64 2d 31 5d 2a 20  term] 0 end-1]* 
2c70: 22 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 71  ".      append q
2c80: 75 65 72 79 20 22 5b 73 74 72 69 6e 67 20 72 61  uery "[string ra
2c90: 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d  nge [random_term
2ca0: 5d 20 30 20 65 6e 64 2d 31 5d 2a 20 22 0a 20 20  ] 0 end-1]* ".  
2cb0: 20 20 20 20 61 70 70 65 6e 64 20 71 75 65 72 79      append query
2cc0: 20 22 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20   "[string range 
2cd0: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 30 20  [random_term] 0 
2ce0: 65 6e 64 2d 31 5d 2a 22 0a 0a 20 20 20 20 20 20  end-1]*"..      
2cf0: 73 65 74 20 6d 61 74 63 68 20 22 5c 22 24 71 75  set match "\"$qu
2d00: 65 72 79 5c 22 22 0a 20 20 20 20 20 20 64 6f 5f  ery\"".      do_
2d10: 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74 65 73  orderbydocid_tes
2d20: 74 20 35 2e 24 69 20 7b 0a 20 20 20 20 20 20 20  t 5.$i {.       
2d30: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
2d40: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
2d50: 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20 20 20  ATCH $match.    
2d60: 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68 72 61    } [simple_phra
2d70: 73 65 20 24 71 75 65 72 79 5d 0a 20 20 20 20 7d  se $query].    }
2d80: 0a 0a 20 20 20 20 23 20 41 20 4e 45 41 52 20 71  ..    # A NEAR q
2d90: 75 65 72 79 20 77 69 74 68 20 74 65 72 6d 73 20  uery with terms 
2da0: 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  as the arguments
2db0: 3a 0a 20 20 20 20 23 0a 20 20 20 20 23 20 20 20  :.    #.    #   
2dc0: 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 24 74 65    ... MATCH '$te
2dd0: 72 6d 31 20 4e 45 41 52 20 24 74 65 72 6d 32 27  rm1 NEAR $term2'
2de0: 20 2e 2e 2e 0a 20 20 20 20 23 0a 20 20 20 20 66   ....    #.    f
2df0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
2e00: 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72 20   < $nRep} {incr 
2e10: 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74  i} {.      set t
2e20: 65 72 6d 73 20 5b 6c 69 73 74 20 5b 72 61 6e 64  erms [list [rand
2e30: 6f 6d 5f 74 65 72 6d 5d 20 5b 72 61 6e 64 6f 6d  om_term] [random
2e40: 5f 74 65 72 6d 5d 5d 0a 20 20 20 20 20 20 73 65  _term]].      se
2e50: 74 20 6d 61 74 63 68 20 5b 6a 6f 69 6e 20 24 74  t match [join $t
2e60: 65 72 6d 73 20 22 20 4e 45 41 52 20 22 5d 0a 20  erms " NEAR "]. 
2e70: 20 20 20 20 20 64 6f 5f 6f 72 64 65 72 62 79 64       do_orderbyd
2e80: 6f 63 69 64 5f 74 65 73 74 20 36 2e 24 69 20 7b  ocid_test 6.$i {
2e90: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
2ea0: 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48  docid FROM t1 WH
2eb0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 24 6d 61  ERE t1 MATCH $ma
2ec0: 74 63 68 20 0a 20 20 20 20 20 20 7d 20 5b 73 69  tch .      } [si
2ed0: 6d 70 6c 65 5f 6e 65 61 72 20 24 74 65 72 6d 73  mple_near $terms
2ee0: 20 31 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20   10].    }..    
2ef0: 23 20 41 20 33 2d 77 61 79 20 4e 45 41 52 20 71  # A 3-way NEAR q
2f00: 75 65 72 79 20 77 69 74 68 20 74 65 72 6d 73 20  uery with terms 
2f10: 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  as the arguments
2f20: 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 6f 72 20  ..    #.    for 
2f30: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
2f40: 24 6e 52 65 70 7d 20 7b 69 6e 63 72 20 69 7d 20  $nRep} {incr i} 
2f50: 7b 0a 20 20 20 20 20 20 73 65 74 20 74 65 72 6d  {.      set term
2f60: 73 20 5b 6c 69 73 74 20 5b 72 61 6e 64 6f 6d 5f  s [list [random_
2f70: 74 65 72 6d 5d 20 5b 72 61 6e 64 6f 6d 5f 74 65  term] [random_te
2f80: 72 6d 5d 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d  rm] [random_term
2f90: 5d 5d 0a 20 20 20 20 20 20 73 65 74 20 6e 4e 65  ]].      set nNe
2fa0: 61 72 20 31 31 0a 20 20 20 20 20 20 73 65 74 20  ar 11.      set 
2fb0: 6d 61 74 63 68 20 5b 6a 6f 69 6e 20 24 74 65 72  match [join $ter
2fc0: 6d 73 20 22 20 4e 45 41 52 2f 24 6e 4e 65 61 72  ms " NEAR/$nNear
2fd0: 20 22 5d 0a 20 20 20 20 20 20 64 6f 5f 6f 72 64   "].      do_ord
2fe0: 65 72 62 79 64 6f 63 69 64 5f 74 65 73 74 20 37  erbydocid_test 7
2ff0: 2e 24 69 20 7b 0a 20 20 20 20 20 20 20 20 53 45  .$i {.        SE
3000: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
3010: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
3020: 48 20 24 6d 61 74 63 68 0a 20 20 20 20 20 20 7d  H $match.      }
3030: 20 5b 73 69 6d 70 6c 65 5f 6e 65 61 72 20 24 74   [simple_near $t
3040: 65 72 6d 73 20 24 6e 4e 65 61 72 5d 0a 20 20 20  erms $nNear].   
3050: 20 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 53 65   }.    .    # Se
3060: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  t operations on 
3070: 73 69 6d 70 6c 65 20 74 65 72 6d 20 71 75 65 72  simple term quer
3080: 69 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 66  ies..    #.    f
3090: 6f 72 65 61 63 68 20 7b 74 6e 20 6f 70 20 70 72  oreach {tn op pr
30a0: 6f 63 7d 20 7b 0a 20 20 20 20 20 20 38 20 20 4f  oc} {.      8  O
30b0: 52 20 20 73 65 74 6f 70 5f 6f 72 0a 20 20 20 20  R  setop_or.    
30c0: 20 20 39 20 20 4e 4f 54 20 73 65 74 6f 70 5f 6e    9  NOT setop_n
30d0: 6f 74 0a 20 20 20 20 20 20 31 30 20 41 4e 44 20  ot.      10 AND 
30e0: 73 65 74 6f 70 5f 61 6e 64 0a 20 20 20 20 7d 20  setop_and.    } 
30f0: 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  {.      for {set
3100: 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65   i 0} {$i < $nRe
3110: 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  p} {incr i} {.  
3120: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 31 20        set term1 
3130: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3140: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 32 20        set term2 
3150: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3160: 20 20 20 20 20 20 73 65 74 20 6d 61 74 63 68 20        set match 
3170: 22 24 74 65 72 6d 31 20 24 6f 70 20 24 74 65 72  "$term1 $op $ter
3180: 6d 32 22 0a 20 20 20 20 20 20 20 20 64 6f 5f 6f  m2".        do_o
3190: 72 64 65 72 62 79 64 6f 63 69 64 5f 74 65 73 74  rderbydocid_test
31a0: 20 24 74 6e 2e 24 69 20 7b 0a 20 20 20 20 20 20   $tn.$i {.      
31b0: 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64      SELECT docid
31c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
31d0: 31 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20  1 MATCH $match. 
31e0: 20 20 20 20 20 20 20 7d 20 5b 24 70 72 6f 63 20         } [$proc 
31f0: 5b 73 69 6d 70 6c 65 5f 70 68 72 61 73 65 20 24  [simple_phrase $
3200: 74 65 72 6d 31 5d 20 5b 73 69 6d 70 6c 65 5f 70  term1] [simple_p
3210: 68 72 61 73 65 20 24 74 65 72 6d 32 5d 5d 0a 20  hrase $term2]]. 
3220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20       }.    }. . 
3230: 20 20 20 23 20 53 65 74 20 6f 70 65 72 61 74 69     # Set operati
3240: 6f 6e 73 20 6f 6e 20 4e 45 41 52 20 71 75 65 72  ons on NEAR quer
3250: 69 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 66  ies..    #.    f
3260: 6f 72 65 61 63 68 20 7b 74 6e 20 6f 70 20 70 72  oreach {tn op pr
3270: 6f 63 7d 20 7b 0a 20 20 20 20 20 20 31 31 20 4f  oc} {.      11 O
3280: 52 20 20 73 65 74 6f 70 5f 6f 72 0a 20 20 20 20  R  setop_or.    
3290: 20 20 31 32 20 4e 4f 54 20 73 65 74 6f 70 5f 6e    12 NOT setop_n
32a0: 6f 74 0a 20 20 20 20 20 20 31 33 20 41 4e 44 20  ot.      13 AND 
32b0: 73 65 74 6f 70 5f 61 6e 64 0a 20 20 20 20 7d 20  setop_and.    } 
32c0: 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  {.      for {set
32d0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65   i 0} {$i < $nRe
32e0: 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  p} {incr i} {.  
32f0: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 31 20        set term1 
3300: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3310: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 32 20        set term2 
3320: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3330: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 33 20        set term3 
3340: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3350: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 34 20        set term4 
3360: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20  [random_term].  
3370: 20 20 20 20 20 20 73 65 74 20 6d 61 74 63 68 20        set match 
3380: 22 24 74 65 72 6d 31 20 4e 45 41 52 20 24 74 65  "$term1 NEAR $te
3390: 72 6d 32 20 24 6f 70 20 24 74 65 72 6d 33 20 4e  rm2 $op $term3 N
33a0: 45 41 52 20 24 74 65 72 6d 34 22 0a 20 20 20 20  EAR $term4".    
33b0: 20 20 20 20 64 6f 5f 6f 72 64 65 72 62 79 64 6f      do_orderbydo
33c0: 63 69 64 5f 74 65 73 74 20 24 74 6e 2e 24 69 20  cid_test $tn.$i 
33d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 45 4c 45  {.          SELE
33e0: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31  CT docid FROM t1
33f0: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
3400: 24 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 7d  $match.        }
3410: 20 5b 24 70 72 6f 63 20 20 20 20 20 20 20 20 20   [$proc         
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
3440: 20 20 20 20 20 20 20 5b 73 69 6d 70 6c 65 5f 6e         [simple_n
3450: 65 61 72 20 5b 6c 69 73 74 20 24 74 65 72 6d 31  ear [list $term1
3460: 20 24 74 65 72 6d 32 5d 20 31 30 5d 20 5c 0a 20   $term2] 10] \. 
3470: 20 20 20 20 20 20 20 20 20 20 20 5b 73 69 6d 70             [simp
3480: 6c 65 5f 6e 65 61 72 20 5b 6c 69 73 74 20 24 74  le_near [list $t
3490: 65 72 6d 33 20 24 74 65 72 6d 34 5d 20 31 30 5d  erm3 $term4] 10]
34a0: 0a 20 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20  .          ].   
34b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
34c0: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
34d0: 20 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65    }.}..finish_te
34e0: 73 74 0a                                         st.