/ Hex Artifact Content
Login

Artifact 8501de895a4c0631e7226c9bac055cd49c9f6646:


0000: 23 20 32 30 30 39 20 4a 61 6e 75 61 72 79 20 31  # 2009 January 1
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20  ********.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
0190: 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72   for SQLite libr
01a0: 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75  ary.  The.# focu
01b0: 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70 74  s of this script
01c0: 20 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20   is testing the 
01d0: 46 54 53 33 20 6d 6f 64 75 6c 65 20 73 79 6e 74  FTS3 module synt
01e0: 61 78 20 70 61 72 73 65 72 2e 0a 23 0a 23 20 24  ax parser..#.# $
01f0: 49 64 3a 20 66 74 73 33 65 78 70 72 32 2e 74 65  Id: fts3expr2.te
0200: 73 74 2c 76 20 31 2e 31 20 32 30 30 39 2f 30 31  st,v 1.1 2009/01
0210: 2f 30 31 20 30 37 3a 30 38 3a 35 35 20 64 61 6e  /01 07:08:55 dan
0220: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 23  ielk1977 Exp $.#
0230: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0240: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0250: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0260: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0270: 23 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  # If SQLITE_ENAB
0280: 4c 45 5f 46 54 53 33 20 69 73 20 64 65 66 69 6e  LE_FTS3 is defin
0290: 65 64 2c 20 6f 6d 69 74 20 74 68 69 73 20 66 69  ed, omit this fi
02a0: 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65 20 21 66  le..ifcapable !f
02b0: 74 73 33 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  ts3 {.  finish_t
02c0: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  est.  return.}..
02d0: 23 20 54 65 73 74 20 6f 76 65 72 76 69 65 77 3a  # Test overview:
02e0: 0a 23 20 0a 23 20 20 20 54 68 65 20 74 65 73 74  .# .#   The test
02f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 61  s in this file a
0300: 72 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  re pseudo-random
0310: 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68  ly generated. Th
0320: 65 79 20 74 65 73 74 0a 23 20 20 20 74 68 65 20  ey test.#   the 
0330: 66 74 73 33 20 6d 61 74 63 68 20 65 78 70 72 65  fts3 match expre
0340: 73 73 69 6f 6e 20 70 61 72 73 65 72 20 76 69 61  ssion parser via
0350: 20 74 68 65 20 74 65 73 74 20 69 6e 74 65 72 66   the test interf
0360: 61 63 65 0a 23 20 20 20 53 51 4c 20 66 75 6e 63  ace.#   SQL func
0370: 74 69 6f 6e 20 22 66 74 73 33 5f 65 78 70 72 74  tion "fts3_exprt
0380: 65 73 74 22 20 28 73 65 65 20 63 6f 6d 6d 65 6e  est" (see commen
0390: 74 73 20 69 6e 20 66 74 73 33 5f 65 78 70 72 2e  ts in fts3_expr.
03a0: 63 29 2e 0a 23 0a 23 20 20 20 45 61 63 68 20 74  c)..#.#   Each t
03b0: 65 73 74 20 63 61 73 65 20 77 6f 72 6b 73 20 61  est case works a
03c0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 20 20 20 0a  s follows:.#   .
03d0: 23 20 20 20 20 20 31 2e 20 41 20 72 61 6e 64 6f  #     1. A rando
03e0: 6d 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  m expression tre
03f0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 75  e is generated u
0400: 73 69 6e 67 20 70 72 6f 63 20 5b 72 61 6e 64 6f  sing proc [rando
0410: 6d 5f 65 78 70 72 5f 74 72 65 65 5d 2e 0a 23 20  m_expr_tree]..# 
0420: 20 20 20 20 32 2e 20 54 68 65 20 65 78 70 72 65      2. The expre
0430: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 63 6f  ssion tree is co
0440: 6e 76 65 72 74 65 64 20 74 6f 20 74 68 65 20 74  nverted to the t
0450: 65 78 74 20 6f 66 20 61 6e 20 65 71 75 69 76 61  ext of an equiva
0460: 6c 65 6e 74 0a 23 20 20 20 20 20 20 20 20 66 74  lent.#        ft
0470: 73 33 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  s3 expression us
0480: 69 6e 67 20 70 72 6f 63 20 5b 74 72 65 65 5f 74  ing proc [tree_t
0490: 6f 5f 65 78 70 72 5d 2e 0a 23 20 20 20 20 20 33  o_expr]..#     3
04a0: 2e 20 54 68 65 20 74 65 73 74 20 53 51 4c 20 66  . The test SQL f
04b0: 75 6e 63 74 69 6f 6e 20 22 66 74 73 33 5f 65 78  unction "fts3_ex
04c0: 70 72 74 65 73 74 22 20 69 73 20 75 73 65 64 20  prtest" is used 
04d0: 74 6f 20 70 61 72 73 65 20 74 68 65 20 0a 23 20  to parse the .# 
04e0: 20 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f         expressio
04f0: 6e 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  n text generated
0500: 20 69 6e 20 73 74 65 70 20 28 32 29 2c 20 72 65   in step (2), re
0510: 74 75 72 6e 69 6e 67 20 61 20 70 61 72 73 65 64  turning a parsed
0520: 20 65 78 70 72 65 73 73 69 6f 6e 0a 23 20 20 20   expression.#   
0530: 20 20 20 20 20 74 72 65 65 2e 0a 23 20 20 20 20       tree..#    
0540: 20 34 2e 20 54 65 73 74 20 74 68 61 74 20 74 68   4. Test that th
0550: 65 20 74 72 65 65 20 72 65 74 75 72 6e 65 64 20  e tree returned 
0560: 69 6e 20 73 74 65 70 20 28 33 29 20 6d 61 74 63  in step (3) matc
0570: 68 65 73 20 74 68 61 74 20 67 65 6e 65 72 61 74  hes that generat
0580: 65 64 20 69 6e 20 0a 23 20 20 20 20 20 20 20 20  ed in .#        
0590: 73 74 65 70 20 28 31 29 2e 0a 23 0a 23 20 20 20  step (1)..#.#   
05a0: 49 6e 20 73 74 65 70 20 28 32 29 2c 20 34 20 64  In step (2), 4 d
05b0: 69 66 66 65 72 65 6e 74 20 66 74 73 33 20 65 78  ifferent fts3 ex
05c0: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 72  pressions are cr
05d0: 65 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68 20  eated from each 
05e0: 0a 23 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20  .#   expression 
05f0: 74 72 65 65 20 62 79 20 76 61 72 79 69 6e 67 20  tree by varying 
0600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6f  the following bo
0610: 6f 6c 65 61 6e 20 70 72 6f 70 65 72 74 69 65 73  olean properties
0620: 3a 0a 23 0a 23 20 20 20 20 20 2a 20 57 68 65 74  :.#.#     * Whet
0630: 68 65 72 20 6f 72 20 6e 6f 74 20 73 75 70 65 72  her or not super
0640: 66 6c 6f 75 73 20 70 61 72 65 6e 74 68 65 73 69  flous parenthesi
0650: 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 2e 20  s are included. 
0660: 69 2e 65 2e 20 69 66 0a 23 20 20 20 20 20 20 20  i.e. if.#       
0670: 22 61 20 4f 52 20 62 20 41 4e 44 20 28 63 20 4f  "a OR b AND (c O
0680: 52 20 64 29 22 20 6f 72 20 22 61 20 4f 52 20 28  R d)" or "a OR (
0690: 62 20 41 4e 44 20 28 63 20 4f 52 20 64 29 29 22  b AND (c OR d))"
06a0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 23   is generated..#
06b0: 0a 23 20 20 20 20 20 2a 20 57 68 65 74 68 65 72  .#     * Whether
06c0: 20 6f 72 20 6e 6f 74 20 65 78 70 6c 69 63 74 20   or not explict 
06d0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 73 20 61 72  AND operators ar
06e0: 65 20 75 73 65 64 2e 20 69 2e 65 2e 20 69 66 0a  e used. i.e. if.
06f0: 23 20 20 20 20 20 22 61 20 4f 52 20 62 20 41 4e  #     "a OR b AN
0700: 44 20 63 22 20 6f 72 20 22 61 20 4f 52 20 62 20  D c" or "a OR b 
0710: 63 22 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  c" is generated.
0720: 0a 23 0a 0a 73 65 74 20 73 71 6c 69 74 65 5f 66  .#..set sqlite_f
0730: 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
0740: 74 68 65 73 65 73 20 31 0a 0a 70 72 6f 63 20 73  theses 1..proc s
0750: 74 72 69 70 5f 70 68 72 61 73 65 5f 64 61 74 61  trip_phrase_data
0760: 20 7b 4c 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 69   {L} {.  if {[li
0770: 6e 64 65 78 20 24 4c 20 30 5d 20 65 71 20 22 50  ndex $L 0] eq "P
0780: 48 52 41 53 45 22 7d 20 7b 0a 20 20 20 20 72 65  HRASE"} {.    re
0790: 74 75 72 6e 20 5b 6c 69 73 74 20 50 20 5b 6c 72  turn [list P [lr
07a0: 61 6e 67 65 20 24 4c 20 33 20 65 6e 64 5d 5d 0a  ange $L 3 end]].
07b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 6c 69    }.  return [li
07c0: 73 74 20 5c 0a 20 20 20 20 5b 6c 69 6e 64 65 78  st \.    [lindex
07d0: 20 24 4c 20 30 5d 20 5c 0a 20 20 20 20 5b 73 74   $L 0] \.    [st
07e0: 72 69 70 5f 70 68 72 61 73 65 5f 64 61 74 61 20  rip_phrase_data 
07f0: 5b 6c 69 6e 64 65 78 20 24 4c 20 31 5d 5d 20 5c  [lindex $L 1]] \
0800: 0a 20 20 20 20 5b 73 74 72 69 70 5f 70 68 72 61  .    [strip_phra
0810: 73 65 5f 64 61 74 61 20 5b 6c 69 6e 64 65 78 20  se_data [lindex 
0820: 24 4c 20 32 5d 5d 20 5c 0a 20 20 5d 0a 7d 0a 70  $L 2]] \.  ].}.p
0830: 72 6f 63 20 74 65 73 74 5f 66 74 73 33 65 78 70  roc test_fts3exp
0840: 72 32 20 7b 65 78 70 72 7d 20 7b 0a 20 20 73 74  r2 {expr} {.  st
0850: 72 69 70 5f 70 68 72 61 73 65 5f 64 61 74 61 20  rip_phrase_data 
0860: 5b 0a 20 20 20 20 64 62 20 6f 6e 65 20 7b 53 45  [.    db one {SE
0870: 4c 45 43 54 20 66 74 73 33 5f 65 78 70 72 74 65  LECT fts3_exprte
0880: 73 74 28 27 73 69 6d 70 6c 65 27 2c 20 24 65 78  st('simple', $ex
0890: 70 72 2c 20 27 61 27 2c 20 27 62 27 2c 20 27 63  pr, 'a', 'b', 'c
08a0: 27 29 7d 0a 20 20 5d 0a 7d 0a 0a 70 72 6f 63 20  ')}.  ].}..proc 
08b0: 72 6e 64 20 7b 6e 4d 61 78 7d 20 7b 20 65 78 70  rnd {nMax} { exp
08c0: 72 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 24 6e  r {int(rand()*$n
08d0: 4d 61 78 29 7d 20 7d 0a 0a 70 72 6f 63 20 72 61  Max)} }..proc ra
08e0: 6e 64 6f 6d 5f 70 68 72 61 73 65 20 7b 7d 20 7b  ndom_phrase {} {
08f0: 0a 20 20 73 65 74 20 70 68 72 61 73 65 73 20 5b  .  set phrases [
0900: 6c 69 73 74 20 6f 6e 65 20 74 77 6f 20 74 68 72  list one two thr
0910: 65 65 20 66 6f 75 72 20 22 6f 6e 65 20 74 77 6f  ee four "one two
0920: 22 20 22 74 68 72 65 65 20 66 6f 75 72 22 5d 0a  " "three four"].
0930: 20 20 6c 69 73 74 20 50 20 5b 6c 69 6e 64 65 78    list P [lindex
0940: 20 24 70 68 72 61 73 65 73 20 5b 72 6e 64 20 5b   $phrases [rnd [
0950: 6c 6c 65 6e 67 74 68 20 24 70 68 72 61 73 65 73  llength $phrases
0960: 5d 5d 5d 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74  ]]].}..# Generat
0970: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
0980: 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 65 78 70  seudo-random exp
0990: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 55 73  ression tree. Us
09a0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 0a 23 20  ing the same .# 
09b0: 66 6f 72 6d 61 74 20 72 65 74 75 72 6e 65 64 20  format returned 
09c0: 62 79 20 74 68 65 20 5b 74 65 73 74 5f 66 74 73  by the [test_fts
09d0: 33 65 78 70 72 32 5d 20 70 72 6f 63 2e 0a 23 0a  3expr2] proc..#.
09e0: 70 72 6f 63 20 72 61 6e 64 6f 6d 5f 65 78 70 72  proc random_expr
09f0: 5f 74 72 65 65 20 7b 69 48 65 69 67 68 74 7d 20  _tree {iHeight} 
0a00: 7b 0a 20 20 69 66 20 7b 24 69 48 65 69 67 68 74  {.  if {$iHeight
0a10: 3d 3d 30 20 7c 7c 20 5b 72 6e 64 20 33 5d 3d 3d  ==0 || [rnd 3]==
0a20: 30 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0} {.    return 
0a30: 5b 72 61 6e 64 6f 6d 5f 70 68 72 61 73 65 5d 0a  [random_phrase].
0a40: 20 20 7d 0a 0a 20 20 73 65 74 20 6f 70 65 72 61    }..  set opera
0a50: 74 6f 72 73 20 5b 6c 69 73 74 20 4e 45 41 52 20  tors [list NEAR 
0a60: 4e 4f 54 20 41 4e 44 20 4f 52 5d 0a 20 20 73 65  NOT AND OR].  se
0a70: 74 20 6f 70 20 5b 6c 69 6e 64 65 78 20 24 6f 70  t op [lindex $op
0a80: 65 72 61 74 6f 72 73 20 5b 72 6e 64 20 34 5d 5d  erators [rnd 4]]
0a90: 0a 0a 20 20 69 66 20 7b 24 6f 70 20 65 71 20 22  ..  if {$op eq "
0aa0: 4e 45 41 52 22 7d 20 7b 0a 20 20 20 20 73 65 74  NEAR"} {.    set
0ab0: 20 69 44 69 73 74 61 6e 63 65 20 5b 72 6e 64 20   iDistance [rnd 
0ac0: 31 35 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  15].    return [
0ad0: 6c 69 73 74 20 24 6f 70 2f 24 69 44 69 73 74 61  list $op/$iDista
0ae0: 6e 63 65 20 5b 72 61 6e 64 6f 6d 5f 70 68 72 61  nce [random_phra
0af0: 73 65 5d 20 5b 72 61 6e 64 6f 6d 5f 70 68 72 61  se] [random_phra
0b00: 73 65 5d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  se]].  }..  set 
0b10: 69 4e 48 20 5b 65 78 70 72 20 7b 24 69 48 65 69  iNH [expr {$iHei
0b20: 67 68 74 20 2d 20 31 7d 5d 0a 20 20 72 65 74 75  ght - 1}].  retu
0b30: 72 6e 20 5b 6c 69 73 74 20 24 6f 70 20 5b 72 61  rn [list $op [ra
0b40: 6e 64 6f 6d 5f 65 78 70 72 5f 74 72 65 65 20 24  ndom_expr_tree $
0b50: 69 4e 48 5d 20 5b 72 61 6e 64 6f 6d 5f 65 78 70  iNH] [random_exp
0b60: 72 5f 74 72 65 65 20 24 69 4e 48 5d 5d 0a 7d 0a  r_tree $iNH]].}.
0b70: 0a 23 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  .# Given an expr
0b80: 65 73 73 69 6f 6e 20 74 72 65 65 2c 20 67 65 6e  ession tree, gen
0b90: 65 72 61 74 65 20 61 20 63 6f 72 72 65 73 70 6f  erate a correspo
0ba0: 6e 64 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  nding expression
0bb0: 2e 0a 23 0a 70 72 6f 63 20 74 72 65 65 5f 74 6f  ..#.proc tree_to
0bc0: 5f 65 78 70 72 20 7b 74 72 65 65 20 61 6c 6c 5f  _expr {tree all_
0bd0: 62 72 61 63 6b 65 74 73 20 69 6d 70 6c 69 63 69  brackets implici
0be0: 74 5f 61 6e 64 7d 20 7b 0a 20 20 73 65 74 20 70  t_and} {.  set p
0bf0: 72 65 63 28 4e 4f 54 29 20 32 0a 20 20 73 65 74  rec(NOT) 2.  set
0c00: 20 70 72 65 63 28 41 4e 44 29 20 33 0a 20 20 73   prec(AND) 3.  s
0c10: 65 74 20 70 72 65 63 28 29 20 20 20 20 33 0a 20  et prec()    3. 
0c20: 20 73 65 74 20 70 72 65 63 28 4f 52 29 20 20 34   set prec(OR)  4
0c30: 0a 0a 20 20 73 65 74 20 6f 70 20 5b 6c 69 6e 64  ..  set op [lind
0c40: 65 78 20 24 74 72 65 65 20 30 5d 0a 0a 20 20 69  ex $tree 0]..  i
0c50: 66 20 7b 24 6f 70 20 65 71 20 22 50 22 7d 20 7b  f {$op eq "P"} {
0c60: 0a 20 20 20 20 73 65 74 20 70 68 72 61 73 65 20  .    set phrase 
0c70: 5b 6c 69 6e 64 65 78 20 24 74 72 65 65 20 31 5d  [lindex $tree 1]
0c80: 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74  .    if {[llengt
0c90: 68 20 24 70 68 72 61 73 65 5d 3e 31 7d 20 7b 0a  h $phrase]>1} {.
0ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 5c 22        return "\"
0cb0: 24 70 68 72 61 73 65 5c 22 22 0a 20 20 20 20 7d  $phrase\"".    }
0cc0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
0cd0: 74 75 72 6e 20 24 70 68 72 61 73 65 0a 20 20 20  turn $phrase.   
0ce0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 24 6f   }.  }..  if {$o
0cf0: 70 20 65 71 20 22 4e 45 41 52 2f 31 30 22 7d 20  p eq "NEAR/10"} 
0d00: 7b 0a 20 20 20 20 73 65 74 20 6f 70 20 22 4e 45  {.    set op "NE
0d10: 41 52 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 6f  AR".  }.  if {$o
0d20: 70 20 65 71 20 22 41 4e 44 22 20 26 26 20 24 69  p eq "AND" && $i
0d30: 6d 70 6c 69 63 69 74 5f 61 6e 64 7d 20 7b 0a 20  mplicit_and} {. 
0d40: 20 20 20 73 65 74 20 6f 70 20 22 22 0a 20 20 7d     set op "".  }
0d50: 0a 0a 20 20 73 65 74 20 6c 68 73 20 5b 6c 69 6e  ..  set lhs [lin
0d60: 64 65 78 20 24 74 72 65 65 20 31 5d 0a 20 20 73  dex $tree 1].  s
0d70: 65 74 20 72 68 73 20 5b 6c 69 6e 64 65 78 20 24  et rhs [lindex $
0d80: 74 72 65 65 20 32 5d 0a 20 20 73 65 74 20 7a 4c  tree 2].  set zL
0d90: 65 66 74 20 20 5b 74 72 65 65 5f 74 6f 5f 65 78  eft  [tree_to_ex
0da0: 70 72 20 24 6c 68 73 20 24 61 6c 6c 5f 62 72 61  pr $lhs $all_bra
0db0: 63 6b 65 74 73 20 24 69 6d 70 6c 69 63 69 74 5f  ckets $implicit_
0dc0: 61 6e 64 5d 0a 20 20 73 65 74 20 7a 52 69 67 68  and].  set zRigh
0dd0: 74 20 5b 74 72 65 65 5f 74 6f 5f 65 78 70 72 20  t [tree_to_expr 
0de0: 24 72 68 73 20 24 61 6c 6c 5f 62 72 61 63 6b 65  $rhs $all_bracke
0df0: 74 73 20 24 69 6d 70 6c 69 63 69 74 5f 61 6e 64  ts $implicit_and
0e00: 5d 0a 0a 20 20 73 65 74 20 69 50 72 65 63 20 35  ]..  set iPrec 5
0e10: 0a 20 20 73 65 74 20 69 4c 65 66 74 50 72 65 63  .  set iLeftPrec
0e20: 20 30 0a 20 20 73 65 74 20 69 52 69 67 68 74 50   0.  set iRightP
0e30: 72 65 63 20 30 0a 0a 20 20 63 61 74 63 68 20 7b  rec 0..  catch {
0e40: 73 65 74 20 69 50 72 65 63 20 20 20 20 20 20 24  set iPrec      $
0e50: 70 72 65 63 28 24 6f 70 29 7d 0a 20 20 63 61 74  prec($op)}.  cat
0e60: 63 68 20 7b 73 65 74 20 69 4c 65 66 74 50 72 65  ch {set iLeftPre
0e70: 63 20 20 24 70 72 65 63 28 5b 6c 69 6e 64 65 78  c  $prec([lindex
0e80: 20 24 6c 68 73 20 30 5d 29 7d 0a 20 20 63 61 74   $lhs 0])}.  cat
0e90: 63 68 20 7b 73 65 74 20 69 52 69 67 68 74 50 72  ch {set iRightPr
0ea0: 65 63 20 24 70 72 65 63 28 5b 6c 69 6e 64 65 78  ec $prec([lindex
0eb0: 20 24 72 68 73 20 30 5d 29 7d 0a 0a 20 20 69 66   $rhs 0])}..  if
0ec0: 20 7b 24 69 4c 65 66 74 50 72 65 63 20 3e 20 24   {$iLeftPrec > $
0ed0: 69 50 72 65 63 20 7c 7c 20 24 61 6c 6c 5f 62 72  iPrec || $all_br
0ee0: 61 63 6b 65 74 73 7d 20 7b 0a 20 20 20 20 73 65  ackets} {.    se
0ef0: 74 20 7a 4c 65 66 74 20 22 28 24 7a 4c 65 66 74  t zLeft "($zLeft
0f00: 29 22 0a 20 20 7d 20 0a 20 20 69 66 20 7b 24 69  )".  } .  if {$i
0f10: 52 69 67 68 74 50 72 65 63 20 3e 3d 20 24 69 50  RightPrec >= $iP
0f20: 72 65 63 20 7c 7c 20 24 61 6c 6c 5f 62 72 61 63  rec || $all_brac
0f30: 6b 65 74 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  kets} {.    set 
0f40: 7a 52 69 67 68 74 20 22 28 24 7a 52 69 67 68 74  zRight "($zRight
0f50: 29 22 0a 20 20 7d 20 0a 0a 20 20 72 65 74 75 72  )".  } ..  retur
0f60: 6e 20 22 24 7a 4c 65 66 74 20 24 6f 70 20 24 7a  n "$zLeft $op $z
0f70: 52 69 67 68 74 22 0a 7d 0a 0a 70 72 6f 63 20 64  Right".}..proc d
0f80: 6f 5f 65 78 70 72 70 61 72 73 65 5f 74 65 73 74  o_exprparse_test
0f90: 20 7b 6e 61 6d 65 20 65 78 70 72 20 74 72 65 65   {name expr tree
0fa0: 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f  } {.  uplevel do
0fb0: 5f 74 65 73 74 20 24 6e 61 6d 65 20 5b 6c 69 73  _test $name [lis
0fc0: 74 20 22 74 65 73 74 5f 66 74 73 33 65 78 70 72  t "test_fts3expr
0fd0: 32 20 7b 24 65 78 70 72 7d 22 5d 20 5b 6c 69 73  2 {$expr}"] [lis
0fe0: 74 20 24 74 72 65 65 5d 0a 7d 0a 0a 66 6f 72 20  t $tree].}..for 
0ff0: 7b 73 65 74 20 69 54 65 73 74 20 31 7d 20 7b 24  {set iTest 1} {$
1000: 69 54 65 73 74 3c 35 30 30 7d 20 7b 69 6e 63 72  iTest<500} {incr
1010: 20 69 54 65 73 74 7d 20 7b 0a 20 20 73 65 74 20   iTest} {.  set 
1020: 74 20 5b 72 61 6e 64 6f 6d 5f 65 78 70 72 5f 74  t [random_expr_t
1030: 72 65 65 20 34 5d 0a 0a 20 20 73 65 74 20 65 31  ree 4]..  set e1
1040: 20 5b 74 72 65 65 5f 74 6f 5f 65 78 70 72 20 24   [tree_to_expr $
1050: 74 20 30 20 30 5d 0a 20 20 73 65 74 20 65 32 20  t 0 0].  set e2 
1060: 5b 74 72 65 65 5f 74 6f 5f 65 78 70 72 20 24 74  [tree_to_expr $t
1070: 20 30 20 31 5d 0a 20 20 73 65 74 20 65 33 20 5b   0 1].  set e3 [
1080: 74 72 65 65 5f 74 6f 5f 65 78 70 72 20 24 74 20  tree_to_expr $t 
1090: 31 20 30 5d 0a 20 20 73 65 74 20 65 34 20 5b 74  1 0].  set e4 [t
10a0: 72 65 65 5f 74 6f 5f 65 78 70 72 20 24 74 20 31  ree_to_expr $t 1
10b0: 20 31 5d 0a 0a 20 20 64 6f 5f 65 78 70 72 70 61   1]..  do_exprpa
10c0: 72 73 65 5f 74 65 73 74 20 66 74 73 33 65 78 70  rse_test fts3exp
10d0: 72 32 2d 24 69 54 65 73 74 2e 31 20 24 65 31 20  r2-$iTest.1 $e1 
10e0: 24 74 0a 20 20 64 6f 5f 65 78 70 72 70 61 72 73  $t.  do_exprpars
10f0: 65 5f 74 65 73 74 20 66 74 73 33 65 78 70 72 32  e_test fts3expr2
1100: 2d 24 69 54 65 73 74 2e 32 20 24 65 32 20 24 74  -$iTest.2 $e2 $t
1110: 0a 20 20 64 6f 5f 65 78 70 72 70 61 72 73 65 5f  .  do_exprparse_
1120: 74 65 73 74 20 66 74 73 33 65 78 70 72 32 2d 24  test fts3expr2-$
1130: 69 54 65 73 74 2e 33 20 24 65 33 20 24 74 0a 20  iTest.3 $e3 $t. 
1140: 20 64 6f 5f 65 78 70 72 70 61 72 73 65 5f 74 65   do_exprparse_te
1150: 73 74 20 66 74 73 33 65 78 70 72 32 2d 24 69 54  st fts3expr2-$iT
1160: 65 73 74 2e 34 20 24 65 34 20 24 74 0a 7d 0a 0a  est.4 $e4 $t.}..
1170: 73 65 74 20 73 71 6c 69 74 65 5f 66 74 73 33 5f  set sqlite_fts3_
1180: 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
1190: 65 73 20 30 0a 66 69 6e 69 73 68 5f 74 65 73 74  es 0.finish_test
11a0: 0a 0a                                            ..