/ Hex Artifact Content
Login

Artifact 3b1dbceddd8622599f3cc2626897667fe40487aaa1676707d6c37ec5a8422fc1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4e 6f 76 20 32  /*.** 2008 Nov 2
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
0190: 20 63 6f 64 65 20 74 68 61 74 20 69 6d 70 6c 65   code that imple
01a0: 6d 65 6e 74 73 20 61 20 70 61 72 73 65 72 20 66  ments a parser f
01b0: 6f 72 20 66 74 73 33 20 71 75 65 72 79 20 73 74  or fts3 query st
01c0: 72 69 6e 67 73 0a 2a 2a 20 28 74 68 65 20 72 69  rings.** (the ri
01d0: 67 68 74 2d 68 61 6e 64 20 61 72 67 75 6d 65 6e  ght-hand argumen
01e0: 74 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f  t to the MATCH o
01f0: 70 65 72 61 74 6f 72 29 2e 20 42 65 63 61 75 73  perator). Becaus
0200: 65 20 74 68 65 20 73 75 70 70 6f 72 74 65 64 20  e the supported 
0210: 0a 2a 2a 20 73 79 6e 74 61 78 20 69 73 20 72 65  .** syntax is re
0220: 6c 61 74 69 76 65 6c 79 20 73 69 6d 70 6c 65 2c  latively simple,
0230: 20 74 68 65 20 77 68 6f 6c 65 20 74 6f 6b 65 6e   the whole token
0240: 69 7a 65 72 2f 70 61 72 73 65 72 20 73 79 73 74  izer/parser syst
0250: 65 6d 20 69 73 0a 2a 2a 20 68 61 6e 64 2d 63 6f  em is.** hand-co
0260: 64 65 64 2e 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ded. .*/.#includ
0270: 65 20 22 66 74 73 33 49 6e 74 2e 68 22 0a 23 69  e "fts3Int.h".#i
0280: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
0290: 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
02a0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
02b0: 5f 46 54 53 33 29 0a 0a 2f 2a 0a 2a 2a 20 42 79  _FTS3)../*.** By
02c0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6d   default, this m
02d0: 6f 64 75 6c 65 20 70 61 72 73 65 73 20 74 68 65  odule parses the
02e0: 20 6c 65 67 61 63 79 20 73 79 6e 74 61 78 20 74   legacy syntax t
02f0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a  hat has been .**
0300: 20 74 72 61 64 69 74 69 6f 6e 61 6c 6c 79 20 75   traditionally u
0310: 73 65 64 20 62 79 20 66 74 73 33 2e 20 4f 72 2c  sed by fts3. Or,
0320: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
0330: 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 45 53  E_FTS3_PARENTHES
0340: 49 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  IS.** is defined
0350: 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73 20 74  , then it uses t
0360: 68 65 20 6e 65 77 20 73 79 6e 74 61 78 2e 20 54  he new syntax. T
0370: 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 62  he differences b
0380: 65 74 77 65 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  etween.** the ne
0390: 77 20 61 6e 64 20 74 68 65 20 6f 6c 64 20 73 79  w and the old sy
03a0: 6e 74 61 78 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ntaxes are:.**.*
03b0: 2a 20 20 61 29 20 54 68 65 20 6e 65 77 20 73 79  *  a) The new sy
03c0: 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 70 61  ntax supports pa
03d0: 72 65 6e 74 68 65 73 69 73 2e 20 54 68 65 20 6f  renthesis. The o
03e0: 6c 64 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  ld does not..**.
03f0: 2a 2a 20 20 62 29 20 54 68 65 20 6e 65 77 20 73  **  b) The new s
0400: 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 74  yntax supports t
0410: 68 65 20 41 4e 44 20 61 6e 64 20 4e 4f 54 20 6f  he AND and NOT o
0420: 70 65 72 61 74 6f 72 73 2e 20 54 68 65 20 6f 6c  perators. The ol
0430: 64 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a  d does not..**.*
0440: 2a 20 20 63 29 20 54 68 65 20 6f 6c 64 20 73 79  *  c) The old sy
0450: 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 74 68  ntax supports th
0460: 65 20 22 2d 22 20 74 6f 6b 65 6e 20 71 75 61 6c  e "-" token qual
0470: 69 66 69 65 72 2e 20 54 68 69 73 20 69 73 20 6e  ifier. This is n
0480: 6f 74 20 0a 2a 2a 20 20 20 20 20 73 75 70 70 6f  ot .**     suppo
0490: 72 74 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  rted by the new 
04a0: 73 79 6e 74 61 78 20 28 69 74 20 69 73 20 72 65  syntax (it is re
04b0: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 4e 4f  placed by the NO
04c0: 54 20 6f 70 65 72 61 74 6f 72 29 2e 0a 2a 2a 0a  T operator)..**.
04d0: 2a 2a 20 20 64 29 20 57 68 65 6e 20 75 73 69 6e  **  d) When usin
04e0: 67 20 74 68 65 20 6f 6c 64 20 73 79 6e 74 61 78  g the old syntax
04f0: 2c 20 74 68 65 20 4f 52 20 6f 70 65 72 61 74 6f  , the OR operato
0500: 72 20 68 61 73 20 61 20 67 72 65 61 74 65 72 20  r has a greater 
0510: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 20 20  precedence.**   
0520: 20 20 74 68 61 6e 20 61 6e 20 69 6d 70 6c 69 63    than an implic
0530: 69 74 20 41 4e 44 2e 20 57 68 65 6e 20 75 73 69  it AND. When usi
0540: 6e 67 20 74 68 65 20 6e 65 77 2c 20 62 6f 74 68  ng the new, both
0550: 20 69 6d 70 6c 69 63 69 74 79 20 61 6e 64 20 65   implicity and e
0560: 78 70 6c 69 63 69 74 0a 2a 2a 20 20 20 20 20 41  xplicit.**     A
0570: 4e 44 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76  ND operators hav
0580: 65 20 61 20 68 69 67 68 65 72 20 70 72 65 63 65  e a higher prece
0590: 64 65 6e 63 65 20 74 68 61 6e 20 4f 52 2e 0a 2a  dence than OR..*
05a0: 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
05b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
05c0: 54 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  T defined, then 
05d0: 74 68 69 73 20 6d 6f 64 75 6c 65 20 65 78 70 6f  this module expo
05e0: 72 74 73 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f  rts the.** symbo
05f0: 6c 20 22 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  l "int sqlite3_f
0600: 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
0610: 74 68 65 73 65 73 22 2e 20 53 65 74 74 69 6e 67  theses". Setting
0620: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a   this variable.*
0630: 2a 20 74 6f 20 7a 65 72 6f 20 63 61 75 73 65 73  * to zero causes
0640: 20 74 68 65 20 6d 6f 64 75 6c 65 20 74 6f 20 75   the module to u
0650: 73 65 20 74 68 65 20 6f 6c 64 20 73 79 6e 74 61  se the old synta
0660: 78 2e 20 49 66 20 69 74 20 69 73 20 73 65 74 20  x. If it is set 
0670: 74 6f 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  to .** non-zero 
0680: 74 68 65 20 6e 65 77 20 73 79 6e 74 61 78 20 69  the new syntax i
0690: 73 20 61 63 74 69 76 61 74 65 64 2e 20 54 68 69  s activated. Thi
06a0: 73 20 69 73 20 73 6f 20 62 6f 74 68 20 73 79 6e  s is so both syn
06b0: 74 61 78 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  taxes can.** be 
06c0: 74 65 73 74 65 64 20 75 73 69 6e 67 20 61 20 73  tested using a s
06d0: 69 6e 67 6c 65 20 62 75 69 6c 64 20 6f 66 20 74  ingle build of t
06e0: 65 73 74 66 69 78 74 75 72 65 2e 0a 2a 2a 0a 2a  estfixture..**.*
06f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0700: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 79  describes the sy
0710: 6e 74 61 78 20 73 75 70 70 6f 72 74 65 64 20 62  ntax supported b
0720: 79 20 74 68 65 20 66 74 73 33 20 4d 41 54 43 48  y the fts3 MATCH
0730: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  .** operator in 
0740: 61 20 73 69 6d 69 6c 61 72 20 66 6f 72 6d 61 74  a similar format
0750: 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79   to that used by
0760: 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72 73 65   the lemon parse
0770: 72 0a 2a 2a 20 67 65 6e 65 72 61 74 6f 72 2e 20  r.** generator. 
0780: 54 68 69 73 20 6d 6f 64 75 6c 65 20 64 6f 65 73  This module does
0790: 20 6e 6f 74 20 75 73 65 20 61 63 74 75 61 6c 6c   not use actuall
07a0: 79 20 6c 65 6d 6f 6e 2c 20 69 74 20 75 73 65 73  y lemon, it uses
07b0: 20 61 0a 2a 2a 20 63 75 73 74 6f 6d 20 70 61 72   a.** custom par
07c0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 71 75 65  ser..**.**   que
07d0: 72 79 20 3a 3a 3d 20 61 6e 64 65 78 70 72 20 28  ry ::= andexpr (
07e0: 4f 52 20 61 6e 64 65 78 70 72 29 2a 2e 0a 2a 2a  OR andexpr)*..**
07f0: 0a 2a 2a 20 20 20 61 6e 64 65 78 70 72 20 3a 3a  .**   andexpr ::
0800: 3d 20 6e 6f 74 65 78 70 72 20 28 41 4e 44 3f 20  = notexpr (AND? 
0810: 6e 6f 74 65 78 70 72 29 2a 2e 0a 2a 2a 0a 2a 2a  notexpr)*..**.**
0820: 20 20 20 6e 6f 74 65 78 70 72 20 3a 3a 3d 20 6e     notexpr ::= n
0830: 65 61 72 65 78 70 72 20 28 4e 4f 54 20 6e 65 61  earexpr (NOT nea
0840: 72 65 78 70 72 7c 2d 54 4f 4b 45 4e 29 2a 2e 0a  rexpr|-TOKEN)*..
0850: 2a 2a 20 20 20 6e 6f 74 65 78 70 72 20 3a 3a 3d  **   notexpr ::=
0860: 20 4c 50 20 71 75 65 72 79 20 52 50 2e 0a 2a 2a   LP query RP..**
0870: 0a 2a 2a 20 20 20 6e 65 61 72 65 78 70 72 20 3a  .**   nearexpr :
0880: 3a 3d 20 70 68 72 61 73 65 20 28 4e 45 41 52 20  := phrase (NEAR 
0890: 64 69 73 74 61 6e 63 65 5f 6f 70 74 20 6e 65 61  distance_opt nea
08a0: 72 65 78 70 72 29 2a 2e 0a 2a 2a 0a 2a 2a 20 20  rexpr)*..**.**  
08b0: 20 64 69 73 74 61 6e 63 65 5f 6f 70 74 20 3a 3a   distance_opt ::
08c0: 3d 20 2e 0a 2a 2a 20 20 20 64 69 73 74 61 6e 63  = ..**   distanc
08d0: 65 5f 6f 70 74 20 3a 3a 3d 20 2f 20 49 4e 54 45  e_opt ::= / INTE
08e0: 47 45 52 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 68 72  GER..**.**   phr
08f0: 61 73 65 20 3a 3a 3d 20 54 4f 4b 45 4e 2e 0a 2a  ase ::= TOKEN..*
0900: 2a 20 20 20 70 68 72 61 73 65 20 3a 3a 3d 20 43  *   phrase ::= C
0910: 4f 4c 55 4d 4e 3a 54 4f 4b 45 4e 2e 0a 2a 2a 20  OLUMN:TOKEN..** 
0920: 20 20 70 68 72 61 73 65 20 3a 3a 3d 20 22 54 4f    phrase ::= "TO
0930: 4b 45 4e 20 54 4f 4b 45 4e 20 54 4f 4b 45 4e 2e  KEN TOKEN TOKEN.
0940: 2e 2e 22 2e 0a 2a 2f 0a 0a 23 69 66 64 65 66 20  .."..*/..#ifdef 
0950: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0960: 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61  sqlite3_fts3_ena
0970: 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20  ble_parentheses 
0980: 3d 20 30 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  = 0;.#else.# ifd
0990: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
09a0: 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 45 53 49  _FTS3_PARENTHESI
09b0: 53 20 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c  S .#  define sql
09c0: 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
09d0: 5f 70 61 72 65 6e 74 68 65 73 65 73 20 31 0a 23  _parentheses 1.#
09e0: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
09f0: 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61  sqlite3_fts3_ena
0a00: 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20  ble_parentheses 
0a10: 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  0.# endif.#endif
0a20: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
0a30: 73 70 61 6e 20 66 6f 72 20 4e 45 41 52 20 6f 70  span for NEAR op
0a40: 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 23 64 65 66  erators..*/.#def
0a50: 69 6e 65 20 53 51 4c 49 54 45 5f 46 54 53 33 5f  ine SQLITE_FTS3_
0a60: 44 45 46 41 55 4c 54 5f 4e 45 41 52 5f 50 41 52  DEFAULT_NEAR_PAR
0a70: 41 4d 20 31 30 0a 0a 23 69 6e 63 6c 75 64 65 20  AM 10..#include 
0a80: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0a90: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0aa0: 2f 2a 0a 2a 2a 20 69 73 4e 6f 74 3a 0a 2a 2a 20  /*.** isNot:.** 
0ab0: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
0ac0: 69 73 20 75 73 65 64 20 62 79 20 66 75 6e 63 74  is used by funct
0ad0: 69 6f 6e 20 67 65 74 4e 65 78 74 4e 6f 64 65 28  ion getNextNode(
0ae0: 29 2e 20 57 68 65 6e 20 67 65 74 4e 65 78 74 4e  ). When getNextN
0af0: 6f 64 65 28 29 20 69 73 0a 2a 2a 20 20 20 63 61  ode() is.**   ca
0b00: 6c 6c 65 64 2c 20 69 74 20 73 65 74 73 20 50 61  lled, it sets Pa
0b10: 72 73 65 43 6f 6e 74 65 78 74 2e 69 73 4e 6f 74  rseContext.isNot
0b20: 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
0b30: 27 6e 65 78 74 20 6e 6f 64 65 27 20 69 73 20 61  'next node' is a
0b40: 20 0a 2a 2a 20 20 20 46 54 53 51 55 45 52 59 5f   .**   FTSQUERY_
0b50: 50 48 52 41 53 45 20 77 69 74 68 20 61 20 75 6e  PHRASE with a un
0b60: 61 72 79 20 22 2d 22 20 61 74 74 61 63 68 65 64  ary "-" attached
0b70: 20 74 6f 20 69 74 2e 20 69 2e 65 2e 20 22 6d 79   to it. i.e. "my
0b80: 73 71 6c 22 20 69 6e 20 74 68 65 0a 2a 2a 20 20  sql" in the.**  
0b90: 20 46 54 53 33 20 71 75 65 72 79 20 22 73 71 6c   FTS3 query "sql
0ba0: 69 74 65 20 2d 6d 79 73 71 6c 22 2e 20 4f 74 68  ite -mysql". Oth
0bb0: 65 72 77 69 73 65 2c 20 50 61 72 73 65 43 6f 6e  erwise, ParseCon
0bc0: 74 65 78 74 2e 69 73 4e 6f 74 20 69 73 20 73 65  text.isNot is se
0bd0: 74 20 74 6f 0a 2a 2a 20 20 20 7a 65 72 6f 2e 0a  t to.**   zero..
0be0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0bf0: 74 20 50 61 72 73 65 43 6f 6e 74 65 78 74 20 50  t ParseContext P
0c00: 61 72 73 65 43 6f 6e 74 65 78 74 3b 0a 73 74 72  arseContext;.str
0c10: 75 63 74 20 50 61 72 73 65 43 6f 6e 74 65 78 74  uct ParseContext
0c20: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b   {.  sqlite3_tok
0c30: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
0c40: 65 72 3b 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  er;      /* Toke
0c50: 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a 2f 0a  nizer module */.
0c60: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 3b 20 20    int iLangid;  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
0c90: 65 20 69 64 20 75 73 65 64 20 77 69 74 68 20 74  e id used with t
0ca0: 6f 6b 65 6e 69 7a 65 72 20 2a 2f 0a 20 20 63 6f  okenizer */.  co
0cb0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  nst char **azCol
0cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cd0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
0ce0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 66  lumn names for f
0cf0: 74 73 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ts3 table */.  i
0d00: 6e 74 20 62 46 74 73 34 3b 20 20 20 20 20 20 20  nt bFts4;       
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c     /* True to al
0d30: 6c 6f 77 20 46 54 53 34 2d 6f 6e 6c 79 20 73 79  low FTS4-only sy
0d40: 6e 74 61 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ntax */.  int nC
0d50: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d70: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0d80: 65 73 20 69 6e 20 61 7a 43 6f 6c 5b 5d 20 2a 2f  es in azCol[] */
0d90: 0a 20 20 69 6e 74 20 69 44 65 66 61 75 6c 74 43  .  int iDefaultC
0da0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0db0: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
0dc0: 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72  t column to quer
0dd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 6f 74  y */.  int isNot
0de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0e00: 75 65 20 69 66 20 67 65 74 4e 65 78 74 4e 6f 64  ue if getNextNod
0e10: 65 28 29 20 73 65 65 73 20 61 20 75 6e 61 72 79  e() sees a unary
0e20: 20 2d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   - */.  sqlite3_
0e30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20  context *pCtx;  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0e50: 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  rite error messa
0e60: 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
0e70: 20 6e 4e 65 73 74 3b 20 20 20 20 20 20 20 20 20   nNest;         
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
0ea0: 73 74 65 64 20 62 72 61 63 6b 65 74 73 20 2a 2f  sted brackets */
0eb0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
0ec0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 71 75 69  function is equi
0ed0: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 74  valent to the st
0ee0: 61 6e 64 61 72 64 20 69 73 73 70 61 63 65 28 29  andard isspace()
0ef0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
0f00: 2a 20 54 68 65 20 73 74 61 6e 64 61 72 64 20 69  * The standard i
0f10: 73 73 70 61 63 65 28 29 20 63 61 6e 20 62 65 20  sspace() can be 
0f20: 61 77 6b 77 61 72 64 20 74 6f 20 75 73 65 20 73  awkward to use s
0f30: 61 66 65 6c 79 2c 20 62 65 63 61 75 73 65 20 61  afely, because a
0f40: 6c 74 68 6f 75 67 68 20 69 74 0a 2a 2a 20 69 73  lthough it.** is
0f50: 20 64 65 66 69 6e 65 64 20 74 6f 20 61 63 63 65   defined to acce
0f60: 70 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6f  pt an argument o
0f70: 66 20 74 79 70 65 20 69 6e 74 2c 20 69 74 73 20  f type int, its 
0f80: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 70 61  behavior when pa
0f90: 73 73 65 64 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  ssed.** an integ
0fa0: 65 72 20 74 68 61 74 20 66 61 6c 6c 73 20 6f 75  er that falls ou
0fb0: 74 73 69 64 65 20 6f 66 20 74 68 65 20 72 61 6e  tside of the ran
0fc0: 67 65 20 6f 66 20 74 68 65 20 75 6e 73 69 67 6e  ge of the unsign
0fd0: 65 64 20 63 68 61 72 20 74 79 70 65 0a 2a 2a 20  ed char type.** 
0fe0: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 28 61 6e  is undefined (an
0ff0: 64 20 73 6f 6d 65 74 69 6d 65 73 2c 20 22 75 6e  d sometimes, "un
1000: 64 65 66 69 6e 65 64 22 20 6d 65 61 6e 73 20 73  defined" means s
1010: 65 67 66 61 75 6c 74 29 2e 20 54 68 69 73 20 77  egfault). This w
1020: 72 61 70 70 65 72 0a 2a 2a 20 69 73 20 64 65 66  rapper.** is def
1030: 69 6e 65 64 20 74 6f 20 61 63 63 65 70 74 20 61  ined to accept a
1040: 6e 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  n argument of ty
1050: 70 65 20 63 68 61 72 2c 20 61 6e 64 20 61 6c 77  pe char, and alw
1060: 61 79 73 20 72 65 74 75 72 6e 73 20 30 20 66 6f  ays returns 0 fo
1070: 72 0a 2a 2a 20 61 6e 79 20 76 61 6c 75 65 73 20  r.** any values 
1080: 74 68 61 74 20 66 61 6c 6c 20 6f 75 74 73 69 64  that fall outsid
1090: 65 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 6f  e of the range o
10a0: 66 20 74 68 65 20 75 6e 73 69 67 6e 65 64 20 63  f the unsigned c
10b0: 68 61 72 20 74 79 70 65 20 28 69 2e 65 2e 0a 2a  har type (i.e..*
10c0: 2a 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  * negative value
10d0: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
10e0: 74 20 66 74 73 33 69 73 73 70 61 63 65 28 63 68  t fts3isspace(ch
10f0: 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e 20  ar c){.  return 
1100: 63 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c 74  c==' ' || c=='\t
1110: 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20  ' || c=='\n' || 
1120: 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\r' || c=='\
1130: 76 27 20 7c 7c 20 63 3d 3d 27 5c 66 27 3b 0a 7d  v' || c=='\f';.}
1140: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1150: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1160: 6d 65 6d 6f 72 79 20 75 73 69 6e 67 20 73 71 6c  memory using sql
1170: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49  ite3_malloc(). I
1180: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
1190: 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
11a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11b0: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  g a pointer to i
11c0: 74 2e 20 49 66 20 75 6e 73 75 63 63 65 73 73 66  t. If unsuccessf
11d0: 75 6c 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  ul, .** return N
11e0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
11f0: 6f 69 64 20 2a 66 74 73 33 4d 61 6c 6c 6f 63 5a  oid *fts3MallocZ
1200: 65 72 6f 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a  ero(int nByte){.
1210: 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 73    void *pRet = s
1220: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
1230: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74  yte);.  if( pRet
1240: 20 29 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20   ) memset(pRet, 
1250: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 72 65 74  0, nByte);.  ret
1260: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 69 6e 74  urn pRet;.}..int
1270: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
1280: 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 73 71 6c  Tokenizer(.  sql
1290: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
12a0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 69 6e  pTokenizer,.  in
12b0: 74 20 69 4c 61 6e 67 69 64 2c 0a 20 20 63 6f 6e  t iLangid,.  con
12c0: 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20 69 6e  st char *z,.  in
12d0: 74 20 6e 2c 0a 20 20 73 71 6c 69 74 65 33 5f 74  t n,.  sqlite3_t
12e0: 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
12f0: 2a 2a 70 70 43 73 72 0a 29 7b 0a 20 20 73 71 6c  **ppCsr.){.  sql
1300: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
1310: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
1320: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
1330: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
1340: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1350: 63 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 30  cursor *pCsr = 0
1360: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1370: 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70  c = pModule->xOp
1380: 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 7a  en(pTokenizer, z
1390: 2c 20 6e 2c 20 26 70 43 73 72 29 3b 0a 20 20 61  , n, &pCsr);.  a
13a0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
13b0: 45 5f 4f 4b 20 7c 7c 20 70 43 73 72 3d 3d 30 20  E_OK || pCsr==0 
13c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
13d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
13e0: 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 3d  sr->pTokenizer =
13f0: 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20   pTokenizer;.   
1400: 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 69 56   if( pModule->iV
1410: 65 72 73 69 6f 6e 3e 3d 31 20 29 7b 0a 20 20 20  ersion>=1 ){.   
1420: 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
1430: 3e 78 4c 61 6e 67 75 61 67 65 69 64 28 70 43 73  >xLanguageid(pCs
1440: 72 2c 20 69 4c 61 6e 67 69 64 29 3b 0a 20 20 20  r, iLangid);.   
1450: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1460: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1470: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
1480: 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 70  pCsr);.        p
1490: 43 73 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Csr = 0;.      }
14a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
14b0: 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 72 65  Csr = pCsr;.  re
14c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14d0: 2a 20 46 75 6e 63 74 69 6f 6e 20 67 65 74 4e 65  * Function getNe
14e0: 78 74 4e 6f 64 65 28 29 2c 20 77 68 69 63 68 20  xtNode(), which 
14f0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 66 74 73  is called by fts
1500: 33 45 78 70 72 50 61 72 73 65 28 29 2c 20 6d 61  3ExprParse(), ma
1510: 79 20 69 74 73 65 6c 66 0a 2a 2a 20 63 61 6c 6c  y itself.** call
1520: 20 66 74 73 33 45 78 70 72 50 61 72 73 65 28 29   fts3ExprParse()
1530: 2e 20 53 6f 20 74 68 69 73 20 66 6f 72 77 61 72  . So this forwar
1540: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73  d declaration is
1550: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
1560: 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 78 70  atic int fts3Exp
1570: 72 50 61 72 73 65 28 50 61 72 73 65 43 6f 6e 74  rParse(ParseCont
1580: 65 78 74 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ext *, const cha
1590: 72 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33 45 78  r *, int, Fts3Ex
15a0: 70 72 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a  pr **, int *);..
15b0: 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68  /*.** Extract th
15c0: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20 66 72 6f  e next token fro
15d0: 6d 20 62 75 66 66 65 72 20 7a 20 28 6c 65 6e 67  m buffer z (leng
15e0: 74 68 20 6e 29 20 75 73 69 6e 67 20 74 68 65 20  th n) using the 
15f0: 74 6f 6b 65 6e 69 7a 65 72 0a 2a 2a 20 61 6e 64  tokenizer.** and
1600: 20 6f 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69   other informati
1610: 6f 6e 20 28 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  on (column names
1620: 20 65 74 63 2e 29 20 69 6e 20 70 50 61 72 73 65   etc.) in pParse
1630: 2e 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 33  . Create an Fts3
1640: 45 78 70 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  Expr.** structur
1650: 65 20 6f 66 20 74 79 70 65 20 46 54 53 51 55 45  e of type FTSQUE
1660: 52 59 5f 50 48 52 41 53 45 20 63 6f 6e 74 61 69  RY_PHRASE contai
1670: 6e 69 6e 67 20 61 20 70 68 72 61 73 65 20 63 6f  ning a phrase co
1680: 6e 73 69 73 74 69 6e 67 20 6f 66 20 74 68 69 73  nsisting of this
1690: 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e  .** single token
16a0: 20 61 6e 64 20 73 65 74 20 2a 70 70 45 78 70 72   and set *ppExpr
16b0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 69 74 2e   to point to it.
16c0: 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   If the end of t
16d0: 68 65 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  he buffer is.** 
16e0: 72 65 61 63 68 65 64 20 62 65 66 6f 72 65 20 61  reached before a
16f0: 20 74 6f 6b 65 6e 20 69 73 20 66 6f 75 6e 64 2c   token is found,
1700: 20 73 65 74 20 2a 70 70 45 78 70 72 20 74 6f 20   set *ppExpr to 
1710: 7a 65 72 6f 2e 20 49 74 20 69 73 20 74 68 65 0a  zero. It is the.
1720: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
1730: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1740: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 64 65  to eventually de
1750: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 61 6c 6c  allocate the all
1760: 6f 63 61 74 65 64 20 0a 2a 2a 20 46 74 73 33 45  ocated .** Fts3E
1770: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 28 69  xpr structure (i
1780: 66 20 61 6e 79 29 20 62 79 20 70 61 73 73 69 6e  f any) by passin
1790: 67 20 69 74 20 74 6f 20 73 71 6c 69 74 65 33 5f  g it to sqlite3_
17a0: 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  free()..**.** Re
17b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
17c0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
17d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
17e0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
17f0: 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  tion.** fails..*
1800: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1810: 4e 65 78 74 54 6f 6b 65 6e 28 0a 20 20 50 61 72  NextToken(.  Par
1820: 73 65 43 6f 6e 74 65 78 74 20 2a 70 50 61 72 73  seContext *pPars
1830: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1840: 20 20 20 20 20 2f 2a 20 66 74 73 33 20 71 75 65       /* fts3 que
1850: 72 79 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  ry parse context
1860: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1890: 20 56 61 6c 75 65 20 66 6f 72 20 46 74 73 33 50   Value for Fts3P
18a0: 68 72 61 73 65 2e 69 43 6f 6c 75 6d 6e 20 2a 2f  hrase.iColumn */
18b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18c0: 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
18d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18e0: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  put string */.  
18f0: 46 74 73 33 45 78 70 72 20 2a 2a 70 70 45 78 70  Fts3Expr **ppExp
1900: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1920: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1930: 69 6e 74 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20  int *pnConsumed 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1960: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1970: 63 6f 6e 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20  consumed */.){. 
1980: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
1990: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d  er *pTokenizer =
19a0: 20 70 50 61 72 73 65 2d 3e 70 54 6f 6b 65 6e 69   pParse->pTokeni
19b0: 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  zer;.  sqlite3_t
19c0: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
19d0: 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d  const *pModule =
19e0: 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f   pTokenizer->pMo
19f0: 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  dule;.  int rc;.
1a00: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
1a10: 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  zer_cursor *pCur
1a20: 73 6f 72 3b 0a 20 20 46 74 73 33 45 78 70 72 20  sor;.  Fts3Expr 
1a30: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  *pRet = 0;.  int
1a40: 20 69 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65   i = 0;..  /* Se
1a50: 74 20 76 61 72 69 61 62 6c 65 20 69 20 74 6f 20  t variable i to 
1a60: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
1a70: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 69  er of bytes of i
1a80: 6e 70 75 74 20 74 6f 20 74 6f 6b 65 6e 69 7a 65  nput to tokenize
1a90: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
1aa0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1ab0: 66 28 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  f( sqlite3_fts3_
1ac0: 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
1ad0: 65 73 20 26 26 20 28 7a 5b 69 5d 3d 3d 27 28 27  es && (z[i]=='('
1ae0: 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 29 27 29 20 29   || z[i]==')') )
1af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1b00: 7a 5b 69 5d 3d 3d 27 22 27 20 29 20 62 72 65 61  z[i]=='"' ) brea
1b10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 43 6f 6e  k;.  }..  *pnCon
1b20: 73 75 6d 65 64 20 3d 20 69 3b 0a 20 20 72 63 20  sumed = i;.  rc 
1b30: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
1b40: 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65  nTokenizer(pToke
1b50: 6e 69 7a 65 72 2c 20 70 50 61 72 73 65 2d 3e 69  nizer, pParse->i
1b60: 4c 61 6e 67 69 64 2c 20 7a 2c 20 69 2c 20 26 70  Langid, z, i, &p
1b70: 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72  Cursor);.  if( r
1b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ba0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 6e 74 20  zToken;.    int 
1bb0: 6e 54 6f 6b 65 6e 20 3d 20 30 2c 20 69 53 74 61  nToken = 0, iSta
1bc0: 72 74 20 3d 20 30 2c 20 69 45 6e 64 20 3d 20 30  rt = 0, iEnd = 0
1bd0: 2c 20 69 50 6f 73 69 74 69 6f 6e 20 3d 20 30 3b  , iPosition = 0;
1be0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c10: 20 74 6f 74 61 6c 20 73 70 61 63 65 20 74 6f 20   total space to 
1c20: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
1c30: 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
1c40: 4e 65 78 74 28 70 43 75 72 73 6f 72 2c 20 26 7a  Next(pCursor, &z
1c50: 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20  Token, &nToken, 
1c60: 26 69 53 74 61 72 74 2c 20 26 69 45 6e 64 2c 20  &iStart, &iEnd, 
1c70: 26 69 50 6f 73 69 74 69 6f 6e 29 3b 0a 20 20 20  &iPosition);.   
1c80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  OK ){.      nByt
1ca0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 45  e = sizeof(Fts3E
1cb0: 78 70 72 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  xpr) + sizeof(Ft
1cc0: 73 33 50 68 72 61 73 65 29 20 2b 20 6e 54 6f 6b  s3Phrase) + nTok
1cd0: 65 6e 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  en;.      pRet =
1ce0: 20 28 46 74 73 33 45 78 70 72 20 2a 29 66 74 73   (Fts3Expr *)fts
1cf0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74  3MallocZero(nByt
1d00: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
1d10: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Ret ){.        r
1d20: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1d30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d40: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 65 54 79         pRet->eTy
1d50: 70 65 20 3d 20 46 54 53 51 55 45 52 59 5f 50 48  pe = FTSQUERY_PH
1d60: 52 41 53 45 3b 0a 20 20 20 20 20 20 20 20 70 52  RASE;.        pR
1d70: 65 74 2d 3e 70 50 68 72 61 73 65 20 3d 20 28 46  et->pPhrase = (F
1d80: 74 73 33 50 68 72 61 73 65 20 2a 29 26 70 52 65  ts3Phrase *)&pRe
1d90: 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 52  t[1];.        pR
1da0: 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f  et->pPhrase->nTo
1db0: 6b 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ken = 1;.       
1dc0: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e   pRet->pPhrase->
1dd0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
1de0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50          pRet->pP
1df0: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  hrase->aToken[0]
1e00: 2e 6e 20 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20  .n = nToken;.   
1e10: 20 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61       pRet->pPhra
1e20: 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 7a 20  se->aToken[0].z 
1e30: 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65 74 2d  = (char *)&pRet-
1e40: 3e 70 50 68 72 61 73 65 5b 31 5d 3b 0a 20 20 20  >pPhrase[1];.   
1e50: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 74       memcpy(pRet
1e60: 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ->pPhrase->aToke
1e70: 6e 5b 30 5d 2e 7a 2c 20 7a 54 6f 6b 65 6e 2c 20  n[0].z, zToken, 
1e80: 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 20 20  nToken);..      
1e90: 20 20 69 66 28 20 69 45 6e 64 3c 6e 20 26 26 20    if( iEnd<n && 
1ea0: 7a 5b 69 45 6e 64 5d 3d 3d 27 2a 27 20 29 7b 0a  z[iEnd]=='*' ){.
1eb0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e            pRet->
1ec0: 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
1ed0: 30 5d 2e 69 73 50 72 65 66 69 78 20 3d 20 31 3b  0].isPrefix = 1;
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 69 45 6e 64 2b  .          iEnd+
1ef0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  +;.        }..  
1f00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
1f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f20: 21 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  !sqlite3_fts3_en
1f30: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
1f40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1f50: 69 53 74 61 72 74 3e 30 20 26 26 20 7a 5b 69 53  iStart>0 && z[iS
1f60: 74 61 72 74 2d 31 5d 3d 3d 27 2d 27 20 0a 20 20  tart-1]=='-' .  
1f70: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1f80: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
1f90: 73 4e 6f 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  sNot = 1;.      
1fa0: 20 20 20 20 20 20 69 53 74 61 72 74 2d 2d 3b 0a        iStart--;.
1fb0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
1fc0: 69 66 28 20 70 50 61 72 73 65 2d 3e 62 46 74 73  if( pParse->bFts
1fd0: 34 20 26 26 20 69 53 74 61 72 74 3e 30 20 26 26  4 && iStart>0 &&
1fe0: 20 7a 5b 69 53 74 61 72 74 2d 31 5d 3d 3d 27 5e   z[iStart-1]=='^
1ff0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
2000: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e   pRet->pPhrase->
2010: 61 54 6f 6b 65 6e 5b 30 5d 2e 62 46 69 72 73 74  aToken[0].bFirst
2020: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2030: 20 20 69 53 74 61 72 74 2d 2d 3b 0a 20 20 20 20    iStart--;.    
2040: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2060: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2070: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 20      }..      }. 
2080: 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64       *pnConsumed
2090: 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20 7d 65 6c   = iEnd;.    }el
20a0: 73 65 20 69 66 28 20 69 20 26 26 20 72 63 3d 3d  se if( i && rc==
20b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
20c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20d0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
20e0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
20f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
2100: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70 52 65  .  *ppExpr = pRe
2110: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
2120: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 6c 61 72 67  }.../*.** Enlarg
2130: 65 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  e a memory alloc
2140: 61 74 69 6f 6e 2e 20 20 49 66 20 61 6e 20 6f 75  ation.  If an ou
2150: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 61 6c 6c 6f  t-of-memory allo
2160: 63 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 0a 2a  cation occurs,.*
2170: 2a 20 74 68 65 6e 20 66 72 65 65 20 74 68 65 20  * then free the 
2180: 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  old allocation..
2190: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
21a0: 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  fts3ReallocOrFre
21b0: 65 28 76 6f 69 64 20 2a 70 4f 72 69 67 2c 20 69  e(void *pOrig, i
21c0: 6e 74 20 6e 4e 65 77 29 7b 0a 20 20 76 6f 69 64  nt nNew){.  void
21d0: 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
21e0: 5f 72 65 61 6c 6c 6f 63 28 70 4f 72 69 67 2c 20  _realloc(pOrig, 
21f0: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 21 70 52  nNew);.  if( !pR
2200: 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2210: 33 5f 66 72 65 65 28 70 4f 72 69 67 29 3b 0a 20  3_free(pOrig);. 
2220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
2230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
2240: 72 20 7a 49 6e 70 75 74 2c 20 6c 65 6e 67 74 68  r zInput, length
2250: 20 6e 49 6e 70 75 74 2c 20 63 6f 6e 74 61 69 6e   nInput, contain
2260: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
2270: 66 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  f a quoted strin
2280: 67 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  g.** that appear
2290: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  ed as part of an
22a0: 20 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72   fts3 query expr
22b0: 65 73 73 69 6f 6e 2e 20 4e 65 69 74 68 65 72 20  ession. Neither 
22c0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 0a  quote character.
22d0: 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  ** is included i
22e0: 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  n the buffer. Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
2300: 6d 70 74 73 20 74 6f 20 74 6f 6b 65 6e 69 7a 65  mpts to tokenize
2310: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 69   the entire.** i
2320: 6e 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20  nput buffer and 
2330: 63 72 65 61 74 65 20 61 6e 20 46 74 73 33 45 78  create an Fts3Ex
2340: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  pr structure of 
2350: 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
2360: 52 41 53 45 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  RASE .** contain
2370: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ing the results.
2380: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2390: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
23a0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23b0: 2a 70 70 45 78 70 72 20 73 65 74 20 74 6f 20 70  *ppExpr set to p
23c0: 6f 69 6e 74 20 61 74 20 74 68 65 0a 2a 2a 20 61  oint at the.** a
23d0: 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 45 78 70  llocated Fts3Exp
23e0: 72 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  r structure. Oth
23f0: 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53  erwise, either S
2400: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 28 6f 75 74  QLITE_NOMEM (out
2410: 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 65 72   of memory.** er
2420: 72 6f 72 29 20 6f 72 20 53 51 4c 49 54 45 5f 45  ror) or SQLITE_E
2430: 52 52 4f 52 20 28 74 6f 6b 65 6e 69 7a 61 74 69  RROR (tokenizati
2440: 6f 6e 20 65 72 72 6f 72 29 20 69 73 20 72 65 74  on error) is ret
2450: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 45 78 70  urned and *ppExp
2460: 72 20 73 65 74 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  r set.** to 0..*
2470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
2480: 4e 65 78 74 53 74 72 69 6e 67 28 0a 20 20 50 61  NextString(.  Pa
2490: 72 73 65 43 6f 6e 74 65 78 74 20 2a 70 50 61 72  rseContext *pPar
24a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
24b0: 20 20 20 20 20 20 2f 2a 20 66 74 73 33 20 71 75        /* fts3 qu
24c0: 65 72 79 20 70 61 72 73 65 20 63 6f 6e 74 65 78  ery parse contex
24d0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
24e0: 72 20 2a 7a 49 6e 70 75 74 2c 20 69 6e 74 20 6e  r *zInput, int n
24f0: 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 2f  Input,         /
2500: 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a  * Input string *
2510: 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 70  /.  Fts3Expr **p
2520: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
2530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2540: 55 54 3a 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  UT: expression *
2550: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
2560: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
2570: 69 7a 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  izer = pParse->p
2580: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
2590: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
25a0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
25b0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
25c0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e  r->pModule;.  in
25d0: 74 20 72 63 3b 0a 20 20 46 74 73 33 45 78 70 72  t rc;.  Fts3Expr
25e0: 20 2a 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   *p = 0;.  sqlit
25f0: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
2600: 73 6f 72 20 2a 70 43 75 72 73 6f 72 20 3d 20 30  sor *pCursor = 0
2610: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20  ;.  char *zTemp 
2620: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70  = 0;.  int nTemp
2630: 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74 20 69   = 0;..  const i
2640: 6e 74 20 6e 53 70 61 63 65 20 3d 20 73 69 7a 65  nt nSpace = size
2650: 6f 66 28 46 74 73 33 45 78 70 72 29 20 2b 20 73  of(Fts3Expr) + s
2660: 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61 73 65  izeof(Fts3Phrase
2670: 29 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  );.  int nToken 
2680: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  = 0;..  /* The f
2690: 69 6e 61 6c 20 46 74 73 33 45 78 70 72 20 64 61  inal Fts3Expr da
26a0: 74 61 20 73 74 72 75 63 74 75 72 65 2c 20 69 6e  ta structure, in
26b0: 63 6c 75 64 69 6e 67 20 74 68 65 20 46 74 73 33  cluding the Fts3
26c0: 50 68 72 61 73 65 2c 0a 20 20 2a 2a 20 46 74 73  Phrase,.  ** Fts
26d0: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 73 74 72  3PhraseToken str
26e0: 75 63 74 75 72 65 73 20 74 6f 6b 65 6e 20 62 75  uctures token bu
26f0: 66 66 65 72 73 20 61 72 65 20 61 6c 6c 20 73 74  ffers are all st
2700: 6f 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  ored as a single
2710: 20 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f   .  ** allocatio
2720: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 65 78  n so that the ex
2730: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2740: 66 72 65 65 64 20 77 69 74 68 20 61 20 73 69 6e  freed with a sin
2750: 67 6c 65 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  gle call to.  **
2760: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
2770: 20 53 65 74 74 69 6e 67 20 74 68 69 73 20 75 70   Setting this up
2780: 20 72 65 71 75 69 72 65 73 20 61 20 74 77 6f 20   requires a two 
2790: 70 61 73 73 20 61 70 70 72 6f 61 63 68 2e 0a 20  pass approach.. 
27a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
27b0: 73 74 20 70 61 73 73 2c 20 69 6e 20 74 68 65 20  st pass, in the 
27c0: 62 6c 6f 63 6b 20 62 65 6c 6f 77 2c 20 75 73 65  block below, use
27d0: 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 63 75  s a tokenizer cu
27e0: 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 0a  rsor to iterate.
27f0: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65    ** through the
2800: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 65   tokens in the e
2810: 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
2820: 70 61 73 73 20 75 73 65 73 20 66 74 73 33 52 65  pass uses fts3Re
2830: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 29 0a 20 20  allocOrFree().  
2840: 2a 2a 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 64  ** to assemble d
2850: 61 74 61 20 69 6e 20 74 77 6f 20 64 79 6e 61 6d  ata in two dynam
2860: 69 63 20 62 75 66 66 65 72 73 3a 0a 20 20 2a 2a  ic buffers:.  **
2870: 0a 20 20 2a 2a 20 20 20 42 75 66 66 65 72 20 70  .  **   Buffer p
2880: 3a 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  : Points to the 
2890: 46 74 73 33 45 78 70 72 20 73 74 72 75 63 74 75  Fts3Expr structu
28a0: 72 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  re, followed by 
28b0: 74 68 65 20 46 74 73 33 50 68 72 61 73 65 0a 20  the Fts3Phrase. 
28c0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
28d0: 73 74 72 75 63 74 75 72 65 2c 20 66 6f 6c 6c 6f  structure, follo
28e0: 77 65 64 20 62 79 20 74 68 65 20 61 72 72 61 79  wed by the array
28f0: 20 6f 66 20 46 74 73 33 50 68 72 61 73 65 54 6f   of Fts3PhraseTo
2900: 6b 65 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  ken .  **       
2910: 20 20 20 20 20 20 73 74 72 75 63 74 75 72 65 73        structures
2920: 2e 20 54 68 69 73 20 70 61 73 73 20 6f 6e 6c 79  . This pass only
2930: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 46   populates the F
2940: 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 61  ts3PhraseToken a
2950: 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
2960: 20 20 42 75 66 66 65 72 20 7a 54 65 6d 70 3a 20    Buffer zTemp: 
2970: 43 6f 6e 74 61 69 6e 73 20 63 6f 70 69 65 73 20  Contains copies 
2980: 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 2e 0a 20  of all tokens.. 
2990: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
29a0: 6f 6e 64 20 70 61 73 73 2c 20 69 6e 20 74 68 65  ond pass, in the
29b0: 20 62 6c 6f 63 6b 20 74 68 61 74 20 62 65 67 69   block that begi
29c0: 6e 73 20 22 69 66 28 20 72 63 3d 3d 53 51 4c 49  ns "if( rc==SQLI
29d0: 54 45 5f 44 4f 4e 45 20 29 22 20 62 65 6c 6f 77  TE_DONE )" below
29e0: 2c 0a 20 20 2a 2a 20 61 70 70 65 6e 64 73 20 62  ,.  ** appends b
29f0: 75 66 66 65 72 20 7a 54 65 6d 70 20 74 6f 20 62  uffer zTemp to b
2a00: 75 66 66 65 72 20 70 2c 20 61 6e 64 20 66 69 6c  uffer p, and fil
2a10: 6c 73 20 69 6e 20 74 68 65 20 46 74 73 33 45 78  ls in the Fts3Ex
2a20: 70 72 20 61 6e 64 20 46 74 73 33 50 68 72 61 73  pr and Fts3Phras
2a30: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
2a40: 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
2a50: 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2a60: 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20 20 20 70  kenizer(.      p
2a70: 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 50 61 72 73  Tokenizer, pPars
2a80: 65 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 49 6e 70  e->iLangid, zInp
2a90: 75 74 2c 20 6e 49 6e 70 75 74 2c 20 26 70 43 75  ut, nInput, &pCu
2aa0: 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  rsor);.  if( rc=
2ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ac0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
2ad0: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
2ae0: 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
2af0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b00: 7a 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  zByte;.      int
2b10: 20 6e 42 79 74 65 20 3d 20 30 2c 20 69 42 65 67   nByte = 0, iBeg
2b20: 69 6e 20 3d 20 30 2c 20 69 45 6e 64 20 3d 20 30  in = 0, iEnd = 0
2b30: 2c 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  , iPos = 0;.    
2b40: 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2b50: 78 4e 65 78 74 28 70 43 75 72 73 6f 72 2c 20 26  xNext(pCursor, &
2b60: 7a 42 79 74 65 2c 20 26 6e 42 79 74 65 2c 20 26  zByte, &nByte, &
2b70: 69 42 65 67 69 6e 2c 20 26 69 45 6e 64 2c 20 26  iBegin, &iEnd, &
2b80: 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 66 28  iPos);.      if(
2b90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba0: 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 50 68  {.        Fts3Ph
2bb0: 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  raseToken *pToke
2bc0: 6e 3b 0a 0a 20 20 20 20 20 20 20 20 70 20 3d 20  n;..        p = 
2bd0: 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  fts3ReallocOrFre
2be0: 65 28 70 2c 20 6e 53 70 61 63 65 20 2b 20 69 69  e(p, nSpace + ii
2bf0: 2a 73 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61  *sizeof(Fts3Phra
2c00: 73 65 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 20  seToken));.     
2c10: 20 20 20 69 66 28 20 21 70 20 29 20 67 6f 74 6f     if( !p ) goto
2c20: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 20 20 20 20   no_mem;..      
2c30: 20 20 7a 54 65 6d 70 20 3d 20 66 74 73 33 52 65    zTemp = fts3Re
2c40: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 7a 54 65 6d  allocOrFree(zTem
2c50: 70 2c 20 6e 54 65 6d 70 20 2b 20 6e 42 79 74 65  p, nTemp + nByte
2c60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2c70: 7a 54 65 6d 70 20 29 20 67 6f 74 6f 20 6e 6f 5f  zTemp ) goto no_
2c80: 6d 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  mem;..        as
2c90: 73 65 72 74 28 20 6e 54 6f 6b 65 6e 3d 3d 69 69  sert( nToken==ii
2ca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b   );.        pTok
2cb0: 65 6e 20 3d 20 26 28 28 46 74 73 33 50 68 72 61  en = &((Fts3Phra
2cc0: 73 65 20 2a 29 28 26 70 5b 31 5d 29 29 2d 3e 61  se *)(&p[1]))->a
2cd0: 54 6f 6b 65 6e 5b 69 69 5d 3b 0a 20 20 20 20 20  Token[ii];.     
2ce0: 20 20 20 6d 65 6d 73 65 74 28 70 54 6f 6b 65 6e     memset(pToken
2cf0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
2d00: 50 68 72 61 73 65 54 6f 6b 65 6e 29 29 3b 0a 0a  PhraseToken));..
2d10: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2d20: 7a 54 65 6d 70 5b 6e 54 65 6d 70 5d 2c 20 7a 42  zTemp[nTemp], zB
2d30: 79 74 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  yte, nByte);.   
2d40: 20 20 20 20 20 6e 54 65 6d 70 20 2b 3d 20 6e 42       nTemp += nB
2d50: 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 70 54  yte;..        pT
2d60: 6f 6b 65 6e 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b  oken->n = nByte;
2d70: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
2d80: 3e 69 73 50 72 65 66 69 78 20 3d 20 28 69 45 6e  >isPrefix = (iEn
2d90: 64 3c 6e 49 6e 70 75 74 20 26 26 20 7a 49 6e 70  d<nInput && zInp
2da0: 75 74 5b 69 45 6e 64 5d 3d 3d 27 2a 27 29 3b 0a  ut[iEnd]=='*');.
2db0: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e          pToken->
2dc0: 62 46 69 72 73 74 20 3d 20 28 69 42 65 67 69 6e  bFirst = (iBegin
2dd0: 3e 30 20 26 26 20 7a 49 6e 70 75 74 5b 69 42 65  >0 && zInput[iBe
2de0: 67 69 6e 2d 31 5d 3d 3d 27 5e 27 29 3b 0a 20 20  gin-1]=='^');.  
2df0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 69        nToken = i
2e00: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
2e10: 20 7d 0a 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   }..    pModule-
2e20: 3e 78 43 6c 6f 73 65 28 70 43 75 72 73 6f 72 29  >xClose(pCursor)
2e30: 3b 0a 20 20 20 20 70 43 75 72 73 6f 72 20 3d 20  ;.    pCursor = 
2e40: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  0;.  }..  if( rc
2e50: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2e60: 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20  .    int jj;.   
2e70: 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b   char *zBuf = 0;
2e80: 0a 0a 20 20 20 20 70 20 3d 20 66 74 73 33 52 65  ..    p = fts3Re
2e90: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2c 20 6e  allocOrFree(p, n
2ea0: 53 70 61 63 65 20 2b 20 6e 54 6f 6b 65 6e 2a 73  Space + nToken*s
2eb0: 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61 73 65  izeof(Fts3Phrase
2ec0: 54 6f 6b 65 6e 29 20 2b 20 6e 54 65 6d 70 29 3b  Token) + nTemp);
2ed0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 67 6f  .    if( !p ) go
2ee0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 6d  to no_mem;.    m
2ef0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 28 63 68 61  emset(p, 0, (cha
2f00: 72 20 2a 29 26 28 28 28 46 74 73 33 50 68 72 61  r *)&(((Fts3Phra
2f10: 73 65 20 2a 29 26 70 5b 31 5d 29 2d 3e 61 54 6f  se *)&p[1])->aTo
2f20: 6b 65 6e 5b 30 5d 29 2d 28 63 68 61 72 20 2a 29  ken[0])-(char *)
2f30: 70 29 3b 0a 20 20 20 20 70 2d 3e 65 54 79 70 65  p);.    p->eType
2f40: 20 3d 20 46 54 53 51 55 45 52 59 5f 50 48 52 41   = FTSQUERY_PHRA
2f50: 53 45 3b 0a 20 20 20 20 70 2d 3e 70 50 68 72 61  SE;.    p->pPhra
2f60: 73 65 20 3d 20 28 46 74 73 33 50 68 72 61 73 65  se = (Fts3Phrase
2f70: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
2f80: 3e 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d  >pPhrase->iColum
2f90: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 69 44 65 66  n = pParse->iDef
2fa0: 61 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  aultCol;.    p->
2fb0: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 20  pPhrase->nToken 
2fc0: 3d 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 20 20 7a  = nToken;..    z
2fd0: 42 75 66 20 3d 20 28 63 68 61 72 20 2a 29 26 70  Buf = (char *)&p
2fe0: 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ->pPhrase->aToke
2ff0: 6e 5b 6e 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 69  n[nToken];.    i
3000: 66 28 20 7a 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( zTemp ){.    
3010: 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
3020: 54 65 6d 70 2c 20 6e 54 65 6d 70 29 3b 0a 20 20  Temp, nTemp);.  
3030: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3040: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 65 6c  (zTemp);.    }el
3050: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
3060: 28 20 6e 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20  ( nTemp==0 );.  
3070: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 6a 6a 3d    }..    for(jj=
3080: 30 3b 20 6a 6a 3c 70 2d 3e 70 50 68 72 61 73 65  0; jj<p->pPhrase
3090: 2d 3e 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b  ->nToken; jj++){
30a0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 68 72 61 73  .      p->pPhras
30b0: 65 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 7a 20  e->aToken[jj].z 
30c0: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 7a 42  = zBuf;.      zB
30d0: 75 66 20 2b 3d 20 70 2d 3e 70 50 68 72 61 73 65  uf += p->pPhrase
30e0: 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 6e 3b 0a  ->aToken[jj].n;.
30f0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53      }.    rc = S
3100: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
3110: 20 2a 70 70 45 78 70 72 20 3d 20 70 3b 0a 20 20   *ppExpr = p;.  
3120: 72 65 74 75 72 6e 20 72 63 3b 0a 6e 6f 5f 6d 65  return rc;.no_me
3130: 6d 3a 0a 0a 20 20 69 66 28 20 70 43 75 72 73 6f  m:..  if( pCurso
3140: 72 20 29 7b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  r ){.    pModule
3150: 2d 3e 78 43 6c 6f 73 65 28 70 43 75 72 73 6f 72  ->xClose(pCursor
3160: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3170: 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
3180: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
3190: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 30 3b 0a  .  *ppExpr = 0;.
31a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31b0: 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NOMEM;.}../*.** 
31c0: 54 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  The output varia
31d0: 62 6c 65 20 2a 70 70 45 78 70 72 20 69 73 20 70  ble *ppExpr is p
31e0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
31f0: 20 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 45   allocated Fts3E
3200: 78 70 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  xpr .** structur
3210: 65 2c 20 6f 72 20 73 65 74 20 74 6f 20 30 20 69  e, or set to 0 i
3220: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
3230: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
3240: 20 72 65 61 63 68 65 64 2e 0a 2a 2a 0a 2a 2a 20   reached..**.** 
3250: 52 65 74 75 72 6e 73 20 61 6e 20 53 51 4c 69 74  Returns an SQLit
3260: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 53 51  e error code. SQ
3270: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
3280: 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 53 51 4c  thing works, SQL
3290: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 66 20  ITE_NOMEM.** if 
32a0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
32b0: 20 6f 63 63 75 72 73 2c 20 6f 72 20 53 51 4c 49   occurs, or SQLI
32c0: 54 45 5f 45 52 52 4f 52 20 69 66 20 61 20 70 61  TE_ERROR if a pa
32d0: 72 73 65 20 65 72 72 6f 72 20 69 73 20 65 6e 63  rse error is enc
32e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 49 66 20  ountered..** If 
32f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 20  SQLITE_ERROR is 
3300: 72 65 74 75 72 6e 65 64 2c 20 70 43 6f 6e 74 65  returned, pConte
3310: 78 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  xt is populated 
3320: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
3330: 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
3340: 20 69 6e 74 20 67 65 74 4e 65 78 74 4e 6f 64 65   int getNextNode
3350: 28 0a 20 20 50 61 72 73 65 43 6f 6e 74 65 78 74  (.  ParseContext
3360: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
3380: 74 73 33 20 71 75 65 72 79 20 70 61 72 73 65 20  ts3 query parse 
3390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
33b0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
33c0: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74       /* Input st
33d0: 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33 45 78  ring */.  Fts3Ex
33e0: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70 72 65 73    /* OUT: expres
3410: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  sion */.  int *p
3420: 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20 20 20 20  nConsumed       
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
3450: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
3460: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  ed */.){.  stati
3470: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 46  c const struct F
3480: 74 73 33 4b 65 79 77 6f 72 64 20 7b 0a 20 20 20  ts3Keyword {.   
3490: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72         /* Keywor
34c0: 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 75 6e  d text */.    un
34d0: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 3b 20 20  signed char n;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3500: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 2a 2f 0a   the keyword */.
3510: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3520: 72 20 70 61 72 65 6e 4f 6e 6c 79 3b 20 20 20 20  r parenOnly;    
3530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
3540: 79 20 76 61 6c 69 64 20 69 6e 20 70 61 72 65 6e  y valid in paren
3550: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 75 6e 73   mode */.    uns
3560: 69 67 6e 65 64 20 63 68 61 72 20 65 54 79 70 65  igned char eType
3570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3580: 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 63 6f     /* Keyword co
3590: 64 65 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  de */.  } aKeywo
35a0: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  rd[] = {.    { "
35b0: 4f 52 22 20 2c 20 20 32 2c 20 30 2c 20 46 54 53  OR" ,  2, 0, FTS
35c0: 51 55 45 52 59 5f 4f 52 20 20 20 7d 2c 0a 20 20  QUERY_OR   },.  
35d0: 20 20 7b 20 22 41 4e 44 22 2c 20 20 33 2c 20 31    { "AND",  3, 1
35e0: 2c 20 46 54 53 51 55 45 52 59 5f 41 4e 44 20 20  , FTSQUERY_AND  
35f0: 7d 2c 0a 20 20 20 20 7b 20 22 4e 4f 54 22 2c 20  },.    { "NOT", 
3600: 20 33 2c 20 31 2c 20 46 54 53 51 55 45 52 59 5f   3, 1, FTSQUERY_
3610: 4e 4f 54 20 20 7d 2c 0a 20 20 20 20 7b 20 22 4e  NOT  },.    { "N
3620: 45 41 52 22 2c 20 34 2c 20 30 2c 20 46 54 53 51  EAR", 4, 0, FTSQ
3630: 55 45 52 59 5f 4e 45 41 52 20 7d 0a 20 20 7d 3b  UERY_NEAR }.  };
3640: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
3650: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 43 6f   iCol;.  int iCo
3660: 6c 4c 65 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lLen;.  int rc;.
3670: 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 65 74    Fts3Expr *pRet
3680: 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74 20 63   = 0;..  const c
3690: 68 61 72 20 2a 7a 49 6e 70 75 74 20 3d 20 7a 3b  har *zInput = z;
36a0: 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d 20  .  int nInput = 
36b0: 6e 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 69 73  n;..  pParse->is
36c0: 4e 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  Not = 0;..  /* S
36d0: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 77 68 69  kip over any whi
36e0: 74 65 73 70 61 63 65 20 62 65 66 6f 72 65 20 63  tespace before c
36f0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 6b 65  hecking for a ke
3700: 79 77 6f 72 64 2c 20 61 6e 20 6f 70 65 6e 20 6f  yword, an open o
3710: 72 0a 20 20 2a 2a 20 63 6c 6f 73 65 20 62 72 61  r.  ** close bra
3720: 63 6b 65 74 2c 20 6f 72 20 61 20 71 75 6f 74 65  cket, or a quote
3730: 64 20 73 74 72 69 6e 67 2e 20 0a 20 20 2a 2f 0a  d string. .  */.
3740: 20 20 77 68 69 6c 65 28 20 6e 49 6e 70 75 74 3e    while( nInput>
3750: 30 20 26 26 20 66 74 73 33 69 73 73 70 61 63 65  0 && fts3isspace
3760: 28 2a 7a 49 6e 70 75 74 29 20 29 7b 0a 20 20 20  (*zInput) ){.   
3770: 20 6e 49 6e 70 75 74 2d 2d 3b 0a 20 20 20 20 7a   nInput--;.    z
3780: 49 6e 70 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  Input++;.  }.  i
3790: 66 28 20 6e 49 6e 70 75 74 3d 3d 30 20 29 7b 0a  f( nInput==0 ){.
37a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37b0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f  E_DONE;.  }..  /
37c0: 2a 20 53 65 65 20 69 66 20 77 65 20 61 72 65 20  * See if we are 
37d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 6b  dealing with a k
37e0: 65 79 77 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72  eyword. */.  for
37f0: 28 69 69 3d 30 3b 20 69 69 3c 28 69 6e 74 29 28  (ii=0; ii<(int)(
3800: 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f 72 64 29  sizeof(aKeyword)
3810: 2f 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 46  /sizeof(struct F
3820: 74 73 33 4b 65 79 77 6f 72 64 29 29 3b 20 69 69  ts3Keyword)); ii
3830: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 73  ++){.    const s
3840: 74 72 75 63 74 20 46 74 73 33 4b 65 79 77 6f 72  truct Fts3Keywor
3850: 64 20 2a 70 4b 65 79 20 3d 20 26 61 4b 65 79 77  d *pKey = &aKeyw
3860: 6f 72 64 5b 69 69 5d 3b 0a 0a 20 20 20 20 69 66  ord[ii];..    if
3870: 28 20 28 70 4b 65 79 2d 3e 70 61 72 65 6e 4f 6e  ( (pKey->parenOn
3880: 6c 79 20 26 20 7e 73 71 6c 69 74 65 33 5f 66 74  ly & ~sqlite3_ft
3890: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
38a0: 68 65 73 65 73 29 21 3d 30 20 29 7b 0a 20 20 20  heses)!=0 ){.   
38b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
38c0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 49 6e 70   }..    if( nInp
38d0: 75 74 3e 3d 70 4b 65 79 2d 3e 6e 20 26 26 20 30  ut>=pKey->n && 0
38e0: 3d 3d 6d 65 6d 63 6d 70 28 7a 49 6e 70 75 74 2c  ==memcmp(zInput,
38f0: 20 70 4b 65 79 2d 3e 7a 2c 20 70 4b 65 79 2d 3e   pKey->z, pKey->
3900: 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n) ){.      int 
3910: 6e 4e 65 61 72 20 3d 20 53 51 4c 49 54 45 5f 46  nNear = SQLITE_F
3920: 54 53 33 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52  TS3_DEFAULT_NEAR
3930: 5f 50 41 52 41 4d 3b 0a 20 20 20 20 20 20 69 6e  _PARAM;.      in
3940: 74 20 6e 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 6e  t nKey = pKey->n
3950: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 4e 65  ;.      char cNe
3960: 78 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  xt;..      /* If
3970: 20 74 68 69 73 20 69 73 20 61 20 22 4e 45 41 52   this is a "NEAR
3980: 22 20 6b 65 79 77 6f 72 64 2c 20 63 68 65 63 6b  " keyword, check
3990: 20 66 6f 72 20 61 6e 20 65 78 70 6c 69 63 69 74   for an explicit
39a0: 20 6e 65 61 72 6e 65 73 73 2e 20 2a 2f 0a 20 20   nearness. */.  
39b0: 20 20 20 20 69 66 28 20 70 4b 65 79 2d 3e 65 54      if( pKey->eT
39c0: 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45  ype==FTSQUERY_NE
39d0: 41 52 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AR ){.        as
39e0: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 34 20 29 3b  sert( nKey==4 );
39f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e  .        if( zIn
3a00: 70 75 74 5b 34 5d 3d 3d 27 2f 27 20 26 26 20 7a  put[4]=='/' && z
3a10: 49 6e 70 75 74 5b 35 5d 3e 3d 27 30 27 20 26 26  Input[5]>='0' &&
3a20: 20 7a 49 6e 70 75 74 5b 35 5d 3c 3d 27 39 27 20   zInput[5]<='9' 
3a30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  ){.          nNe
3a40: 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ar = 0;.        
3a50: 20 20 66 6f 72 28 6e 4b 65 79 3d 35 3b 20 7a 49    for(nKey=5; zI
3a60: 6e 70 75 74 5b 6e 4b 65 79 5d 3e 3d 27 30 27 20  nput[nKey]>='0' 
3a70: 26 26 20 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 3c  && zInput[nKey]<
3a80: 3d 27 39 27 3b 20 6e 4b 65 79 2b 2b 29 7b 0a 20  ='9'; nKey++){. 
3a90: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 65 61 72             nNear
3aa0: 20 3d 20 6e 4e 65 61 72 20 2a 20 31 30 20 2b 20   = nNear * 10 + 
3ab0: 28 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 20 2d 20  (zInput[nKey] - 
3ac0: 27 30 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '0');.          
3ad0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
3af0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 69 73   this point this
3b00: 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 20 6b   is probably a k
3b10: 65 79 77 6f 72 64 2e 20 42 75 74 20 66 6f 72 20  eyword. But for 
3b20: 74 68 61 74 20 74 6f 20 62 65 20 74 72 75 65 2c  that to be true,
3b30: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
3b40: 78 74 20 62 79 74 65 20 6d 75 73 74 20 63 6f 6e  xt byte must con
3b50: 74 61 69 6e 20 65 69 74 68 65 72 20 77 68 69 74  tain either whit
3b60: 65 73 70 61 63 65 2c 20 61 6e 20 6f 70 65 6e 20  espace, an open 
3b70: 6f 72 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  or close.      *
3b80: 2a 20 70 61 72 65 6e 74 68 65 73 69 73 2c 20 61  * parenthesis, a
3b90: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
3ba0: 2c 20 6f 72 20 45 4f 46 2e 20 0a 20 20 20 20 20  , or EOF. .     
3bb0: 20 2a 2f 0a 20 20 20 20 20 20 63 4e 65 78 74 20   */.      cNext 
3bc0: 3d 20 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 3b 0a  = zInput[nKey];.
3bd0: 20 20 20 20 20 20 69 66 28 20 66 74 73 33 69 73        if( fts3is
3be0: 73 70 61 63 65 28 63 4e 65 78 74 29 20 0a 20 20  space(cNext) .  
3bf0: 20 20 20 20 20 7c 7c 20 63 4e 65 78 74 3d 3d 27       || cNext=='
3c00: 22 27 20 7c 7c 20 63 4e 65 78 74 3d 3d 27 28 27  "' || cNext=='('
3c10: 20 7c 7c 20 63 4e 65 78 74 3d 3d 27 29 27 20 7c   || cNext==')' |
3c20: 7c 20 63 4e 65 78 74 3d 3d 30 0a 20 20 20 20 20  | cNext==0.     
3c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
3c40: 20 3d 20 28 46 74 73 33 45 78 70 72 20 2a 29 66   = (Fts3Expr *)f
3c50: 74 73 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  ts3MallocZero(si
3c60: 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b  zeof(Fts3Expr));
3c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 52  .        if( !pR
3c80: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
3c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3ca0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
3cb0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 65 54 79         pRet->eTy
3cc0: 70 65 20 3d 20 70 4b 65 79 2d 3e 65 54 79 70 65  pe = pKey->eType
3cd0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
3ce0: 6e 4e 65 61 72 20 3d 20 6e 4e 65 61 72 3b 0a 20  nNear = nNear;. 
3cf0: 20 20 20 20 20 20 20 2a 70 70 45 78 70 72 20 3d         *ppExpr =
3d00: 20 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 2a   pRet;.        *
3d10: 70 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e  pnConsumed = (in
3d20: 74 29 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20  t)((zInput - z) 
3d30: 2b 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  + nKey);.       
3d40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3d50: 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  K;.      }..    
3d60: 20 20 2f 2a 20 54 75 72 6e 73 20 6f 75 74 20 74    /* Turns out t
3d70: 68 61 74 20 77 61 73 6e 27 74 20 61 20 6b 65 79  hat wasn't a key
3d80: 77 6f 72 64 20 61 66 74 65 72 20 61 6c 6c 2e 20  word after all. 
3d90: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
3da0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  the.      ** use
3db0: 72 20 68 61 73 20 73 75 70 70 6c 69 65 64 20 61  r has supplied a
3dc0: 20 74 6f 6b 65 6e 20 73 75 63 68 20 61 73 20 22   token such as "
3dd0: 4f 52 61 63 6c 65 22 2e 20 43 6f 6e 74 69 6e 75  ORacle". Continu
3de0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
3df0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  }.  }..  /* See 
3e00: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
3e10: 67 20 77 69 74 68 20 61 20 71 75 6f 74 65 64 20  g with a quoted 
3e20: 70 68 72 61 73 65 2e 20 49 66 20 74 68 69 73 20  phrase. If this 
3e30: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
3e40: 6e 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 66 6f  n.  ** search fo
3e50: 72 20 74 68 65 20 63 6c 6f 73 69 6e 67 20 71 75  r the closing qu
3e60: 6f 74 65 20 61 6e 64 20 70 61 73 73 20 74 68 65  ote and pass the
3e70: 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 20 74 6f   whole string to
3e80: 20 67 65 74 4e 65 78 74 53 74 72 69 6e 67 28 29   getNextString()
3e90: 0a 20 20 2a 2a 20 66 6f 72 20 70 72 6f 63 65 73  .  ** for proces
3ea0: 73 69 6e 67 2e 20 54 68 69 73 20 69 73 20 65 61  sing. This is ea
3eb0: 73 79 20 74 6f 20 64 6f 2c 20 61 73 20 66 74 73  sy to do, as fts
3ec0: 33 20 68 61 73 20 6e 6f 20 73 79 6e 74 61 78 20  3 has no syntax 
3ed0: 66 6f 72 20 65 73 63 61 70 69 6e 67 0a 20 20 2a  for escaping.  *
3ee0: 2a 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63  * a quote charac
3ef0: 74 65 72 20 65 6d 62 65 64 64 65 64 20 69 6e 20  ter embedded in 
3f00: 61 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  a string..  */. 
3f10: 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d 3d 27 22   if( *zInput=='"
3f20: 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  ' ){.    for(ii=
3f30: 31 3b 20 69 69 3c 6e 49 6e 70 75 74 20 26 26 20  1; ii<nInput && 
3f40: 7a 49 6e 70 75 74 5b 69 69 5d 21 3d 27 22 27 3b  zInput[ii]!='"';
3f50: 20 69 69 2b 2b 29 3b 0a 20 20 20 20 2a 70 6e 43   ii++);.    *pnC
3f60: 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74 29 28  onsumed = (int)(
3f70: 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b 20 69  (zInput - z) + i
3f80: 69 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  i + 1);.    if( 
3f90: 69 69 3d 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  ii==nInput ){.  
3fa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3fb0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
3fc0: 20 20 20 72 65 74 75 72 6e 20 67 65 74 4e 65 78     return getNex
3fd0: 74 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  tString(pParse, 
3fe0: 26 7a 49 6e 70 75 74 5b 31 5d 2c 20 69 69 2d 31  &zInput[1], ii-1
3ff0: 2c 20 70 70 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  , ppExpr);.  }..
4000: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 74    if( sqlite3_ft
4010: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
4020: 68 65 73 65 73 20 29 7b 0a 20 20 20 20 69 66 28  heses ){.    if(
4030: 20 2a 7a 49 6e 70 75 74 3d 3d 27 28 27 20 29 7b   *zInput=='(' ){
4040: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  .      int nCons
4050: 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
4060: 70 50 61 72 73 65 2d 3e 6e 4e 65 73 74 2b 2b 3b  pParse->nNest++;
4070: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
4080: 45 78 70 72 50 61 72 73 65 28 70 50 61 72 73 65  ExprParse(pParse
4090: 2c 20 7a 49 6e 70 75 74 2b 31 2c 20 6e 49 6e 70  , zInput+1, nInp
40a0: 75 74 2d 31 2c 20 70 70 45 78 70 72 2c 20 26 6e  ut-1, ppExpr, &n
40b0: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
40c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
40d0: 4f 4b 20 26 26 20 21 2a 70 70 45 78 70 72 20 29  OK && !*ppExpr )
40e0: 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  { rc = SQLITE_DO
40f0: 4e 45 3b 20 7d 0a 20 20 20 20 20 20 2a 70 6e 43  NE; }.      *pnC
4100: 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74 29 28  onsumed = (int)(
4110: 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b 20 31 20  zInput - z) + 1 
4120: 2b 20 6e 43 6f 6e 73 75 6d 65 64 3b 0a 20 20 20  + nConsumed;.   
4130: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
4140: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 49 6e    }else if( *zIn
4150: 70 75 74 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  put==')' ){.    
4160: 20 20 70 50 61 72 73 65 2d 3e 6e 4e 65 73 74 2d    pParse->nNest-
4170: 2d 3b 0a 20 20 20 20 20 20 2a 70 6e 43 6f 6e 73  -;.      *pnCons
4180: 75 6d 65 64 20 3d 20 28 69 6e 74 29 28 28 7a 49  umed = (int)((zI
4190: 6e 70 75 74 20 2d 20 7a 29 20 2b 20 31 29 3b 0a  nput - z) + 1);.
41a0: 20 20 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20        *ppExpr = 
41b0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
41c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
41d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
41e0: 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
41f0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 69   this point, thi
4200: 73 20 6d 75 73 74 20 62 65 20 61 20 72 65 67 75  s must be a regu
4210: 6c 61 72 20 74 6f 6b 65 6e 2c 20 6f 72 20 0a 20  lar token, or . 
4220: 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74   ** the end of t
4230: 68 65 20 69 6e 70 75 74 2e 20 52 65 61 64 20 61  he input. Read a
4240: 20 72 65 67 75 6c 61 72 20 74 6f 6b 65 6e 20 75   regular token u
4250: 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
4260: 5f 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 2a 2a 20  _tokenizer.  ** 
4270: 69 6e 74 65 72 66 61 63 65 2e 20 42 65 66 6f 72  interface. Befor
4280: 65 20 64 6f 69 6e 67 20 73 6f 2c 20 66 69 67 75  e doing so, figu
4290: 72 65 20 6f 75 74 20 69 66 20 74 68 65 72 65 20  re out if there 
42a0: 69 73 20 61 6e 20 65 78 70 6c 69 63 69 74 0a 20  is an explicit. 
42b0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
42c0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 74 6f 6b  fier for the tok
42d0: 65 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  en. .  **.  ** T
42e0: 4f 44 4f 3a 20 53 74 72 61 6e 67 65 6c 79 2c 20  ODO: Strangely, 
42f0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
4300: 6c 65 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20  le to associate 
4310: 61 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  a column specifi
4320: 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 20 71  er.  ** with a q
4330: 75 6f 74 65 64 20 70 68 72 61 73 65 2c 20 6f 6e  uoted phrase, on
4340: 6c 79 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ly with a single
4350: 20 74 6f 6b 65 6e 2e 20 4e 6f 74 20 73 75 72 65   token. Not sure
4360: 20 69 66 20 74 68 69 73 20 77 61 73 0a 20 20 2a   if this was.  *
4370: 2a 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * an implementat
4380: 69 6f 6e 20 61 72 74 69 66 61 63 74 20 6f 72 20  ion artifact or 
4390: 61 6e 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 64  an intentional d
43a0: 65 63 69 73 69 6f 6e 20 77 68 65 6e 20 66 74 73  ecision when fts
43b0: 33 20 77 61 73 0a 20 20 2a 2a 20 66 69 72 73 74  3 was.  ** first
43c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 57 68   implemented. Wh
43d0: 69 63 68 65 76 65 72 20 69 74 20 77 61 73 2c 20  ichever it was, 
43e0: 74 68 69 73 20 6d 6f 64 75 6c 65 20 64 75 70 6c  this module dupl
43f0: 69 63 61 74 65 73 20 74 68 65 20 0a 20 20 2a 2a  icates the .  **
4400: 20 6c 69 6d 69 74 61 74 69 6f 6e 2e 0a 20 20 2a   limitation..  *
4410: 2f 0a 20 20 69 43 6f 6c 20 3d 20 70 50 61 72 73  /.  iCol = pPars
4420: 65 2d 3e 69 44 65 66 61 75 6c 74 43 6f 6c 3b 0a  e->iDefaultCol;.
4430: 20 20 69 43 6f 6c 4c 65 6e 20 3d 20 30 3b 0a 20    iColLen = 0;. 
4440: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
4450: 61 72 73 65 2d 3e 6e 43 6f 6c 3b 20 69 69 2b 2b  arse->nCol; ii++
4460: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4470: 72 20 2a 7a 53 74 72 20 3d 20 70 50 61 72 73 65  r *zStr = pParse
4480: 2d 3e 61 7a 43 6f 6c 5b 69 69 5d 3b 0a 20 20 20  ->azCol[ii];.   
4490: 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 69 6e 74   int nStr = (int
44a0: 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0a 20  )strlen(zStr);. 
44b0: 20 20 20 69 66 28 20 6e 49 6e 70 75 74 3e 6e 53     if( nInput>nS
44c0: 74 72 20 26 26 20 7a 49 6e 70 75 74 5b 6e 53 74  tr && zInput[nSt
44d0: 72 5d 3d 3d 27 3a 27 20 0a 20 20 20 20 20 26 26  r]==':' .     &&
44e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
44f0: 70 28 7a 53 74 72 2c 20 7a 49 6e 70 75 74 2c 20  p(zStr, zInput, 
4500: 6e 53 74 72 29 3d 3d 30 20 0a 20 20 20 20 29 7b  nStr)==0 .    ){
4510: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 69 69  .      iCol = ii
4520: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 4c 65 6e 20  ;.      iColLen 
4530: 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75 74 20  = (int)((zInput 
4540: 2d 20 7a 29 20 2b 20 6e 53 74 72 20 2b 20 31 29  - z) + nStr + 1)
4550: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4560: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
4570: 67 65 74 4e 65 78 74 54 6f 6b 65 6e 28 70 50 61  getNextToken(pPa
4580: 72 73 65 2c 20 69 43 6f 6c 2c 20 26 7a 5b 69 43  rse, iCol, &z[iC
4590: 6f 6c 4c 65 6e 5d 2c 20 6e 2d 69 43 6f 6c 4c 65  olLen], n-iColLe
45a0: 6e 2c 20 70 70 45 78 70 72 2c 20 70 6e 43 6f 6e  n, ppExpr, pnCon
45b0: 73 75 6d 65 64 29 3b 0a 20 20 2a 70 6e 43 6f 6e  sumed);.  *pnCon
45c0: 73 75 6d 65 64 20 2b 3d 20 69 43 6f 6c 4c 65 6e  sumed += iColLen
45d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
45e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
45f0: 6d 65 6e 74 20 69 73 20 61 6e 20 46 74 73 33 45  ment is an Fts3E
4600: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 66 6f  xpr structure fo
4610: 72 20 61 20 62 69 6e 61 72 79 20 6f 70 65 72 61  r a binary opera
4620: 74 6f 72 20 28 61 6e 79 20 74 79 70 65 0a 2a 2a  tor (any type.**
4630: 20 65 78 63 65 70 74 20 61 6e 20 46 54 53 51 55   except an FTSQU
4640: 45 52 59 5f 50 48 52 41 53 45 29 2e 20 52 65 74  ERY_PHRASE). Ret
4650: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
4660: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
4670: 67 20 74 68 65 0a 2a 2a 20 70 72 65 63 65 64 65  g the.** precede
4680: 6e 63 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  nce of the opera
4690: 74 6f 72 2e 20 4c 6f 77 65 72 20 76 61 6c 75 65  tor. Lower value
46a0: 73 20 68 61 76 65 20 61 20 68 69 67 68 65 72 20  s have a higher 
46b0: 70 72 65 63 65 64 65 6e 63 65 20 28 69 2e 65 2e  precedence (i.e.
46c0: 0a 2a 2a 20 67 72 6f 75 70 20 6d 6f 72 65 20 74  .** group more t
46d0: 69 67 68 74 6c 79 29 2e 20 46 6f 72 20 65 78 61  ightly). For exa
46e0: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 43 20 6c  mple, in the C l
46f0: 61 6e 67 75 61 67 65 2c 20 74 68 65 20 3d 3d 20  anguage, the == 
4700: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 67 72 6f 75  operator.** grou
4710: 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 20  ps more tightly 
4720: 74 68 61 6e 20 7c 7c 2c 20 61 6e 64 20 77 6f 75  than ||, and wou
4730: 6c 64 20 74 68 65 72 65 66 6f 72 65 20 68 61 76  ld therefore hav
4740: 65 20 61 20 68 69 67 68 65 72 20 70 72 65 63 65  e a higher prece
4750: 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  dence..**.** Whe
4760: 6e 20 75 73 69 6e 67 20 74 68 65 20 6e 65 77 20  n using the new 
4770: 66 74 73 33 20 71 75 65 72 79 20 73 79 6e 74 61  fts3 query synta
4780: 78 20 28 77 68 65 6e 20 53 51 4c 49 54 45 5f 45  x (when SQLITE_E
4790: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
47a0: 54 48 45 53 49 53 0a 2a 2a 20 69 73 20 64 65 66  THESIS.** is def
47b0: 69 6e 65 64 29 2c 20 74 68 65 20 6f 72 64 65 72  ined), the order
47c0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
47d0: 73 20 69 6e 20 70 72 65 63 65 64 65 6e 63 65 20  s in precedence 
47e0: 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f 0a  from highest to.
47f0: 2a 2a 20 6c 6f 77 65 73 74 20 69 73 3a 0a 2a 2a  ** lowest is:.**
4800: 0a 2a 2a 20 20 20 4e 45 41 52 0a 2a 2a 20 20 20  .**   NEAR.**   
4810: 4e 4f 54 0a 2a 2a 20 20 20 41 4e 44 20 28 69 6e  NOT.**   AND (in
4820: 63 6c 75 64 69 6e 67 20 69 6d 70 6c 69 63 69 74  cluding implicit
4830: 20 41 4e 44 73 29 0a 2a 2a 20 20 20 4f 52 0a 2a   ANDs).**   OR.*
4840: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
4850: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 6f 6c  hen using the ol
4860: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20  d query syntax, 
4870: 74 68 65 20 4f 52 20 6f 70 65 72 61 74 6f 72 20  the OR operator 
4880: 68 61 73 20 61 20 68 69 67 68 65 72 0a 2a 2a 20  has a higher.** 
4890: 70 72 65 63 65 64 65 6e 63 65 20 74 68 61 6e 20  precedence than 
48a0: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
48b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48c0: 6f 70 50 72 65 63 65 64 65 6e 63 65 28 46 74 73  opPrecedence(Fts
48d0: 33 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73  3Expr *p){.  ass
48e0: 65 72 74 28 20 70 2d 3e 65 54 79 70 65 21 3d 46  ert( p->eType!=F
48f0: 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
4900: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
4910: 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
4920: 6e 74 68 65 73 65 73 20 29 7b 0a 20 20 20 20 72  ntheses ){.    r
4930: 65 74 75 72 6e 20 70 2d 3e 65 54 79 70 65 3b 0a  eturn p->eType;.
4940: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
4950: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e  Type==FTSQUERY_N
4960: 45 41 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72  EAR ){.    retur
4970: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 1;.  }else if(
4980: 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
4990: 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 72 65  ERY_OR ){.    re
49a0: 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 61 73  turn 2;.  }.  as
49b0: 73 65 72 74 28 20 70 2d 3e 65 54 79 70 65 3d 3d  sert( p->eType==
49c0: 46 54 53 51 55 45 52 59 5f 41 4e 44 20 29 3b 0a  FTSQUERY_AND );.
49d0: 20 20 72 65 74 75 72 6e 20 33 3b 0a 7d 0a 0a 2f    return 3;.}../
49e0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 70  *.** Argument pp
49f0: 48 65 61 64 20 63 6f 6e 74 61 69 6e 73 20 61 20  Head contains a 
4a00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
4a10: 75 72 72 65 6e 74 20 68 65 61 64 20 6f 66 20 61  urrent head of a
4a20: 20 71 75 65 72 79 20 0a 2a 2a 20 65 78 70 72 65   query .** expre
4a30: 73 73 69 6f 6e 20 74 72 65 65 20 62 65 69 6e 67  ssion tree being
4a40: 20 70 61 72 73 65 64 2e 20 70 50 72 65 76 20 69   parsed. pPrev i
4a50: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
4a60: 20 6e 6f 64 65 20 6d 6f 73 74 20 72 65 63 65 6e   node most recen
4a70: 74 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  tly.** inserted 
4a80: 69 6e 74 6f 20 74 68 65 20 74 72 65 65 2e 20 54  into the tree. T
4a90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64  his function add
4aa0: 73 20 70 4e 65 77 2c 20 77 68 69 63 68 20 69 73  s pNew, which is
4ab0: 20 61 6c 77 61 79 73 20 61 20 62 69 6e 61 72 79   always a binary
4ac0: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6e 6f 64  .** operator nod
4ad0: 65 2c 20 69 6e 74 6f 20 74 68 65 20 65 78 70 72  e, into the expr
4ae0: 65 73 73 69 6f 6e 20 74 72 65 65 20 62 61 73 65  ession tree base
4af0: 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
4b00: 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  e precedence.** 
4b10: 6f 66 20 70 4e 65 77 20 61 6e 64 20 74 68 65 20  of pNew and the 
4b20: 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 73 20 6f  existing nodes o
4b30: 66 20 74 68 65 20 74 72 65 65 2e 20 54 68 69 73  f the tree. This
4b40: 20 6d 61 79 20 72 65 73 75 6c 74 20 69 6e 20 74   may result in t
4b50: 68 65 20 68 65 61 64 0a 2a 2a 20 6f 66 20 74 68  he head.** of th
4b60: 65 20 74 72 65 65 20 63 68 61 6e 67 69 6e 67 2c  e tree changing,
4b70: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 2a   in which case *
4b80: 70 70 48 65 61 64 20 69 73 20 73 65 74 20 74 6f  ppHead is set to
4b90: 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 20 6e 6f   the new root no
4ba0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
4bb0: 69 64 20 69 6e 73 65 72 74 42 69 6e 61 72 79 4f  id insertBinaryO
4bc0: 70 65 72 61 74 6f 72 28 0a 20 20 46 74 73 33 45  perator(.  Fts3E
4bd0: 78 70 72 20 2a 2a 70 70 48 65 61 64 2c 20 20 20  xpr **ppHead,   
4be0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
4bf0: 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  o the root node 
4c00: 6f 66 20 61 20 74 72 65 65 20 2a 2f 0a 20 20 46  of a tree */.  F
4c10: 74 73 33 45 78 70 72 20 2a 70 50 72 65 76 2c 20  ts3Expr *pPrev, 
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
4c30: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
4c40: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
4c50: 74 72 65 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  tree */.  Fts3Ex
4c60: 70 72 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  pr *pNew        
4c70: 20 20 20 2f 2a 20 4e 65 77 20 62 69 6e 61 72 79     /* New binary
4c80: 20 6e 6f 64 65 20 74 6f 20 69 6e 73 65 72 74 20   node to insert 
4c90: 69 6e 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20  into expression 
4ca0: 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  tree */.){.  Fts
4cb0: 33 45 78 70 72 20 2a 70 53 70 6c 69 74 20 3d 20  3Expr *pSplit = 
4cc0: 70 50 72 65 76 3b 0a 20 20 77 68 69 6c 65 28 20  pPrev;.  while( 
4cd0: 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74 20  pSplit->pParent 
4ce0: 26 26 20 6f 70 50 72 65 63 65 64 65 6e 63 65 28  && opPrecedence(
4cf0: 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74 29  pSplit->pParent)
4d00: 3c 3d 6f 70 50 72 65 63 65 64 65 6e 63 65 28 70  <=opPrecedence(p
4d10: 4e 65 77 29 20 29 7b 0a 20 20 20 20 70 53 70 6c  New) ){.    pSpl
4d20: 69 74 20 3d 20 70 53 70 6c 69 74 2d 3e 70 50 61  it = pSplit->pPa
4d30: 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rent;.  }..  if(
4d40: 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74   pSplit->pParent
4d50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4d60: 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74 2d  pSplit->pParent-
4d70: 3e 70 52 69 67 68 74 3d 3d 70 53 70 6c 69 74 20  >pRight==pSplit 
4d80: 29 3b 0a 20 20 20 20 70 53 70 6c 69 74 2d 3e 70  );.    pSplit->p
4d90: 50 61 72 65 6e 74 2d 3e 70 52 69 67 68 74 20 3d  Parent->pRight =
4da0: 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 2d   pNew;.    pNew-
4db0: 3e 70 50 61 72 65 6e 74 20 3d 20 70 53 70 6c 69  >pParent = pSpli
4dc0: 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 7d 65  t->pParent;.  }e
4dd0: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 48 65 61 64  lse{.    *ppHead
4de0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
4df0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 53 70  New->pLeft = pSp
4e00: 6c 69 74 3b 0a 20 20 70 53 70 6c 69 74 2d 3e 70  lit;.  pSplit->p
4e10: 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 3b 0a 7d  Parent = pNew;.}
4e20: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68  ../*.** Parse th
4e30: 65 20 66 74 73 33 20 71 75 65 72 79 20 65 78 70  e fts3 query exp
4e40: 72 65 73 73 69 6f 6e 20 66 6f 75 6e 64 20 69 6e  ression found in
4e50: 20 62 75 66 66 65 72 20 7a 2c 20 6c 65 6e 67 74   buffer z, lengt
4e60: 68 20 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  h n. This functi
4e70: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 65 69  on.** returns ei
4e80: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 65 6e  ther when the en
4e90: 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
4ea0: 69 73 20 72 65 61 63 68 65 64 20 6f 72 20 61 6e  is reached or an
4eb0: 20 75 6e 6d 61 74 63 68 65 64 20 0a 2a 2a 20 63   unmatched .** c
4ec0: 6c 6f 73 69 6e 67 20 62 72 61 63 6b 65 74 20 2d  losing bracket -
4ed0: 20 27 29 27 20 2d 20 69 73 20 65 6e 63 6f 75 6e   ')' - is encoun
4ee0: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
4ef0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
4f00: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
4f10: 64 2c 20 2a 70 70 45 78 70 72 20 69 73 20 73 65  d, *ppExpr is se
4f20: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
4f30: 65 0a 2a 2a 20 70 61 72 73 65 64 20 66 6f 72 6d  e.** parsed form
4f40: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
4f50: 6f 6e 20 61 6e 64 20 2a 70 6e 43 6f 6e 73 75 6d  on and *pnConsum
4f60: 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ed is set to the
4f70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79   number of.** by
4f80: 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 62 75  tes read from bu
4f90: 66 66 65 72 20 7a 2e 20 4f 74 68 65 72 77 69 73  ffer z. Otherwis
4fa0: 65 2c 20 2a 70 70 45 78 70 72 20 69 73 20 73 65  e, *ppExpr is se
4fb0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
4fc0: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 6f 75 74 20  E_NOMEM.** (out 
4fd0: 6f 66 20 6d 65 6d 6f 72 79 20 65 72 72 6f 72 29  of memory error)
4fe0: 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   or SQLITE_ERROR
4ff0: 20 28 70 61 72 73 65 20 65 72 72 6f 72 29 20 69   (parse error) i
5000: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
5010: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 78  tatic int fts3Ex
5020: 70 72 50 61 72 73 65 28 0a 20 20 50 61 72 73 65  prParse(.  Parse
5030: 43 6f 6e 74 65 78 74 20 2a 70 50 61 72 73 65 2c  Context *pParse,
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 2f 2a 20 66 74 73 33 20 71 75 65 72 79     /* fts3 query
5060: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   parse context *
5070: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5080: 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  z, int n,       
5090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
50a0: 65 78 74 20 6f 66 20 4d 41 54 43 48 20 71 75 65  ext of MATCH que
50b0: 72 79 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  ry */.  Fts3Expr
50c0: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 2f 2a 20 4f 55 54 3a 20 50 61 72 73 65 64 20 71  /* OUT: Parsed q
50f0: 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20 2a  uery structure *
5100: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6e 73 75  /.  int *pnConsu
5110: 6d 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  med             
5120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5130: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  UT: Number of by
5140: 74 65 73 20 63 6f 6e 73 75 6d 65 64 20 2a 2f 0a  tes consumed */.
5150: 29 7b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  ){.  Fts3Expr *p
5160: 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 33 45  Ret = 0;.  Fts3E
5170: 78 70 72 20 2a 70 50 72 65 76 20 3d 20 30 3b 0a  xpr *pPrev = 0;.
5180: 20 20 46 74 73 33 45 78 70 72 20 2a 70 4e 6f 74    Fts3Expr *pNot
5190: 42 72 61 6e 63 68 20 3d 20 30 3b 20 20 20 20 20  Branch = 0;     
51a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
51b0: 79 20 75 73 65 64 20 69 6e 20 6c 65 67 61 63 79  y used in legacy
51c0: 20 70 61 72 73 65 20 6d 6f 64 65 20 2a 2f 0a 20   parse mode */. 
51d0: 20 69 6e 74 20 6e 49 6e 20 3d 20 6e 3b 0a 20 20   int nIn = n;.  
51e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20  const char *zIn 
51f0: 3d 20 7a 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = z;.  int rc = 
5200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
5210: 20 69 73 52 65 71 75 69 72 65 50 68 72 61 73 65   isRequirePhrase
5220: 20 3d 20 31 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 1;..  while( 
5230: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5240: 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70  .    Fts3Expr *p
5250: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42   = 0;.    int nB
5260: 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  yte = 0;..    rc
5270: 20 3d 20 67 65 74 4e 65 78 74 4e 6f 64 65 28 70   = getNextNode(p
5280: 50 61 72 73 65 2c 20 7a 49 6e 2c 20 6e 49 6e 2c  Parse, zIn, nIn,
5290: 20 26 70 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20   &p, &nByte);.  
52a0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
52b0: 30 20 7c 7c 20 28 72 63 21 3d 53 51 4c 49 54 45  0 || (rc!=SQLITE
52c0: 5f 4f 4b 20 26 26 20 70 3d 3d 30 29 20 29 3b 0a  _OK && p==0) );.
52d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
52e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
52f0: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  f( p ){.        
5300: 69 6e 74 20 69 73 50 68 72 61 73 65 3b 0a 0a 20  int isPhrase;.. 
5310: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
5320: 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
5330: 70 61 72 65 6e 74 68 65 73 65 73 20 0a 20 20 20  parentheses .   
5340: 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 65           && p->e
5350: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
5360: 48 52 41 53 45 20 26 26 20 70 50 61 72 73 65 2d  HRASE && pParse-
5370: 3e 69 73 4e 6f 74 20 0a 20 20 20 20 20 20 20 20  >isNot .        
5380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5390: 43 72 65 61 74 65 20 61 6e 20 69 6d 70 6c 69 63  Create an implic
53a0: 69 74 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 2e  it NOT operator.
53b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 46 74   */.          Ft
53c0: 73 33 45 78 70 72 20 2a 70 4e 6f 74 20 3d 20 66  s3Expr *pNot = f
53d0: 74 73 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  ts3MallocZero(si
53e0: 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b  zeof(Fts3Expr));
53f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
5400: 70 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pNot ){.        
5410: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45      sqlite3Fts3E
5420: 78 70 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20  xprFree(p);.    
5430: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
5440: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
5450: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72         goto expr
5460: 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20 20  parse_out;.     
5470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5480: 20 70 4e 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46   pNot->eType = F
5490: 54 53 51 55 45 52 59 5f 4e 4f 54 3b 0a 20 20 20  TSQUERY_NOT;.   
54a0: 20 20 20 20 20 20 20 70 4e 6f 74 2d 3e 70 52 69         pNot->pRi
54b0: 67 68 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ght = p;.       
54c0: 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20     p->pParent = 
54d0: 70 4e 6f 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pNot;.          
54e0: 69 66 28 20 70 4e 6f 74 42 72 61 6e 63 68 20 29  if( pNotBranch )
54f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
5500: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 6f 74  ot->pLeft = pNot
5510: 42 72 61 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  Branch;.        
5520: 20 20 20 20 70 4e 6f 74 42 72 61 6e 63 68 2d 3e      pNotBranch->
5530: 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 74 3b 0a  pParent = pNot;.
5540: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5550: 20 20 20 20 20 20 70 4e 6f 74 42 72 61 6e 63 68        pNotBranch
5560: 20 3d 20 70 4e 6f 74 3b 0a 20 20 20 20 20 20 20   = pNot;.       
5570: 20 20 20 70 20 3d 20 70 50 72 65 76 3b 0a 20 20     p = pPrev;.  
5580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5590: 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65         int eType
55a0: 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20   = p->eType;.   
55b0: 20 20 20 20 20 20 20 69 73 50 68 72 61 73 65 20         isPhrase 
55c0: 3d 20 28 65 54 79 70 65 3d 3d 46 54 53 51 55 45  = (eType==FTSQUE
55d0: 52 59 5f 50 48 52 41 53 45 20 7c 7c 20 70 2d 3e  RY_PHRASE || p->
55e0: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20  pLeft);..       
55f0: 20 20 20 2f 2a 20 54 68 65 20 69 73 52 65 71 75     /* The isRequ
5600: 69 72 65 50 68 72 61 73 65 20 76 61 72 69 61 62  irePhrase variab
5610: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  le is set to tru
5620: 65 20 69 66 20 61 20 70 68 72 61 73 65 20 6f 72  e if a phrase or
5630: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
5640: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
5650: 61 69 6e 65 64 20 69 6e 20 70 61 72 65 6e 74 68  ained in parenth
5660: 65 73 69 73 20 69 73 20 72 65 71 75 69 72 65 64  esis is required
5670: 2e 20 49 66 20 61 0a 20 20 20 20 20 20 20 20 20  . If a.         
5680: 20 2a 2a 20 62 69 6e 61 72 79 20 6f 70 65 72 61   ** binary opera
5690: 74 6f 72 20 28 41 4e 44 2c 20 4f 52 2c 20 4e 4f  tor (AND, OR, NO
56a0: 54 20 6f 72 20 4e 45 41 52 29 20 69 73 20 65 6e  T or NEAR) is en
56b0: 63 6f 75 6e 74 65 64 20 77 68 65 6e 0a 20 20 20  counted when.   
56c0: 20 20 20 20 20 20 20 2a 2a 20 69 73 52 65 71 75         ** isRequ
56d0: 69 72 65 50 68 72 61 73 65 20 69 73 20 73 65 74  irePhrase is set
56e0: 2c 20 74 68 69 73 20 69 73 20 61 20 73 79 6e 74  , this is a synt
56f0: 61 78 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20  ax error..      
5700: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
5710: 20 69 66 28 20 21 69 73 50 68 72 61 73 65 20 26   if( !isPhrase &
5720: 26 20 69 73 52 65 71 75 69 72 65 50 68 72 61 73  & isRequirePhras
5730: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
5740: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
5750: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Free(p);.       
5760: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
5780: 20 20 20 20 67 6f 74 6f 20 65 78 70 72 70 61 72      goto exprpar
5790: 73 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  se_out;.        
57a0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
57b0: 66 28 20 69 73 50 68 72 61 73 65 20 26 26 20 21  f( isPhrase && !
57c0: 69 73 52 65 71 75 69 72 65 50 68 72 61 73 65 20  isRequirePhrase 
57d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
57e0: 2a 20 49 6e 73 65 72 74 20 61 6e 20 69 6d 70 6c  * Insert an impl
57f0: 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f  icit AND operato
5800: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
5810: 20 20 46 74 73 33 45 78 70 72 20 2a 70 41 6e 64    Fts3Expr *pAnd
5820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
5830: 73 65 72 74 28 20 70 52 65 74 20 26 26 20 70 50  sert( pRet && pP
5840: 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20  rev );.         
5850: 20 20 20 70 41 6e 64 20 3d 20 66 74 73 33 4d 61     pAnd = fts3Ma
5860: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
5870: 46 74 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20  Fts3Expr));.    
5880: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 41 6e          if( !pAn
5890: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
58a0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
58b0: 70 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  prFree(p);.     
58c0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
58d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
58e0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
58f0: 78 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20  xprparse_out;.  
5900: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5910: 20 20 20 20 20 20 20 20 70 41 6e 64 2d 3e 65 54          pAnd->eT
5920: 79 70 65 20 3d 20 46 54 53 51 55 45 52 59 5f 41  ype = FTSQUERY_A
5930: 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND;.            
5940: 69 6e 73 65 72 74 42 69 6e 61 72 79 4f 70 65 72  insertBinaryOper
5950: 61 74 6f 72 28 26 70 52 65 74 2c 20 70 50 72 65  ator(&pRet, pPre
5960: 76 2c 20 70 41 6e 64 29 3b 0a 20 20 20 20 20 20  v, pAnd);.      
5970: 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 41        pPrev = pA
5980: 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  nd;.          }.
5990: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
59a0: 69 73 20 74 65 73 74 20 63 61 74 63 68 65 73 20  is test catches 
59b0: 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65  attempts to make
59c0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
59d0: 6f 66 20 61 20 4e 45 41 52 0a 20 20 20 20 20 20  of a NEAR.      
59e0: 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72       ** operator
59f0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
5a00: 20 74 68 61 6e 20 61 20 70 68 72 61 73 65 2e 20   than a phrase. 
5a10: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 65 69 74  For example, eit
5a20: 68 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  her of.         
5a30: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
5a40: 6e 67 3a 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ng:.           *
5a50: 2a 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  *.           ** 
5a60: 20 20 20 28 62 72 61 63 6b 65 74 65 64 20 65 78     (bracketed ex
5a70: 70 72 65 73 73 69 6f 6e 29 20 4e 45 41 52 20 70  pression) NEAR p
5a80: 68 72 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  hrase.          
5a90: 20 2a 2a 20 20 20 20 70 68 72 61 73 65 20 4e 45   **    phrase NE
5aa0: 41 52 20 28 62 72 61 63 6b 65 74 65 64 20 65 78  AR (bracketed ex
5ab0: 70 72 65 73 73 69 6f 6e 29 0a 20 20 20 20 20 20  pression).      
5ac0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
5ad0: 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20     ** Return an 
5ae0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
5af0: 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
5b00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
5b10: 28 20 70 50 72 65 76 20 26 26 20 28 0a 20 20 20  ( pPrev && (.   
5b20: 20 20 20 20 20 20 20 20 20 28 65 54 79 70 65 3d           (eType=
5b30: 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 26  =FTSQUERY_NEAR &
5b40: 26 20 21 69 73 50 68 72 61 73 65 20 26 26 20 70  & !isPhrase && p
5b50: 50 72 65 76 2d 3e 65 54 79 70 65 21 3d 46 54 53  Prev->eType!=FTS
5b60: 51 55 45 52 59 5f 50 48 52 41 53 45 29 0a 20 20  QUERY_PHRASE).  
5b70: 20 20 20 20 20 20 20 7c 7c 20 28 65 54 79 70 65         || (eType
5b80: 21 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  !=FTSQUERY_PHRAS
5b90: 45 20 26 26 20 69 73 50 68 72 61 73 65 20 26 26  E && isPhrase &&
5ba0: 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46   pPrev->eType==F
5bb0: 54 53 51 55 45 52 59 5f 4e 45 41 52 29 0a 20 20  TSQUERY_NEAR).  
5bc0: 20 20 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20          )){.    
5bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
5be0: 74 73 33 45 78 70 72 46 72 65 65 28 70 29 3b 0a  ts3ExprFree(p);.
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
5c00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5c10: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
5c20: 65 78 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20  exprparse_out;. 
5c30: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
5c40: 20 20 20 20 20 20 69 66 28 20 69 73 50 68 72 61        if( isPhra
5c50: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
5c60: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
5c80: 72 74 28 20 70 50 72 65 76 20 26 26 20 70 50 72  rt( pPrev && pPr
5c90: 65 76 2d 3e 70 4c 65 66 74 20 26 26 20 70 50 72  ev->pLeft && pPr
5ca0: 65 76 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  ev->pRight==0 );
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
5cc0: 50 72 65 76 2d 3e 70 52 69 67 68 74 20 3d 20 70  Prev->pRight = p
5cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5ce0: 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 72  p->pParent = pPr
5cf0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ev;.            
5d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d10: 20 20 20 20 20 70 52 65 74 20 3d 20 70 3b 0a 20       pRet = p;. 
5d20: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5d30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5d40: 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74            insert
5d50: 42 69 6e 61 72 79 4f 70 65 72 61 74 6f 72 28 26  BinaryOperator(&
5d60: 70 52 65 74 2c 20 70 50 72 65 76 2c 20 70 29 3b  pRet, pPrev, p);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5d80: 20 20 20 20 20 20 20 69 73 52 65 71 75 69 72 65         isRequire
5d90: 50 68 72 61 73 65 20 3d 20 21 69 73 50 68 72 61  Phrase = !isPhra
5da0: 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  se;.        }.  
5db0: 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 3b        pPrev = p;
5dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
5dd0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29  ssert( nByte>0 )
5de0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5df0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
5e00: 4b 20 7c 7c 20 28 6e 42 79 74 65 3e 30 20 26 26  K || (nByte>0 &&
5e10: 20 6e 42 79 74 65 3c 3d 6e 49 6e 29 20 29 3b 0a   nByte<=nIn) );.
5e20: 20 20 20 20 6e 49 6e 20 2d 3d 20 6e 42 79 74 65      nIn -= nByte
5e30: 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 6e 42 79  ;.    zIn += nBy
5e40: 74 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  te;.  }..  if( r
5e50: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c==SQLITE_DONE &
5e60: 26 20 70 52 65 74 20 26 26 20 69 73 52 65 71 75  & pRet && isRequ
5e70: 69 72 65 50 68 72 61 73 65 20 29 7b 0a 20 20 20  irePhrase ){.   
5e80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5e90: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  OR;.  }..  if( r
5ea0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
5eb0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5ec0: 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21 73  E_OK;.    if( !s
5ed0: 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62  qlite3_fts3_enab
5ee0: 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20 26  le_parentheses &
5ef0: 26 20 70 4e 6f 74 42 72 61 6e 63 68 20 29 7b 0a  & pNotBranch ){.
5f00: 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20        if( !pRet 
5f10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5f40: 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 49 74     Fts3Expr *pIt
5f50: 65 72 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68 3b  er = pNotBranch;
5f60: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
5f70: 70 49 74 65 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pIter->pLeft ){.
5f80: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 20            pIter 
5f90: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 66 74 3b 0a  = pIter->pLeft;.
5fa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5fb0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 66 74 20 3d    pIter->pLeft =
5fc0: 20 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 70   pRet;.        p
5fd0: 52 65 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  Ret->pParent = p
5fe0: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 70 52  Iter;.        pR
5ff0: 65 74 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68 3b  et = pNotBranch;
6000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6010: 20 7d 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64   }.  *pnConsumed
6020: 20 3d 20 6e 20 2d 20 6e 49 6e 3b 0a 0a 65 78 70   = n - nIn;..exp
6030: 72 70 61 72 73 65 5f 6f 75 74 3a 0a 20 20 69 66  rparse_out:.  if
6040: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6050: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
6060: 73 33 45 78 70 72 46 72 65 65 28 70 52 65 74 29  s3ExprFree(pRet)
6070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
6080: 33 45 78 70 72 46 72 65 65 28 70 4e 6f 74 42 72  3ExprFree(pNotBr
6090: 61 6e 63 68 29 3b 0a 20 20 20 20 70 52 65 74 20  anch);.    pRet 
60a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78  = 0;.  }.  *ppEx
60b0: 70 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  pr = pRet;.  ret
60c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
60e0: 52 52 4f 52 20 69 66 20 74 68 65 20 6d 61 78 69  RROR if the maxi
60f0: 6d 75 6d 20 64 65 70 74 68 20 6f 66 20 74 68 65  mum depth of the
6100: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6110: 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74   passed .** as t
6120: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
6130: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6e 4d   is more than nM
6140: 61 78 44 65 70 74 68 2e 0a 2a 2f 0a 73 74 61 74  axDepth..*/.stat
6150: 69 63 20 69 6e 74 20 66 74 73 33 45 78 70 72 43  ic int fts3ExprC
6160: 68 65 63 6b 44 65 70 74 68 28 46 74 73 33 45 78  heckDepth(Fts3Ex
6170: 70 72 20 2a 70 2c 20 69 6e 74 20 6e 4d 61 78 44  pr *p, int nMaxD
6180: 65 70 74 68 29 7b 0a 20 20 69 6e 74 20 72 63 20  epth){.  int rc 
6190: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
61a0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
61b0: 6e 4d 61 78 44 65 70 74 68 3c 30 20 29 7b 20 0a  nMaxDepth<0 ){ .
61c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
61d0: 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 20 20 7d 65  E_TOOBIG;.    }e
61e0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
61f0: 66 74 73 33 45 78 70 72 43 68 65 63 6b 44 65 70  fts3ExprCheckDep
6200: 74 68 28 70 2d 3e 70 4c 65 66 74 2c 20 6e 4d 61  th(p->pLeft, nMa
6210: 78 44 65 70 74 68 2d 31 29 3b 0a 20 20 20 20 20  xDepth-1);.     
6220: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6230: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
6240: 20 3d 20 66 74 73 33 45 78 70 72 43 68 65 63 6b   = fts3ExprCheck
6250: 44 65 70 74 68 28 70 2d 3e 70 52 69 67 68 74 2c  Depth(p->pRight,
6260: 20 6e 4d 61 78 44 65 70 74 68 2d 31 29 3b 0a 20   nMaxDepth-1);. 
6270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6280: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6290: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
62a0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
62b0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 65   transform the e
62c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
62d0: 74 20 28 2a 70 70 29 20 74 6f 0a 2a 2a 20 61 6e  t (*pp) to.** an
62e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 62 75 74 20   equivalent but 
62f0: 6d 6f 72 65 20 62 61 6c 61 6e 63 65 64 20 66 6f  more balanced fo
6300: 72 6d 2e 20 54 68 65 20 74 72 65 65 20 69 73 20  rm. The tree is 
6310: 6d 6f 64 69 66 69 65 64 20 69 6e 20 70 6c 61 63  modified in plac
6320: 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
6330: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
6340: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28  s returned and (
6350: 2a 70 70 29 20 73 65 74 20 74 6f 20 70 6f 69 6e  *pp) set to poin
6360: 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6e 65 77  t to the .** new
6370: 20 72 6f 6f 74 20 65 78 70 72 65 73 73 69 6f 6e   root expression
6380: 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 6e 4d   node. .**.** nM
6390: 61 78 44 65 70 74 68 20 69 73 20 74 68 65 20 6d  axDepth is the m
63a0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  aximum allowable
63b0: 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 62 61   depth of the ba
63c0: 6c 61 6e 63 65 64 20 73 75 62 2d 74 72 65 65 2e  lanced sub-tree.
63d0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
63e0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
63f0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
6400: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6410: 74 75 72 6e 65 64 20 61 6e 64 20 0a 2a 2a 20 65  turned and .** e
6420: 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70 29 20  xpression (*pp) 
6430: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
6440: 20 69 6e 74 20 66 74 73 33 45 78 70 72 42 61 6c   int fts3ExprBal
6450: 61 6e 63 65 28 46 74 73 33 45 78 70 72 20 2a 2a  ance(Fts3Expr **
6460: 70 70 2c 20 69 6e 74 20 6e 4d 61 78 44 65 70 74  pp, int nMaxDept
6470: 68 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  h){.  int rc = S
6480: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
6490: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
64a0: 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  code */.  Fts3Ex
64b0: 70 72 20 2a 70 52 6f 6f 74 20 3d 20 2a 70 70 3b  pr *pRoot = *pp;
64c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
64d0: 74 69 61 6c 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  tial root node *
64e0: 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 46  /.  Fts3Expr *pF
64f0: 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ree = 0;        
6500: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
6510: 72 65 65 20 6e 6f 64 65 73 2e 20 4c 69 6e 6b 65  ree nodes. Linke
6520: 64 20 62 79 20 70 50 61 72 65 6e 74 2e 20 2a 2f  d by pParent. */
6530: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 70  .  int eType = p
6540: 52 6f 6f 74 2d 3e 65 54 79 70 65 3b 20 20 20 20  Root->eType;    
6550: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6e 6f     /* Type of no
6560: 64 65 20 69 6e 20 74 68 69 73 20 74 72 65 65 20  de in this tree 
6570: 2a 2f 0a 0a 20 20 69 66 28 20 6e 4d 61 78 44 65  */..  if( nMaxDe
6580: 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  pth==0 ){.    rc
6590: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
65a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
65b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
65c0: 20 69 66 28 20 28 65 54 79 70 65 3d 3d 46 54 53   if( (eType==FTS
65d0: 51 55 45 52 59 5f 41 4e 44 20 7c 7c 20 65 54 79  QUERY_AND || eTy
65e0: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52 29  pe==FTSQUERY_OR)
65f0: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 45 78   ){.      Fts3Ex
6600: 70 72 20 2a 2a 61 70 4c 65 61 66 3b 0a 20 20 20  pr **apLeaf;.   
6610: 20 20 20 61 70 4c 65 61 66 20 3d 20 28 46 74 73     apLeaf = (Fts
6620: 33 45 78 70 72 20 2a 2a 29 73 71 6c 69 74 65 33  3Expr **)sqlite3
6630: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46  _malloc(sizeof(F
6640: 74 73 33 45 78 70 72 20 2a 29 20 2a 20 6e 4d 61  ts3Expr *) * nMa
6650: 78 44 65 70 74 68 29 3b 0a 20 20 20 20 20 20 69  xDepth);.      i
6660: 66 28 20 30 3d 3d 61 70 4c 65 61 66 20 29 7b 0a  f( 0==apLeaf ){.
6670: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
6680: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
66a0: 6d 65 6d 73 65 74 28 61 70 4c 65 61 66 2c 20 30  memset(apLeaf, 0
66b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70  , sizeof(Fts3Exp
66c0: 72 20 2a 29 20 2a 20 6e 4d 61 78 44 65 70 74 68  r *) * nMaxDepth
66d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
66e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
66f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
6700: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 46 74  nt i;.        Ft
6710: 73 33 45 78 70 72 20 2a 70 3b 0a 0a 20 20 20 20  s3Expr *p;..    
6720: 20 20 20 20 2f 2a 20 53 65 74 20 24 70 20 74 6f      /* Set $p to
6730: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c 65   point to the le
6740: 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 6e 20  ft-most leaf in 
6750: 74 68 65 20 74 72 65 65 20 6f 66 20 65 54 79 70  the tree of eTyp
6760: 65 20 6e 6f 64 65 73 2e 20 2a 2f 0a 20 20 20 20  e nodes. */.    
6770: 20 20 20 20 66 6f 72 28 70 3d 70 52 6f 6f 74 3b      for(p=pRoot;
6780: 20 70 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65   p->eType==eType
6790: 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20  ; p=p->pLeft){. 
67a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
67b0: 20 70 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c   p->pParent==0 |
67c0: 7c 20 70 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c  | p->pParent->pL
67d0: 65 66 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20  eft==p );.      
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
67f0: 4c 65 66 74 20 26 26 20 70 2d 3e 70 52 69 67 68  Left && p->pRigh
6800: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  t );.        }..
6810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
6820: 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
6830: 6f 72 20 65 61 63 68 20 6c 65 61 66 20 69 6e 20  or each leaf in 
6840: 74 68 65 20 74 72 65 65 20 6f 66 20 65 54 79 70  the tree of eTyp
6850: 65 20 6e 6f 64 65 73 2e 20 2a 2f 0a 20 20 20 20  e nodes. */.    
6860: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
6870: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c            int iL
6880: 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  vl;.          Ft
6890: 73 33 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20  s3Expr *pParent 
68a0: 3d 20 70 2d 3e 70 50 61 72 65 6e 74 3b 20 20 20  = p->pParent;   
68b0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72    /* Current par
68c0: 65 6e 74 20 6f 66 20 70 20 2a 2f 0a 0a 20 20 20  ent of p */..   
68d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
68e0: 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61  Parent==0 || pPa
68f0: 72 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70 20 29  rent->pLeft==p )
6900: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
6910: 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
6920: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
6930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
6940: 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 20   pParent->pLeft 
6950: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
6960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6970: 20 20 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20    pRoot = 0;.   
6980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6990: 20 20 20 72 63 20 3d 20 66 74 73 33 45 78 70 72     rc = fts3Expr
69a0: 42 61 6c 61 6e 63 65 28 26 70 2c 20 6e 4d 61 78  Balance(&p, nMax
69b0: 44 65 70 74 68 2d 31 29 3b 0a 20 20 20 20 20 20  Depth-1);.      
69c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
69d0: 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  TE_OK ) break;..
69e0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c            for(iL
69f0: 76 6c 3d 30 3b 20 70 20 26 26 20 69 4c 76 6c 3c  vl=0; p && iLvl<
6a00: 6e 4d 61 78 44 65 70 74 68 3b 20 69 4c 76 6c 2b  nMaxDepth; iLvl+
6a10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
6a20: 69 66 28 20 61 70 4c 65 61 66 5b 69 4c 76 6c 5d  if( apLeaf[iLvl]
6a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6a40: 20 20 20 20 20 61 70 4c 65 61 66 5b 69 4c 76 6c       apLeaf[iLvl
6a50: 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  ] = p;.         
6a60: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
6a70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
6a90: 65 72 74 28 20 70 46 72 65 65 20 29 3b 0a 20 20  ert( pFree );.  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 72 65              pFre
6ab0: 65 2d 3e 70 4c 65 66 74 20 3d 20 61 70 4c 65 61  e->pLeft = apLea
6ac0: 66 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 20  f[iLvl];.       
6ad0: 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e 70 52         pFree->pR
6ae0: 69 67 68 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  ight = p;.      
6af0: 20 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e 70          pFree->p
6b00: 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Left->pParent = 
6b10: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 20  pFree;.         
6b20: 20 20 20 20 20 70 46 72 65 65 2d 3e 70 52 69 67       pFree->pRig
6b30: 68 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46  ht->pParent = pF
6b40: 72 65 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ree;..          
6b50: 20 20 20 20 70 20 3d 20 70 46 72 65 65 3b 0a 20      p = pFree;. 
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 72               pFr
6b70: 65 65 20 3d 20 70 46 72 65 65 2d 3e 70 50 61 72  ee = pFree->pPar
6b80: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ent;.           
6b90: 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20     p->pParent = 
6ba0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
6bb0: 20 61 70 4c 65 61 66 5b 69 4c 76 6c 5d 20 3d 20   apLeaf[iLvl] = 
6bc0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
6bd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6be0: 20 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a         if( p ){.
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6c00: 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28  te3Fts3ExprFree(
6c10: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
6c20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42  rc = SQLITE_TOOB
6c30: 49 47 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  IG;.            
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6c50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
6c60: 20 49 66 20 74 68 61 74 20 77 61 73 20 74 68 65   If that was the
6c70: 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f 64 65 2c   last leaf node,
6c80: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
6c90: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
6ca0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d      if( pParent=
6cb0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
6cc0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 24 70         /* Set $p
6cd0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
6ce0: 20 6e 65 78 74 20 6c 65 61 66 20 69 6e 20 74 68   next leaf in th
6cf0: 65 20 74 72 65 65 20 6f 66 20 65 54 79 70 65 20  e tree of eType 
6d00: 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  nodes */.       
6d10: 20 20 20 66 6f 72 28 70 3d 70 50 61 72 65 6e 74     for(p=pParent
6d20: 2d 3e 70 52 69 67 68 74 3b 20 70 2d 3e 65 54 79  ->pRight; p->eTy
6d30: 70 65 3d 3d 65 54 79 70 65 3b 20 70 3d 70 2d 3e  pe==eType; p=p->
6d40: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20  pLeft);..       
6d50: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70 50 61     /* Remove pPa
6d60: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 72  rent from the or
6d70: 69 67 69 6e 61 6c 20 74 72 65 65 2e 20 2a 2f 0a  iginal tree. */.
6d80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
6d90: 28 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72 65  ( pParent->pPare
6da0: 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  nt==0 || pParent
6db0: 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  ->pParent->pLeft
6dc0: 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 20  ==pParent );.   
6dd0: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e         pParent->
6de0: 70 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 20  pRight->pParent 
6df0: 3d 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72 65  = pParent->pPare
6e00: 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nt;.          if
6e10: 28 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72 65  ( pParent->pPare
6e20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
6e30: 20 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72 65    pParent->pPare
6e40: 6e 74 2d 3e 70 4c 65 66 74 20 3d 20 70 50 61 72  nt->pLeft = pPar
6e50: 65 6e 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  ent->pRight;.   
6e60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6e70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
6e80: 28 20 70 50 61 72 65 6e 74 3d 3d 70 52 6f 6f 74  ( pParent==pRoot
6e90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
6ea0: 70 52 6f 6f 74 20 3d 20 70 50 61 72 65 6e 74 2d  pRoot = pParent-
6eb0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
6ec0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
6ed0: 2f 2a 20 4c 69 6e 6b 20 70 50 61 72 65 6e 74 20  /* Link pParent 
6ee0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 20 6e 6f  into the free no
6ef0: 64 65 20 6c 69 73 74 2e 20 49 74 20 77 69 6c 6c  de list. It will
6f00: 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 0a 20   be used as an. 
6f10: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65           ** inte
6f20: 72 6e 61 6c 20 6e 6f 64 65 20 6f 66 20 74 68 65  rnal node of the
6f30: 20 6e 65 77 20 74 72 65 65 2e 20 20 2a 2f 0a 20   new tree.  */. 
6f40: 20 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74           pParent
6f50: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46 72 65  ->pParent = pFre
6f60: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  e;.          pFr
6f70: 65 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ee = pParent;.  
6f80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
6f90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6fa0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
6fb0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  p = 0;.         
6fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 61 78   for(i=0; i<nMax
6fd0: 44 65 70 74 68 3b 20 69 2b 2b 29 7b 0a 20 20 20  Depth; i++){.   
6fe0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4c           if( apL
6ff0: 65 61 66 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  eaf[i] ){.      
7000: 20 20 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30          if( p==0
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7020: 20 20 20 20 70 20 3d 20 61 70 4c 65 61 66 5b 69      p = apLeaf[i
7030: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
7040: 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20     p->pParent = 
7050: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
7060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7070: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7080: 70 46 72 65 65 21 3d 30 20 29 3b 0a 20 20 20 20  pFree!=0 );.    
7090: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 72 65              pFre
70a0: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 3b 0a 20  e->pRight = p;. 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
70c0: 46 72 65 65 2d 3e 70 4c 65 66 74 20 3d 20 61 70  Free->pLeft = ap
70d0: 4c 65 61 66 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Leaf[i];.       
70e0: 20 20 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e           pFree->
70f0: 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d  pLeft->pParent =
7100: 20 70 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20   pFree;.        
7110: 20 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e 70          pFree->p
7120: 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 20 3d  Right->pParent =
7130: 20 70 46 72 65 65 3b 0a 0a 20 20 20 20 20 20 20   pFree;..       
7140: 20 20 20 20 20 20 20 20 20 70 20 3d 20 70 46 72           p = pFr
7150: 65 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ee;.            
7160: 20 20 20 20 70 46 72 65 65 20 3d 20 70 46 72 65      pFree = pFre
7170: 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  e->pParent;.    
7180: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
7190: 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
71a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
71b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
71d0: 70 52 6f 6f 74 20 3d 20 70 3b 0a 20 20 20 20 20  pRoot = p;.     
71e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
71f0: 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
7200: 6f 63 63 75 72 72 65 64 2e 20 44 65 6c 65 74 65  occurred. Delete
7210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
7220: 20 74 68 65 20 61 70 4c 65 61 66 5b 5d 20 61 72   the apLeaf[] ar
7230: 72 61 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ray .          *
7240: 2a 20 61 6e 64 20 70 46 72 65 65 20 6c 69 73 74  * and pFree list
7250: 2e 20 45 76 65 72 79 74 68 69 6e 67 20 65 6c 73  . Everything els
7260: 65 20 69 73 20 63 6c 65 61 6e 65 64 20 75 70 20  e is cleaned up 
7270: 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20  by the call to. 
7280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69           ** sqli
7290: 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28  te3Fts3ExprFree(
72a0: 70 52 6f 6f 74 29 20 62 65 6c 6f 77 2e 20 20 2a  pRoot) below.  *
72b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33  /.          Fts3
72c0: 45 78 70 72 20 2a 70 44 65 6c 3b 0a 20 20 20 20  Expr *pDel;.    
72d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
72e0: 3c 6e 4d 61 78 44 65 70 74 68 3b 20 69 2b 2b 29  <nMaxDepth; i++)
72f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7300: 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65  lite3Fts3ExprFre
7310: 65 28 61 70 4c 65 61 66 5b 69 5d 29 3b 0a 20 20  e(apLeaf[i]);.  
7320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7330: 20 20 20 20 77 68 69 6c 65 28 20 28 70 44 65 6c      while( (pDel
7340: 3d 70 46 72 65 65 29 21 3d 30 20 29 7b 0a 20 20  =pFree)!=0 ){.  
7350: 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
7360: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
7370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
7380: 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c 29 3b  ite3_free(pDel);
7390: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
73a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
73b0: 61 73 73 65 72 74 28 20 70 46 72 65 65 3d 3d 30  assert( pFree==0
73c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
73d0: 74 65 33 5f 66 72 65 65 28 20 61 70 4c 65 61 66  te3_free( apLeaf
73e0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
73f0: 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
7400: 3d 46 54 53 51 55 45 52 59 5f 4e 4f 54 20 29 7b  =FTSQUERY_NOT ){
7410: 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20  .      Fts3Expr 
7420: 2a 70 4c 65 66 74 20 3d 20 70 52 6f 6f 74 2d 3e  *pLeft = pRoot->
7430: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 46 74 73  pLeft;.      Fts
7440: 33 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20  3Expr *pRight = 
7450: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 3b 0a 0a  pRoot->pRight;..
7460: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
7470: 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52  ft = 0;.      pR
7480: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  oot->pRight = 0;
7490: 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 50  .      pLeft->pP
74a0: 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
74b0: 20 70 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74   pRight->pParent
74c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
74d0: 3d 20 66 74 73 33 45 78 70 72 42 61 6c 61 6e 63  = fts3ExprBalanc
74e0: 65 28 26 70 4c 65 66 74 2c 20 6e 4d 61 78 44 65  e(&pLeft, nMaxDe
74f0: 70 74 68 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  pth-1);.      if
7500: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7510: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
7520: 66 74 73 33 45 78 70 72 42 61 6c 61 6e 63 65 28  fts3ExprBalance(
7530: 26 70 52 69 67 68 74 2c 20 6e 4d 61 78 44 65 70  &pRight, nMaxDep
7540: 74 68 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  th-1);.      }..
7550: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7560: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7570: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
7580: 70 72 46 72 65 65 28 70 52 69 67 68 74 29 3b 0a  prFree(pRight);.
7590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
75a0: 74 73 33 45 78 70 72 46 72 65 65 28 70 4c 65 66  ts3ExprFree(pLef
75b0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
75c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
75d0: 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74   pLeft && pRight
75e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   );.        pRoo
75f0: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
7600: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d  ;.        pLeft-
7610: 3e 70 50 61 72 65 6e 74 20 3d 20 70 52 6f 6f 74  >pParent = pRoot
7620: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
7630: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
7640: 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74  ;.        pRight
7650: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 52 6f 6f  ->pParent = pRoo
7660: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7670: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
7680: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7690: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
76a0: 70 72 46 72 65 65 28 70 52 6f 6f 74 29 3b 0a 20  prFree(pRoot);. 
76b0: 20 20 20 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20     pRoot = 0;.  
76c0: 7d 0a 20 20 2a 70 70 20 3d 20 70 52 6f 6f 74 3b  }.  *pp = pRoot;
76d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
76e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
76f0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
7700: 74 6f 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  to sqlite3Fts3Ex
7710: 70 72 50 61 72 73 65 28 29 2c 20 77 69 74 68 20  prParse(), with 
7720: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
7730: 20 64 69 66 66 65 72 65 6e 63 65 73 3a 0a 2a 2a   differences:.**
7740: 0a 2a 2a 20 20 20 31 2e 20 49 74 20 64 6f 65 73  .**   1. It does
7750: 20 6e 6f 74 20 64 6f 20 65 78 70 72 65 73 73 69   not do expressi
7760: 6f 6e 20 72 65 62 61 6c 61 6e 63 69 6e 67 2e 0a  on rebalancing..
7770: 2a 2a 20 20 20 32 2e 20 49 74 20 64 6f 65 73 20  **   2. It does 
7780: 6e 6f 74 20 63 68 65 63 6b 20 74 68 61 74 20 74  not check that t
7790: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  he expression do
77a0: 65 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68  es not exceed th
77b0: 65 20 0a 2a 2a 20 20 20 20 20 20 6d 61 78 69 6d  e .**      maxim
77c0: 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 64 65 70  um allowable dep
77d0: 74 68 2e 0a 2a 2a 20 20 20 33 2e 20 45 76 65 6e  th..**   3. Even
77e0: 20 69 66 20 69 74 20 66 61 69 6c 73 2c 20 2a 70   if it fails, *p
77f0: 70 45 78 70 72 20 6d 61 79 20 73 74 69 6c 6c 20  pExpr may still 
7800: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
7810: 74 6f 20 61 6e 20 0a 2a 2a 20 20 20 20 20 20 65  to an .**      e
7820: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
7830: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  It should be del
7840: 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
7850: 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28 29  e3Fts3ExprFree()
7860: 0a 2a 2a 20 20 20 20 20 20 69 6e 20 74 68 69 73  .**      in this
7870: 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
7880: 20 69 6e 74 20 66 74 73 33 45 78 70 72 50 61 72   int fts3ExprPar
7890: 73 65 55 6e 62 61 6c 61 6e 63 65 64 28 0a 20 20  seUnbalanced(.  
78a0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
78b0: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 20  r *pTokenizer,  
78c0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72      /* Tokenizer
78d0: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 69 6e 74   module */.  int
78e0: 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
7910: 66 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f  for tokenizer */
7920: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7950: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
7960: 66 6f 72 20 66 74 73 33 20 74 61 62 6c 65 20 2a  for fts3 table *
7970: 2f 0a 20 20 69 6e 74 20 62 46 74 73 34 2c 20 20  /.  int bFts4,  
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
79a0: 74 6f 20 61 6c 6c 6f 77 20 46 54 53 34 2d 6f 6e  to allow FTS4-on
79b0: 6c 79 20 73 79 6e 74 61 78 20 2a 2f 0a 20 20 69  ly syntax */.  i
79c0: 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt nCol,        
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
79f0: 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 43 6f 6c  entries in azCol
7a00: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 66  [] */.  int iDef
7a10: 61 75 6c 74 43 6f 6c 2c 20 20 20 20 20 20 20 20  aultCol,        
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7a30: 65 66 61 75 6c 74 20 63 6f 6c 75 6d 6e 20 74 6f  efault column to
7a40: 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73   query */.  cons
7a50: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
7a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7a70: 2f 2a 20 54 65 78 74 20 6f 66 20 4d 41 54 43 48  /* Text of MATCH
7a80: 20 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33   query */.  Fts3
7a90: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 2f 2a 20 4f 55 54 3a 20 50 61 72 73 65 64 20 71  /* OUT: Parsed q
7ac0: 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20 2a  uery structure *
7ad0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 72 73  /.){.  int nPars
7ae0: 65 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ed;.  int rc;.  
7af0: 50 61 72 73 65 43 6f 6e 74 65 78 74 20 73 50 61  ParseContext sPa
7b00: 72 73 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  rse;..  memset(&
7b10: 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f  sParse, 0, sizeo
7b20: 66 28 50 61 72 73 65 43 6f 6e 74 65 78 74 29 29  f(ParseContext))
7b30: 3b 0a 20 20 73 50 61 72 73 65 2e 70 54 6f 6b 65  ;.  sParse.pToke
7b40: 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a  nizer = pTokeniz
7b50: 65 72 3b 0a 20 20 73 50 61 72 73 65 2e 69 4c 61  er;.  sParse.iLa
7b60: 6e 67 69 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a  ngid = iLangid;.
7b70: 20 20 73 50 61 72 73 65 2e 61 7a 43 6f 6c 20 3d    sParse.azCol =
7b80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29   (const char **)
7b90: 61 7a 43 6f 6c 3b 0a 20 20 73 50 61 72 73 65 2e  azCol;.  sParse.
7ba0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 73  nCol = nCol;.  s
7bb0: 50 61 72 73 65 2e 69 44 65 66 61 75 6c 74 43 6f  Parse.iDefaultCo
7bc0: 6c 20 3d 20 69 44 65 66 61 75 6c 74 43 6f 6c 3b  l = iDefaultCol;
7bd0: 0a 20 20 73 50 61 72 73 65 2e 62 46 74 73 34 20  .  sParse.bFts4 
7be0: 3d 20 62 46 74 73 34 3b 0a 20 20 69 66 28 20 7a  = bFts4;.  if( z
7bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ==0 ){.    *ppEx
7c00: 70 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  pr = 0;.    retu
7c10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7c20: 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  }.  if( n<0 ){. 
7c30: 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c     n = (int)strl
7c40: 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 72 63 20  en(z);.  }.  rc 
7c50: 3d 20 66 74 73 33 45 78 70 72 50 61 72 73 65 28  = fts3ExprParse(
7c60: 26 73 50 61 72 73 65 2c 20 7a 2c 20 6e 2c 20 70  &sParse, z, n, p
7c70: 70 45 78 70 72 2c 20 26 6e 50 61 72 73 65 64 29  pExpr, &nParsed)
7c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
7c90: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70 70  SQLITE_OK || *pp
7ca0: 45 78 70 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Expr==0 );..  /*
7cb0: 20 43 68 65 63 6b 20 66 6f 72 20 6d 69 73 6d 61   Check for misma
7cc0: 74 63 68 65 64 20 70 61 72 65 6e 74 68 65 73 69  tched parenthesi
7cd0: 73 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  s */.  if( rc==S
7ce0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 50 61 72  QLITE_OK && sPar
7cf0: 73 65 2e 6e 4e 65 73 74 20 29 7b 0a 20 20 20 20  se.nNest ){.    
7d00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
7d10: 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  R;.  }.  .  retu
7d20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7d30: 50 61 72 61 6d 65 74 65 72 73 20 7a 20 61 6e 64  Parameters z and
7d40: 20 6e 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69   n contain a poi
7d50: 6e 74 65 72 20 74 6f 20 61 6e 64 20 6c 65 6e 67  nter to and leng
7d60: 74 68 20 6f 66 20 61 20 62 75 66 66 65 72 20 63  th of a buffer c
7d70: 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20  ontaining.** an 
7d80: 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72 65  fts3 query expre
7d90: 73 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76  ssion, respectiv
7da0: 65 6c 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ely. This functi
7db0: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 70  on attempts to p
7dc0: 61 72 73 65 20 74 68 65 0a 2a 2a 20 71 75 65 72  arse the.** quer
7dd0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  y expression and
7de0: 20 63 72 65 61 74 65 20 61 20 74 72 65 65 20 6f   create a tree o
7df0: 66 20 46 74 73 33 45 78 70 72 20 73 74 72 75 63  f Fts3Expr struc
7e00: 74 75 72 65 73 20 72 65 70 72 65 73 65 6e 74 69  tures representi
7e10: 6e 67 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 64  ng the.** parsed
7e20: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 66 20   expression. If 
7e30: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 45  successful, *ppE
7e40: 78 70 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  xpr is set to po
7e50: 69 6e 74 20 74 6f 20 74 68 65 20 68 65 61 64 0a  int to the head.
7e60: 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 73 65 64  ** of the parsed
7e70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
7e80: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
7e90: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
7ea0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
7eb0: 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
7ec0: 5f 4e 4f 4d 45 4d 20 28 6f 75 74 2d 6f 66 2d 6d  _NOMEM (out-of-m
7ed0: 65 6d 6f 72 79 20 65 72 72 6f 72 29 20 6f 72 20  emory error) or 
7ee0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 70 61  SQLITE_ERROR (pa
7ef0: 72 73 65 0a 2a 2a 20 65 72 72 6f 72 29 20 69 73  rse.** error) is
7f00: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
7f10: 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20  pExpr is set to 
7f20: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  0..**.** If para
7f30: 6d 65 74 65 72 20 6e 20 69 73 20 61 20 6e 65 67  meter n is a neg
7f40: 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 74 68  ative number, th
7f50: 65 6e 20 7a 20 69 73 20 61 73 73 75 6d 65 64 20  en z is assumed 
7f60: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a  to point to a.**
7f70: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
7f80: 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6c  string and the l
7f90: 65 6e 67 74 68 20 69 73 20 64 65 74 65 72 6d 69  ength is determi
7fa0: 6e 65 64 20 75 73 69 6e 67 20 73 74 72 6c 65 6e  ned using strlen
7fb0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
7fc0: 72 73 74 20 70 61 72 61 6d 65 74 65 72 2c 20 70  rst parameter, p
7fd0: 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 73 20 70 61  Tokenizer, is pa
7fe0: 73 73 65 64 20 74 68 65 20 66 74 73 33 20 74 6f  ssed the fts3 to
7ff0: 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 74  kenizer module t
8000: 6f 0a 2a 2a 20 75 73 65 20 74 6f 20 6e 6f 72 6d  o.** use to norm
8010: 61 6c 69 7a 65 20 71 75 65 72 79 20 74 6f 6b 65  alize query toke
8020: 6e 73 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  ns while parsing
8030: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
8040: 20 54 68 65 20 61 7a 43 6f 6c 5b 5d 0a 2a 2a 20   The azCol[].** 
8050: 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
8060: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
8070: 69 6e 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c  in nCol entries,
8080: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20   should contain 
8090: 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66 20  the names.** of 
80a0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
80b0: 68 65 20 74 61 72 67 65 74 20 66 74 73 33 20 74  he target fts3 t
80c0: 61 62 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 66  able, in order f
80d0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
80e0: 74 2e 20 0a 2a 2a 20 43 6f 6c 75 6d 6e 20 6e 61  t. .** Column na
80f0: 6d 65 73 20 6d 75 73 74 20 62 65 20 6e 75 6c 2d  mes must be nul-
8100: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8110: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 44  gs..**.** The iD
8120: 65 66 61 75 6c 74 43 6f 6c 20 70 61 72 61 6d 65  efaultCol parame
8130: 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20 70 61  ter should be pa
8140: 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f  ssed the index o
8150: 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
8160: 6d 6e 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  mn.** that appea
8170: 72 73 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68  rs on the left-h
8180: 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
8190: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 28  MATCH operator (
81a0: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 63  the default.** c
81b0: 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63 68 20 61  olumn to match a
81c0: 67 61 69 6e 73 74 20 66 6f 72 20 74 6f 6b 65 6e  gainst for token
81d0: 73 20 66 6f 72 20 77 68 69 63 68 20 61 20 63 6f  s for which a co
81e0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 74  lumn name is not
81f0: 20 65 78 70 6c 69 63 69 74 6c 79 0a 2a 2a 20 73   explicitly.** s
8200: 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
8210: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 73 74   of the query st
8220: 72 69 6e 67 29 2c 20 6f 72 20 2d 31 20 69 66 20  ring), or -1 if 
8230: 74 6f 6b 65 6e 73 20 6d 61 79 20 62 79 20 64 65  tokens may by de
8240: 66 61 75 6c 74 0a 2a 2a 20 6d 61 74 63 68 20 61  fault.** match a
8250: 6e 79 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  ny table column.
8260: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
8270: 74 73 33 45 78 70 72 50 61 72 73 65 28 0a 20 20  ts3ExprParse(.  
8280: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
8290: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 20  r *pTokenizer,  
82a0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72      /* Tokenizer
82b0: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 69 6e 74   module */.  int
82c0: 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
82f0: 66 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f  for tokenizer */
8300: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8330: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
8340: 66 6f 72 20 66 74 73 33 20 74 61 62 6c 65 20 2a  for fts3 table *
8350: 2f 0a 20 20 69 6e 74 20 62 46 74 73 34 2c 20 20  /.  int bFts4,  
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8380: 74 6f 20 61 6c 6c 6f 77 20 46 54 53 34 2d 6f 6e  to allow FTS4-on
8390: 6c 79 20 73 79 6e 74 61 78 20 2a 2f 0a 20 20 69  ly syntax */.  i
83a0: 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt nCol,        
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
83d0: 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 43 6f 6c  entries in azCol
83e0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 66  [] */.  int iDef
83f0: 61 75 6c 74 43 6f 6c 2c 20 20 20 20 20 20 20 20  aultCol,        
8400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8410: 65 66 61 75 6c 74 20 63 6f 6c 75 6d 6e 20 74 6f  efault column to
8420: 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73   query */.  cons
8430: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
8440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8450: 2f 2a 20 54 65 78 74 20 6f 66 20 4d 41 54 43 48  /* Text of MATCH
8460: 20 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33   query */.  Fts3
8470: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20  Expr **ppExpr,  
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 2f 2a 20 4f 55 54 3a 20 50 61 72 73 65 64 20 71  /* OUT: Parsed q
84a0: 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20 2a  uery structure *
84b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
84e0: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 73  Error message (s
84f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 2a  qlite3_malloc) *
8500: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
8510: 66 74 73 33 45 78 70 72 50 61 72 73 65 55 6e 62  fts3ExprParseUnb
8520: 61 6c 61 6e 63 65 64 28 0a 20 20 20 20 20 20 70  alanced(.      p
8530: 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67  Tokenizer, iLang
8540: 69 64 2c 20 61 7a 43 6f 6c 2c 20 62 46 74 73 34  id, azCol, bFts4
8550: 2c 20 6e 43 6f 6c 2c 20 69 44 65 66 61 75 6c 74  , nCol, iDefault
8560: 43 6f 6c 2c 20 7a 2c 20 6e 2c 20 70 70 45 78 70  Col, z, n, ppExp
8570: 72 0a 20 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52  r.  );.  .  /* R
8580: 65 62 61 6c 61 6e 63 65 20 74 68 65 20 65 78 70  ebalance the exp
8590: 72 65 73 73 69 6f 6e 2e 20 41 6e 64 20 63 68 65  ression. And che
85a0: 63 6b 20 74 68 61 74 20 69 74 73 20 64 65 70 74  ck that its dept
85b0: 68 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65  h does not excee
85c0: 64 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 54  d.  ** SQLITE_FT
85d0: 53 33 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  S3_MAX_EXPR_DEPT
85e0: 48 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  H.  */.  if( rc=
85f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70  =SQLITE_OK && *p
8600: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20  pExpr ){.    rc 
8610: 3d 20 66 74 73 33 45 78 70 72 42 61 6c 61 6e 63  = fts3ExprBalanc
8620: 65 28 70 70 45 78 70 72 2c 20 53 51 4c 49 54 45  e(ppExpr, SQLITE
8630: 5f 46 54 53 33 5f 4d 41 58 5f 45 58 50 52 5f 44  _FTS3_MAX_EXPR_D
8640: 45 50 54 48 29 3b 0a 20 20 20 20 69 66 28 20 72  EPTH);.    if( r
8650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8660: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45        rc = fts3E
8670: 78 70 72 43 68 65 63 6b 44 65 70 74 68 28 2a 70  xprCheckDepth(*p
8680: 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 46 54  pExpr, SQLITE_FT
8690: 53 33 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  S3_MAX_EXPR_DEPT
86a0: 48 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  H);.    }.  }.. 
86b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
86c0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
86d0: 33 46 74 73 33 45 78 70 72 46 72 65 65 28 2a 70  3Fts3ExprFree(*p
86e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 2a 70 70 45  pExpr);.    *ppE
86f0: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  xpr = 0;.    if(
8700: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42   rc==SQLITE_TOOB
8710: 49 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IG ){.      sqli
8720: 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70 7a  te3Fts3ErrMsg(pz
8730: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22  Err,.          "
8740: 46 54 53 20 65 78 70 72 65 73 73 69 6f 6e 20 74  FTS expression t
8750: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
8760: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
8770: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
8780: 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 4d 41 58   SQLITE_FTS3_MAX
8790: 5f 45 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20  _EXPR_DEPTH.    
87a0: 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
87b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
87c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
87d0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a  SQLITE_ERROR ){.
87e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
87f0: 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c 20 22  3ErrMsg(pzErr, "
8800: 6d 61 6c 66 6f 72 6d 65 64 20 4d 41 54 43 48 20  malformed MATCH 
8810: 65 78 70 72 65 73 73 69 6f 6e 3a 20 5b 25 73 5d  expression: [%s]
8820: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
8830: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
8840: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
8850: 69 6e 67 6c 65 20 6e 6f 64 65 20 6f 66 20 61 6e  ingle node of an
8860: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8880: 20 66 74 73 33 46 72 65 65 45 78 70 72 4e 6f 64   fts3FreeExprNod
8890: 65 28 46 74 73 33 45 78 70 72 20 2a 70 29 7b 0a  e(Fts3Expr *p){.
88a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 54 79    assert( p->eTy
88b0: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52  pe==FTSQUERY_PHR
88c0: 41 53 45 20 7c 7c 20 70 2d 3e 70 50 68 72 61 73  ASE || p->pPhras
88d0: 65 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  e==0 );.  sqlite
88e0: 33 46 74 73 33 45 76 61 6c 50 68 72 61 73 65 43  3Fts3EvalPhraseC
88f0: 6c 65 61 6e 75 70 28 70 2d 3e 70 50 68 72 61 73  leanup(p->pPhras
8900: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
8910: 65 65 28 70 2d 3e 61 4d 49 29 3b 0a 20 20 73 71  ee(p->aMI);.  sq
8920: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
8930: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 70  ../*.** Free a p
8940: 61 72 73 65 64 20 66 74 73 33 20 71 75 65 72 79  arsed fts3 query
8950: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6c 6c 6f   expression allo
8960: 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  cated by sqlite3
8970: 46 74 73 33 45 78 70 72 50 61 72 73 65 28 29 2e  Fts3ExprParse().
8980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
8990: 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 73 69  tion would be si
89a0: 6d 70 6c 65 72 20 69 66 20 69 74 20 72 65 63 75  mpler if it recu
89b0: 72 73 69 76 65 6c 79 20 63 61 6c 6c 65 64 20 69  rsively called i
89c0: 74 73 65 6c 66 2e 20 42 75 74 0a 2a 2a 20 74 68  tself. But.** th
89d0: 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 20 70 61  at would mean pa
89e0: 73 73 69 6e 67 20 61 20 73 75 66 66 69 63 69 65  ssing a sufficie
89f0: 6e 74 6c 79 20 6c 61 72 67 65 20 65 78 70 72 65  ntly large expre
8a00: 73 73 69 6f 6e 20 74 6f 20 45 78 70 72 50 61 72  ssion to ExprPar
8a10: 73 65 28 29 0a 2a 2a 20 63 6f 75 6c 64 20 63 61  se().** could ca
8a20: 75 73 65 20 61 20 73 74 61 63 6b 20 6f 76 65 72  use a stack over
8a30: 66 6c 6f 77 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  flow..*/.void sq
8a40: 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65  lite3Fts3ExprFre
8a50: 65 28 46 74 73 33 45 78 70 72 20 2a 70 44 65 6c  e(Fts3Expr *pDel
8a60: 29 7b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  ){.  Fts3Expr *p
8a70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 6c  ;.  assert( pDel
8a80: 3d 3d 30 20 7c 7c 20 70 44 65 6c 2d 3e 70 50 61  ==0 || pDel->pPa
8a90: 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  rent==0 );.  for
8aa0: 28 70 3d 70 44 65 6c 3b 20 70 20 26 26 20 28 70  (p=pDel; p && (p
8ab0: 2d 3e 70 4c 65 66 74 7c 7c 70 2d 3e 70 52 69 67  ->pLeft||p->pRig
8ac0: 68 74 29 3b 20 70 3d 28 70 2d 3e 70 4c 65 66 74  ht); p=(p->pLeft
8ad0: 20 3f 20 70 2d 3e 70 4c 65 66 74 20 3a 20 70 2d   ? p->pLeft : p-
8ae0: 3e 70 52 69 67 68 74 29 29 7b 0a 20 20 20 20 61  >pRight)){.    a
8af0: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 65 6e  ssert( p->pParen
8b00: 74 3d 3d 30 20 7c 7c 20 70 3d 3d 70 2d 3e 70 50  t==0 || p==p->pP
8b10: 61 72 65 6e 74 2d 3e 70 52 69 67 68 74 20 7c 7c  arent->pRight ||
8b20: 20 70 3d 3d 70 2d 3e 70 50 61 72 65 6e 74 2d 3e   p==p->pParent->
8b30: 70 4c 65 66 74 20 29 3b 0a 20 20 7d 0a 20 20 77  pLeft );.  }.  w
8b40: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 46  hile( p ){.    F
8b50: 74 73 33 45 78 70 72 20 2a 70 50 61 72 65 6e 74  ts3Expr *pParent
8b60: 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74 3b 0a 20   = p->pParent;. 
8b70: 20 20 20 66 74 73 33 46 72 65 65 45 78 70 72 4e     fts3FreeExprN
8b80: 6f 64 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ode(p);.    if( 
8b90: 70 50 61 72 65 6e 74 20 26 26 20 70 3d 3d 70 50  pParent && p==pP
8ba0: 61 72 65 6e 74 2d 3e 70 4c 65 66 74 20 26 26 20  arent->pLeft && 
8bb0: 70 50 61 72 65 6e 74 2d 3e 70 52 69 67 68 74 20  pParent->pRight 
8bc0: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 50 61  ){.      p = pPa
8bd0: 72 65 6e 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20  rent->pRight;.  
8be0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
8bf0: 28 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e  (p->pLeft || p->
8c00: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  pRight) ){.     
8c10: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 2d     assert( p==p-
8c20: 3e 70 50 61 72 65 6e 74 2d 3e 70 52 69 67 68 74  >pParent->pRight
8c30: 20 7c 7c 20 70 3d 3d 70 2d 3e 70 50 61 72 65 6e   || p==p->pParen
8c40: 74 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t->pLeft );.    
8c50: 20 20 20 20 70 20 3d 20 28 70 2d 3e 70 4c 65 66      p = (p->pLef
8c60: 74 20 3f 20 70 2d 3e 70 4c 65 66 74 20 3a 20 70  t ? p->pLeft : p
8c70: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8c80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8c90: 20 20 20 20 70 20 3d 20 70 50 61 72 65 6e 74 3b      p = pParent;
8ca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
8d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65  *********.** Eve
8d50: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
8d60: 69 73 20 70 6f 69 6e 74 20 69 73 20 6a 75 73 74  is point is just
8d70: 20 74 65 73 74 20 63 6f 64 65 2e 0a 2a 2f 0a 0a   test code..*/..
8d80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8d90: 53 54 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  ST..#include <st
8da0: 64 69 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52 65  dio.h>../*.** Re
8db0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8dc0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
8dd0: 69 6e 69 6e 67 20 61 20 74 65 78 74 20 72 65 70  ining a text rep
8de0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
8df0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
8e00: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8e10: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8e20: 68 65 20 62 75 66 66 65 72 20 69 73 20 6f 62 74  he buffer is obt
8e30: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
8e40: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
8e50: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
8e60: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
8e70: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 0a 2a  caller to use .*
8e80: 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
8e90: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
8ea0: 6d 65 6d 6f 72 79 2e 20 49 66 20 61 6e 20 4f 4f  memory. If an OO
8eb0: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
8ec0: 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 4e  ncountered,.** N
8ed0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
8ee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
8ef0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
8f00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
8f10: 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  its contents are
8f20: 20 70 72 65 70 65 6e 64 65 64 20 74 6f 20 0a 2a   prepended to .*
8f30: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65  * the returned e
8f40: 78 70 72 65 73 73 69 6f 6e 20 74 65 78 74 20 61  xpression text a
8f50: 6e 64 20 74 68 65 6e 20 66 72 65 65 64 20 75 73  nd then freed us
8f60: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
8f70: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
8f80: 61 72 20 2a 65 78 70 72 54 6f 53 74 72 69 6e 67  ar *exprToString
8f90: 28 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72  (Fts3Expr *pExpr
8fa0: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
8fb0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
8fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
8fd0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b  te3_mprintf("");
8fe0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
8ff0: 45 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Expr->eType ){. 
9000: 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59     case FTSQUERY
9010: 5f 50 48 52 41 53 45 3a 20 7b 0a 20 20 20 20 20  _PHRASE: {.     
9020: 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
9030: 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50  rase = pExpr->pP
9040: 68 72 61 73 65 3b 0a 20 20 20 20 20 20 69 6e 74  hrase;.      int
9050: 20 69 3b 0a 20 20 20 20 20 20 7a 42 75 66 20 3d   i;.      zBuf =
9060: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9070: 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a 50  (.          "%zP
9080: 48 52 41 53 45 20 25 64 20 30 22 2c 20 7a 42 75  HRASE %d 0", zBu
9090: 66 2c 20 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c  f, pPhrase->iCol
90a0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  umn);.      for(
90b0: 69 3d 30 3b 20 7a 42 75 66 20 26 26 20 69 3c 70  i=0; zBuf && i<p
90c0: 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20  Phrase->nToken; 
90d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  i++){.        zB
90e0: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
90f0: 69 6e 74 66 28 22 25 7a 20 25 2e 2a 73 25 73 22  intf("%z %.*s%s"
9100: 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , zBuf, .       
9110: 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54       pPhrase->aT
9120: 6f 6b 65 6e 5b 69 5d 2e 6e 2c 20 70 50 68 72 61  oken[i].n, pPhra
9130: 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 7a 2c  se->aToken[i].z,
9140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
9150: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d  hrase->aToken[i]
9160: 2e 69 73 50 72 65 66 69 78 3f 22 2b 22 3a 22 22  .isPrefix?"+":""
9170: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
9180: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
9190: 6e 20 7a 42 75 66 3b 0a 20 20 20 20 7d 0a 0a 20  n zBuf;.    }.. 
91a0: 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59     case FTSQUERY
91b0: 5f 4e 45 41 52 3a 0a 20 20 20 20 20 20 7a 42 75  _NEAR:.      zBu
91c0: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  f = sqlite3_mpri
91d0: 6e 74 66 28 22 25 7a 4e 45 41 52 2f 25 64 20 22  ntf("%zNEAR/%d "
91e0: 2c 20 7a 42 75 66 2c 20 70 45 78 70 72 2d 3e 6e  , zBuf, pExpr->n
91f0: 4e 65 61 72 29 3b 0a 20 20 20 20 20 20 62 72 65  Near);.      bre
9200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 46 54 53  ak;.    case FTS
9210: 51 55 45 52 59 5f 4e 4f 54 3a 0a 20 20 20 20 20  QUERY_NOT:.     
9220: 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   zBuf = sqlite3_
9230: 6d 70 72 69 6e 74 66 28 22 25 7a 4e 4f 54 20 22  mprintf("%zNOT "
9240: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 62  , zBuf);.      b
9250: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 46  reak;.    case F
9260: 54 53 51 55 45 52 59 5f 41 4e 44 3a 0a 20 20 20  TSQUERY_AND:.   
9270: 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65     zBuf = sqlite
9280: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 41 4e 44  3_mprintf("%zAND
9290: 20 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20   ", zBuf);.     
92a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
92b0: 20 46 54 53 51 55 45 52 59 5f 4f 52 3a 0a 20 20   FTSQUERY_OR:.  
92c0: 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74      zBuf = sqlit
92d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 4f 52  e3_mprintf("%zOR
92e0: 20 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20   ", zBuf);.     
92f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
9300: 66 28 20 7a 42 75 66 20 29 20 7a 42 75 66 20 3d  f( zBuf ) zBuf =
9310: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9320: 28 22 25 7a 7b 22 2c 20 7a 42 75 66 29 3b 0a 20  ("%z{", zBuf);. 
9330: 20 69 66 28 20 7a 42 75 66 20 29 20 7a 42 75 66   if( zBuf ) zBuf
9340: 20 3d 20 65 78 70 72 54 6f 53 74 72 69 6e 67 28   = exprToString(
9350: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 7a 42  pExpr->pLeft, zB
9360: 75 66 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 20  uf);.  if( zBuf 
9370: 29 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33  ) zBuf = sqlite3
9380: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 7d 20 7b 22  _mprintf("%z} {"
9390: 2c 20 7a 42 75 66 29 3b 0a 0a 20 20 69 66 28 20  , zBuf);..  if( 
93a0: 7a 42 75 66 20 29 20 7a 42 75 66 20 3d 20 65 78  zBuf ) zBuf = ex
93b0: 70 72 54 6f 53 74 72 69 6e 67 28 70 45 78 70 72  prToString(pExpr
93c0: 2d 3e 70 52 69 67 68 74 2c 20 7a 42 75 66 29 3b  ->pRight, zBuf);
93d0: 0a 20 20 69 66 28 20 7a 42 75 66 20 29 20 7a 42  .  if( zBuf ) zB
93e0: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
93f0: 69 6e 74 66 28 22 25 7a 7d 22 2c 20 7a 42 75 66  intf("%z}", zBuf
9400: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 42 75  );..  return zBu
9410: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
9420: 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
9430: 74 61 74 69 6f 6e 20 6f 66 20 61 20 73 63 61 6c  tation of a scal
9440: 61 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ar SQL function 
9450: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
9460: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
9470: 70 61 72 73 65 72 2e 20 49 74 20 73 68 6f 75 6c  parser. It shoul
9480: 64 20 62 65 20 63 61 6c 6c 65 64 20 61 73 20 66  d be called as f
9490: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
94a0: 66 74 73 33 5f 65 78 70 72 74 65 73 74 28 3c 74  fts3_exprtest(<t
94b0: 6f 6b 65 6e 69 7a 65 72 3e 2c 20 3c 65 78 70 72  okenizer>, <expr
94c0: 3e 2c 20 3c 63 6f 6c 75 6d 6e 20 31 3e 2c 20 2e  >, <column 1>, .
94d0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ..);.**.** The f
94e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 3c  irst argument, <
94f0: 74 6f 6b 65 6e 69 7a 65 72 3e 2c 20 69 73 20 74  tokenizer>, is t
9500: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
9510: 74 73 33 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73  ts3 tokenizer us
9520: 65 64 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20 74  ed.** to parse t
9530: 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
9540: 69 6f 6e 20 28 73 65 65 20 52 45 41 44 4d 45 2e  ion (see README.
9550: 74 6f 6b 65 6e 69 7a 65 72 73 29 2e 20 54 68 65  tokenizers). The
9560: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
9570: 0a 2a 2a 20 69 73 20 74 68 65 20 71 75 65 72 79  .** is the query
9580: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 70   expression to p
9590: 61 72 73 65 2e 20 45 61 63 68 20 73 75 62 73 65  arse. Each subse
95a0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 69  quent argument i
95b0: 73 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  s the name.** of
95c0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
95d0: 20 66 74 73 33 20 74 61 62 6c 65 20 74 68 61 74   fts3 table that
95e0: 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65   the query expre
95f0: 73 73 69 6f 6e 20 6d 61 79 20 72 65 66 65 72 20  ssion may refer 
9600: 74 6f 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  to..** For examp
9610: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  le:.**.**   SELE
9620: 43 54 20 66 74 73 33 5f 65 78 70 72 74 65 73 74  CT fts3_exprtest
9630: 28 27 73 69 6d 70 6c 65 27 2c 20 27 42 69 6c 6c  ('simple', 'Bill
9640: 20 63 6f 6c 32 3a 42 6c 6f 67 67 73 27 2c 20 27   col2:Bloggs', '
9650: 63 6f 6c 31 27 2c 20 27 63 6f 6c 32 27 29 3b 0a  col1', 'col2');.
9660: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
9670: 74 73 33 45 78 70 72 54 65 73 74 43 6f 6d 6d 6f  ts3ExprTestCommo
9680: 6e 28 0a 20 20 69 6e 74 20 62 52 65 62 61 6c 61  n(.  int bRebala
9690: 6e 63 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  nce,.  sqlite3_c
96a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
96b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
96c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
96d0: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
96e0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
96f0: 65 6e 69 7a 65 72 20 3d 20 30 3b 0a 20 20 69 6e  enizer = 0;.  in
9700: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 2a 61  t rc;.  char **a
9710: 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  zCol = 0;.  cons
9720: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 3b 0a 20  t char *zExpr;. 
9730: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 6e   int nExpr;.  in
9740: 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 69  t nCol;.  int ii
9750: 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45  ;.  Fts3Expr *pE
9760: 78 70 72 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75  xpr;.  char *zBu
9770: 66 20 3d 20 30 3b 0a 20 20 46 74 73 33 48 61 73  f = 0;.  Fts3Has
9780: 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74 73 33  h *pHash = (Fts3
9790: 48 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 75 73  Hash*)sqlite3_us
97a0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
97b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
97c0: 7a 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 30 3b 0a  zTokenizer = 0;.
97d0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
97e0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20  ;..  if( argc<3 
97f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9800: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9810: 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 22 55  ext, .        "U
9820: 73 61 67 65 3a 20 66 74 73 33 5f 65 78 70 72 74  sage: fts3_exprt
9830: 65 73 74 28 74 6f 6b 65 6e 69 7a 65 72 2c 20 65  est(tokenizer, e
9840: 78 70 72 2c 20 63 6f 6c 31 2c 20 2e 2e 2e 22 2c  xpr, col1, ...",
9850: 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 72   -1.    );.    r
9860: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 54  eturn;.  }..  zT
9870: 6f 6b 65 6e 69 7a 65 72 20 3d 20 28 63 6f 6e 73  okenizer = (cons
9880: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
9890: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
98a0: 30 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0]);.  rc = sqli
98b0: 74 65 33 46 74 73 33 49 6e 69 74 54 6f 6b 65 6e  te3Fts3InitToken
98c0: 69 7a 65 72 28 70 48 61 73 68 2c 20 7a 54 6f 6b  izer(pHash, zTok
98d0: 65 6e 69 7a 65 72 2c 20 26 70 54 6f 6b 65 6e 69  enizer, &pTokeni
98e0: 7a 65 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  zer, &zErr);.  i
98f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9900: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
9910: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
9920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
9930: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9940: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
9950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
9960: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9970: 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20  (context, zErr, 
9980: 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  -1);.    }.    s
9990: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
99a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
99b0: 20 7d 0a 0a 20 20 7a 45 78 70 72 20 3d 20 28 63   }..  zExpr = (c
99c0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
99d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
99e0: 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 45 78 70 72  rgv[1]);.  nExpr
99f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9a00: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
9a10: 0a 20 20 6e 43 6f 6c 20 3d 20 61 72 67 63 2d 32  .  nCol = argc-2
9a20: 3b 0a 20 20 61 7a 43 6f 6c 20 3d 20 28 63 68 61  ;.  azCol = (cha
9a30: 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  r **)sqlite3_mal
9a40: 6c 6f 63 28 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  loc(nCol*sizeof(
9a50: 63 68 61 72 20 2a 29 29 3b 0a 20 20 69 66 28 20  char *));.  if( 
9a60: 21 61 7a 43 6f 6c 20 29 7b 0a 20 20 20 20 73 71  !azCol ){.    sq
9a70: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9a80: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
9a90: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 70 72  );.    goto expr
9aa0: 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  test_out;.  }.  
9ab0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 6f  for(ii=0; ii<nCo
9ac0: 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61 7a  l; ii++){.    az
9ad0: 43 6f 6c 5b 69 69 5d 20 3d 20 28 63 68 61 72 20  Col[ii] = (char 
9ae0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9af0: 74 65 78 74 28 61 72 67 76 5b 69 69 2b 32 5d 29  text(argv[ii+2])
9b00: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52 65  ;.  }..  if( bRe
9b10: 62 61 6c 61 6e 63 65 20 29 7b 0a 20 20 20 20 63  balance ){.    c
9b20: 68 61 72 20 2a 7a 44 75 6d 6d 79 20 3d 20 30 3b  har *zDummy = 0;
9b30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9b40: 33 46 74 73 33 45 78 70 72 50 61 72 73 65 28 0a  3Fts3ExprParse(.
9b50: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a          pTokeniz
9b60: 65 72 2c 20 30 2c 20 61 7a 43 6f 6c 2c 20 30 2c  er, 0, azCol, 0,
9b70: 20 6e 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 7a 45 78   nCol, nCol, zEx
9b80: 70 72 2c 20 6e 45 78 70 72 2c 20 26 70 45 78 70  pr, nExpr, &pExp
9b90: 72 2c 20 26 7a 44 75 6d 6d 79 0a 20 20 20 20 29  r, &zDummy.    )
9ba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
9bb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
9bc0: 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Expr==0 );.    s
9bd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 75 6d  qlite3_free(zDum
9be0: 6d 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  my);.  }else{.  
9bf0: 20 20 72 63 20 3d 20 66 74 73 33 45 78 70 72 50    rc = fts3ExprP
9c00: 61 72 73 65 55 6e 62 61 6c 61 6e 63 65 64 28 0a  arseUnbalanced(.
9c10: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a          pTokeniz
9c20: 65 72 2c 20 30 2c 20 61 7a 43 6f 6c 2c 20 30 2c  er, 0, azCol, 0,
9c30: 20 6e 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 7a 45 78   nCol, nCol, zEx
9c40: 70 72 2c 20 6e 45 78 70 72 2c 20 26 70 45 78 70  pr, nExpr, &pExp
9c50: 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  r.    );.  }..  
9c60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9c70: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
9c80: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
9c90: 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65  ite3Fts3ExprFree
9ca0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  (pExpr);.    sql
9cb0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9cc0: 72 28 63 6f 6e 74 65 78 74 2c 20 22 45 72 72 6f  r(context, "Erro
9cd0: 72 20 70 61 72 73 69 6e 67 20 65 78 70 72 65 73  r parsing expres
9ce0: 73 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  sion", -1);.  }e
9cf0: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
9d00: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 21 28 7a 42  TE_NOMEM || !(zB
9d10: 75 66 20 3d 20 65 78 70 72 54 6f 53 74 72 69 6e  uf = exprToStrin
9d20: 67 28 70 45 78 70 72 2c 20 30 29 29 20 29 7b 0a  g(pExpr, 0)) ){.
9d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9d40: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
9d50: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
9d60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9d70: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
9d80: 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  t, zBuf, -1, SQL
9d90: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9db0: 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 0a 20 20 73  (zBuf);.  }..  s
9dc0: 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72  qlite3Fts3ExprFr
9dd0: 65 65 28 70 45 78 70 72 29 3b 0a 0a 65 78 70 72  ee(pExpr);..expr
9de0: 74 65 73 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20  test_out:.  if( 
9df0: 70 54 6f 6b 65 6e 69 7a 65 72 20 29 7b 0a 20 20  pTokenizer ){.  
9e00: 20 20 72 63 20 3d 20 70 54 6f 6b 65 6e 69 7a 65    rc = pTokenize
9e10: 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73  r->pModule->xDes
9e20: 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72 29  troy(pTokenizer)
9e30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
9e40: 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
9e50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
9e60: 45 78 70 72 54 65 73 74 28 0a 20 20 73 71 6c 69  ExprTest(.  sqli
9e70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
9e80: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
9e90: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
9ea0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 66 74  e **argv.){.  ft
9eb0: 73 33 45 78 70 72 54 65 73 74 43 6f 6d 6d 6f 6e  s3ExprTestCommon
9ec0: 28 30 2c 20 63 6f 6e 74 65 78 74 2c 20 61 72 67  (0, context, arg
9ed0: 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 73 74 61 74  c, argv);.}.stat
9ee0: 69 63 20 76 6f 69 64 20 66 74 73 33 45 78 70 72  ic void fts3Expr
9ef0: 54 65 73 74 52 65 62 61 6c 61 6e 63 65 28 0a 20  TestRebalance(. 
9f00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
9f10: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
9f20: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9f30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9f40: 0a 20 20 66 74 73 33 45 78 70 72 54 65 73 74 43  .  fts3ExprTestC
9f50: 6f 6d 6d 6f 6e 28 31 2c 20 63 6f 6e 74 65 78 74  ommon(1, context
9f60: 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
9f70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
9f80: 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65   the query expre
9f90: 73 73 69 6f 6e 20 70 61 72 73 65 72 20 74 65 73  ssion parser tes
9fa0: 74 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 33 5f  t function fts3_
9fb0: 65 78 70 72 74 65 73 74 28 29 20 0a 2a 2a 20 77  exprtest() .** w
9fc0: 69 74 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ith database con
9fd0: 6e 65 63 74 69 6f 6e 20 64 62 2e 20 0a 2a 2f 0a  nection db. .*/.
9fe0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 45  int sqlite3Fts3E
9ff0: 78 70 72 49 6e 69 74 54 65 73 74 49 6e 74 65 72  xprInitTestInter
a000: 66 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  face(sqlite3 *db
a010: 2c 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73  , Fts3Hash *pHas
a020: 68 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  h){.  int rc = s
a030: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
a040: 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
a050: 2c 20 22 66 74 73 33 5f 65 78 70 72 74 65 73 74  , "fts3_exprtest
a060: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
a070: 46 38 2c 20 28 76 6f 69 64 2a 29 70 48 61 73 68  F8, (void*)pHash
a080: 2c 20 66 74 73 33 45 78 70 72 54 65 73 74 2c 20  , fts3ExprTest, 
a090: 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
a0a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a0b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a0c0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
a0d0: 6e 28 64 62 2c 20 22 66 74 73 33 5f 65 78 70 72  n(db, "fts3_expr
a0e0: 74 65 73 74 5f 72 65 62 61 6c 61 6e 63 65 22 2c  test_rebalance",
a0f0: 20 0a 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51   .        -1, SQ
a100: 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
a110: 2a 29 70 48 61 73 68 2c 20 66 74 73 33 45 78 70  *)pHash, fts3Exp
a120: 72 54 65 73 74 52 65 62 61 6c 61 6e 63 65 2c 20  rTestRebalance, 
a130: 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
a140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a150: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
a160: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a170: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
a180: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a190: 46 54 53 33 29 20 2a 2f 0a                       FTS3) */.