/ Hex Artifact Content
Login

Artifact 5165c365cb5a035f5be8bb296f7aa3211d43e4ac:


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 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a   nConsumed = 0;.
1a50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
1a60: 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72  ts3OpenTokenizer
1a70: 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 50 61  (pTokenizer, pPa
1a80: 72 73 65 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 2c  rse->iLangid, z,
1a90: 20 6e 2c 20 26 70 43 75 72 73 6f 72 29 3b 0a 20   n, &pCursor);. 
1aa0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ab0: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1ac0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20  char *zToken;.  
1ad0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
1ae0: 2c 20 69 53 74 61 72 74 20 3d 20 30 2c 20 69 45  , iStart = 0, iE
1af0: 6e 64 20 3d 20 30 2c 20 69 50 6f 73 69 74 69 6f  nd = 0, iPositio
1b00: 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  n = 0;.    int n
1b10: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 2f 2a 20 74 6f 74 61 6c 20 73 70 61      /* total spa
1b40: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
1b50: 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64  /..    rc = pMod
1b60: 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 73  ule->xNext(pCurs
1b70: 6f 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  or, &zToken, &nT
1b80: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
1b90: 69 45 6e 64 2c 20 26 69 50 6f 73 69 74 69 6f 6e  iEnd, &iPosition
1ba0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 72 63 3d  );..    if( (rc=
1bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
1bc0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 20 26  ==SQLITE_DONE) &
1bd0: 26 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  & sqlite3_fts3_e
1be0: 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
1bf0: 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  s ){.      int i
1c00: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1c10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 69 53  SQLITE_DONE ) iS
1c20: 74 61 72 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tart = n;.      
1c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 69 53 74 61 72  for(i=0; i<iStar
1c40: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1c50: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 28 27 20 29   if( z[i]=='(' )
1c60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  {.          pPar
1c70: 73 65 2d 3e 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20  se->nNest++;.   
1c80: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
1c90: 45 78 70 72 50 61 72 73 65 28 70 50 61 72 73 65  ExprParse(pParse
1ca0: 2c 20 26 7a 5b 69 2b 31 5d 2c 20 6e 2d 69 2d 31  , &z[i+1], n-i-1
1cb0: 2c 20 26 70 52 65 74 2c 20 26 6e 43 6f 6e 73 75  , &pRet, &nConsu
1cc0: 6d 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  med);.          
1cd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ce0: 4b 20 26 26 20 21 70 52 65 74 20 29 7b 0a 20 20  K && !pRet ){.  
1cf0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1d00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d20: 20 20 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69    nConsumed = (i
1d30: 6e 74 29 28 69 20 2b 20 31 20 2b 20 6e 43 6f 6e  nt)(i + 1 + nCon
1d40: 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 20 20  sumed);.        
1d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d60: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1d70: 7a 5b 69 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20  z[i]==')' ){.   
1d80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  TE_DONE;.       
1da0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4e 65 73 74     pParse->nNest
1db0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  --;.          nC
1dc0: 6f 6e 73 75 6d 65 64 20 3d 20 69 2b 31 3b 0a 20  onsumed = i+1;. 
1dd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1de0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1e00: 20 6e 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 26 26   nConsumed==0 &&
1e10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e20: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  {.      nByte = 
1e30: 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29  sizeof(Fts3Expr)
1e40: 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 50 68   + sizeof(Fts3Ph
1e50: 72 61 73 65 29 20 2b 20 6e 54 6f 6b 65 6e 3b 0a  rase) + nToken;.
1e60: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
1e70: 73 33 45 78 70 72 20 2a 29 66 74 73 33 4d 61 6c  s3Expr *)fts3Mal
1e80: 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 29 3b 0a  locZero(nByte);.
1e90: 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20        if( !pRet 
1ea0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1eb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ed0: 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d     pRet->eType =
1ee0: 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
1ef0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
1f00: 70 50 68 72 61 73 65 20 3d 20 28 46 74 73 33 50  pPhrase = (Fts3P
1f10: 68 72 61 73 65 20 2a 29 26 70 52 65 74 5b 31 5d  hrase *)&pRet[1]
1f20: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
1f30: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 20  pPhrase->nToken 
1f40: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65  = 1;.        pRe
1f50: 74 2d 3e 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c  t->pPhrase->iCol
1f60: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
1f70: 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73      pRet->pPhras
1f80: 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 6e 20 3d  e->aToken[0].n =
1f90: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20   nToken;.       
1fa0: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e   pRet->pPhrase->
1fb0: 61 54 6f 6b 65 6e 5b 30 5d 2e 7a 20 3d 20 28 63  aToken[0].z = (c
1fc0: 68 61 72 20 2a 29 26 70 52 65 74 2d 3e 70 50 68  har *)&pRet->pPh
1fd0: 72 61 73 65 5b 31 5d 3b 0a 20 20 20 20 20 20 20  rase[1];.       
1fe0: 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e 70 50   memcpy(pRet->pP
1ff0: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  hrase->aToken[0]
2000: 2e 7a 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  .z, zToken, nTok
2010: 65 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  en);..        if
2020: 28 20 69 45 6e 64 3c 6e 20 26 26 20 7a 5b 69 45  ( iEnd<n && z[iE
2030: 6e 64 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  nd]=='*' ){.    
2040: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72        pRet->pPhr
2050: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 69  ase->aToken[0].i
2060: 73 50 72 65 66 69 78 20 3d 20 31 3b 0a 20 20 20  sPrefix = 1;.   
2070: 20 20 20 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20         iEnd++;. 
2080: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2090: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
20a0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
20b0: 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
20c0: 5f 70 61 72 65 6e 74 68 65 73 65 73 20 0a 20 20  _parentheses .  
20d0: 20 20 20 20 20 20 20 20 20 26 26 20 69 53 74 61           && iSta
20e0: 72 74 3e 30 20 26 26 20 7a 5b 69 53 74 61 72 74  rt>0 && z[iStart
20f0: 2d 31 5d 3d 3d 27 2d 27 20 0a 20 20 20 20 20 20  -1]=='-' .      
2100: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2110: 20 20 20 70 50 61 72 73 65 2d 3e 69 73 4e 6f 74     pParse->isNot
2120: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2130: 20 20 69 53 74 61 72 74 2d 2d 3b 0a 20 20 20 20    iStart--;.    
2140: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2150: 70 50 61 72 73 65 2d 3e 62 46 74 73 34 20 26 26  pParse->bFts4 &&
2160: 20 69 53 74 61 72 74 3e 30 20 26 26 20 7a 5b 69   iStart>0 && z[i
2170: 53 74 61 72 74 2d 31 5d 3d 3d 27 5e 27 20 29 7b  Start-1]=='^' ){
2180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
2190: 74 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b  t->pPhrase->aTok
21a0: 65 6e 5b 30 5d 2e 62 46 69 72 73 74 20 3d 20 31  en[0].bFirst = 1
21b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53  ;.            iS
21c0: 74 61 72 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  tart--;.        
21d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2200: 7d 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  }..      }.     
2210: 20 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 69 45 6e   nConsumed = iEn
2220: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d  d;.    }..    pM
2230: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43  odule->xClose(pC
2240: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 0a 20  ursor);.  }.  . 
2250: 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 6e   *pnConsumed = n
2260: 43 6f 6e 73 75 6d 65 64 3b 0a 20 20 2a 70 70 45  Consumed;.  *ppE
2270: 78 70 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65  xpr = pRet;.  re
2280: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2290: 2a 2a 20 45 6e 6c 61 72 67 65 20 61 20 6d 65 6d  ** Enlarge a mem
22a0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  ory allocation. 
22b0: 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   If an out-of-me
22c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
22d0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 74 68 65 6e 20  occurs,.** then 
22e0: 66 72 65 65 20 74 68 65 20 6f 6c 64 20 61 6c 6c  free the old all
22f0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ocation..*/.stat
2300: 69 63 20 76 6f 69 64 20 2a 66 74 73 33 52 65 61  ic void *fts3Rea
2310: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 6f 69 64 20  llocOrFree(void 
2320: 2a 70 4f 72 69 67 2c 20 69 6e 74 20 6e 4e 65 77  *pOrig, int nNew
2330: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20  ){.  void *pRet 
2340: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
2350: 63 28 70 4f 72 69 67 2c 20 6e 4e 65 77 29 3b 0a  c(pOrig, nNew);.
2360: 20 20 69 66 28 20 21 70 52 65 74 20 29 7b 0a 20    if( !pRet ){. 
2370: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2380: 70 4f 72 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65  pOrig);.  }.  re
2390: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
23a0: 0a 2a 2a 20 42 75 66 66 65 72 20 7a 49 6e 70 75  .** Buffer zInpu
23b0: 74 2c 20 6c 65 6e 67 74 68 20 6e 49 6e 70 75 74  t, length nInput
23c0: 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  , contains the c
23d0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 71 75 6f  ontents of a quo
23e0: 74 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  ted string.** th
23f0: 61 74 20 61 70 70 65 61 72 65 64 20 61 73 20 70  at appeared as p
2400: 61 72 74 20 6f 66 20 61 6e 20 66 74 73 33 20 71  art of an fts3 q
2410: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2e  uery expression.
2420: 20 4e 65 69 74 68 65 72 20 71 75 6f 74 65 20 63   Neither quote c
2430: 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 73 20 69  haracter.** is i
2440: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 62  ncluded in the b
2450: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
2460: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2470: 20 74 6f 6b 65 6e 69 7a 65 20 74 68 65 20 65 6e   tokenize the en
2480: 74 69 72 65 0a 2a 2a 20 69 6e 70 75 74 20 62 75  tire.** input bu
2490: 66 66 65 72 20 61 6e 64 20 63 72 65 61 74 65 20  ffer and create 
24a0: 61 6e 20 46 74 73 33 45 78 70 72 20 73 74 72 75  an Fts3Expr stru
24b0: 63 74 75 72 65 20 6f 66 20 74 79 70 65 20 46 54  cture of type FT
24c0: 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 0a 2a  SQUERY_PHRASE .*
24d0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
24e0: 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20   results..**.** 
24f0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
2500: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2510: 72 6e 65 64 20 61 6e 64 20 2a 70 70 45 78 70 72  rned and *ppExpr
2520: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
2530: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   the.** allocate
2540: 64 20 46 74 73 33 45 78 70 72 20 73 74 72 75 63  d Fts3Expr struc
2550: 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  ture. Otherwise,
2560: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
2570: 4f 4d 45 4d 20 28 6f 75 74 20 6f 66 20 6d 65 6d  OMEM (out of mem
2580: 6f 72 79 0a 2a 2a 20 65 72 72 6f 72 29 20 6f 72  ory.** error) or
2590: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 74   SQLITE_ERROR (t
25a0: 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 65 72 72 6f  okenization erro
25b0: 72 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  r) is returned a
25c0: 6e 64 20 2a 70 70 45 78 70 72 20 73 65 74 0a 2a  nd *ppExpr set.*
25d0: 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
25e0: 63 20 69 6e 74 20 67 65 74 4e 65 78 74 53 74 72  c int getNextStr
25f0: 69 6e 67 28 0a 20 20 50 61 72 73 65 43 6f 6e 74  ing(.  ParseCont
2600: 65 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20  ext *pParse,    
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2620: 2a 20 66 74 73 33 20 71 75 65 72 79 20 70 61 72  * fts3 query par
2630: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70  const char *zInp
2650: 75 74 2c 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20  ut, int nInput, 
2660: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2670: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73   string */.  Fts
2680: 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20  3Expr **ppExpr  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70       /* OUT: exp
26b0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
26c0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
26d0: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20  r *pTokenizer = 
26e0: 70 50 61 72 73 65 2d 3e 70 54 6f 6b 65 6e 69 7a  pParse->pTokeniz
26f0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f  er;.  sqlite3_to
2700: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
2710: 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  onst *pModule = 
2720: 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64  pTokenizer->pMod
2730: 75 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ule;.  int rc;. 
2740: 20 46 74 73 33 45 78 70 72 20 2a 70 20 3d 20 30   Fts3Expr *p = 0
2750: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
2760: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43  nizer_cursor *pC
2770: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 63 68 61  ursor = 0;.  cha
2780: 72 20 2a 7a 54 65 6d 70 20 3d 20 30 3b 0a 20 20  r *zTemp = 0;.  
2790: 69 6e 74 20 6e 54 65 6d 70 20 3d 20 30 3b 0a 0a  int nTemp = 0;..
27a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 70 61    const int nSpa
27b0: 63 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  ce = sizeof(Fts3
27c0: 45 78 70 72 29 20 2b 20 73 69 7a 65 6f 66 28 46  Expr) + sizeof(F
27d0: 74 73 33 50 68 72 61 73 65 29 3b 0a 20 20 69 6e  ts3Phrase);.  in
27e0: 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a 20  t nToken = 0;.. 
27f0: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 46 74   /* The final Ft
2800: 73 33 45 78 70 72 20 64 61 74 61 20 73 74 72 75  s3Expr data stru
2810: 63 74 75 72 65 2c 20 69 6e 63 6c 75 64 69 6e 67  cture, including
2820: 20 74 68 65 20 46 74 73 33 50 68 72 61 73 65 2c   the Fts3Phrase,
2830: 0a 20 20 2a 2a 20 46 74 73 33 50 68 72 61 73 65  .  ** Fts3Phrase
2840: 54 6f 6b 65 6e 20 73 74 72 75 63 74 75 72 65 73  Token structures
2850: 20 74 6f 6b 65 6e 20 62 75 66 66 65 72 73 20 61   token buffers a
2860: 72 65 20 61 6c 6c 20 73 74 6f 72 65 64 20 61 73  re all stored as
2870: 20 61 20 73 69 6e 67 6c 65 20 0a 20 20 2a 2a 20   a single .  ** 
2880: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 6f 20 74 68  allocation so th
2890: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
28a0: 6e 20 63 61 6e 20 62 65 20 66 72 65 65 64 20 77  n can be freed w
28b0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
28c0: 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  l to.  ** sqlite
28d0: 33 5f 66 72 65 65 28 29 2e 20 53 65 74 74 69 6e  3_free(). Settin
28e0: 67 20 74 68 69 73 20 75 70 20 72 65 71 75 69 72  g this up requir
28f0: 65 73 20 61 20 74 77 6f 20 70 61 73 73 20 61 70  es a two pass ap
2900: 70 72 6f 61 63 68 2e 0a 20 20 2a 2a 0a 20 20 2a  proach..  **.  *
2910: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 73 73  * The first pass
2920: 2c 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  , in the block b
2930: 65 6c 6f 77 2c 20 75 73 65 73 20 61 20 74 6f 6b  elow, uses a tok
2940: 65 6e 69 7a 65 72 20 63 75 72 73 6f 72 20 74 6f  enizer cursor to
2950: 20 69 74 65 72 61 74 65 0a 20 20 2a 2a 20 74 68   iterate.  ** th
2960: 72 6f 75 67 68 20 74 68 65 20 74 6f 6b 65 6e 73  rough the tokens
2970: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
2980: 6f 6e 2e 20 54 68 69 73 20 70 61 73 73 20 75 73  on. This pass us
2990: 65 73 20 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72  es fts3ReallocOr
29a0: 46 72 65 65 28 29 0a 20 20 2a 2a 20 74 6f 20 61  Free().  ** to a
29b0: 73 73 65 6d 62 6c 65 20 64 61 74 61 20 69 6e 20  ssemble data in 
29c0: 74 77 6f 20 64 79 6e 61 6d 69 63 20 62 75 66 66  two dynamic buff
29d0: 65 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ers:.  **.  **  
29e0: 20 42 75 66 66 65 72 20 70 3a 20 50 6f 69 6e 74   Buffer p: Point
29f0: 73 20 74 6f 20 74 68 65 20 46 74 73 33 45 78 70  s to the Fts3Exp
2a00: 72 20 73 74 72 75 63 74 75 72 65 2c 20 66 6f 6c  r structure, fol
2a10: 6c 6f 77 65 64 20 62 79 20 74 68 65 20 46 74 73  lowed by the Fts
2a20: 33 50 68 72 61 73 65 0a 20 20 2a 2a 20 20 20 20  3Phrase.  **    
2a30: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 75           structu
2a40: 72 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  re, followed by 
2a50: 74 68 65 20 61 72 72 61 79 20 6f 66 20 46 74 73  the array of Fts
2a60: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 0a 20 20  3PhraseToken .  
2a70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  **             s
2a80: 74 72 75 63 74 75 72 65 73 2e 20 54 68 69 73 20  tructures. This 
2a90: 70 61 73 73 20 6f 6e 6c 79 20 70 6f 70 75 6c 61  pass only popula
2aa0: 74 65 73 20 74 68 65 20 46 74 73 33 50 68 72 61  tes the Fts3Phra
2ab0: 73 65 54 6f 6b 65 6e 20 61 72 72 61 79 2e 0a 20  seToken array.. 
2ac0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 75 66 66 65   **.  **   Buffe
2ad0: 72 20 7a 54 65 6d 70 3a 20 43 6f 6e 74 61 69 6e  r zTemp: Contain
2ae0: 73 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  s copies of all 
2af0: 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tokens..  **.  *
2b00: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 73  * The second pas
2b10: 73 2c 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  s, in the block 
2b20: 74 68 61 74 20 62 65 67 69 6e 73 20 22 69 66 28  that begins "if(
2b30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2b40: 20 29 22 20 62 65 6c 6f 77 2c 0a 20 20 2a 2a 20   )" below,.  ** 
2b50: 61 70 70 65 6e 64 73 20 62 75 66 66 65 72 20 7a  appends buffer z
2b60: 54 65 6d 70 20 74 6f 20 62 75 66 66 65 72 20 70  Temp to buffer p
2b70: 2c 20 61 6e 64 20 66 69 6c 6c 73 20 69 6e 20 74  , and fills in t
2b80: 68 65 20 46 74 73 33 45 78 70 72 20 61 6e 64 20  he Fts3Expr and 
2b90: 46 74 73 33 50 68 72 61 73 65 0a 20 20 2a 2a 20  Fts3Phrase.  ** 
2ba0: 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20 2a 2f  structures..  */
2bb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
2bc0: 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72  ts3OpenTokenizer
2bd0: 28 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a  (.      pTokeniz
2be0: 65 72 2c 20 70 50 61 72 73 65 2d 3e 69 4c 61 6e  er, pParse->iLan
2bf0: 67 69 64 2c 20 7a 49 6e 70 75 74 2c 20 6e 49 6e  gid, zInput, nIn
2c00: 70 75 74 2c 20 26 70 43 75 72 73 6f 72 29 3b 0a  put, &pCursor);.
2c10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
2c30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
2c40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2c50: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ii++){.      con
2c60: 73 74 20 63 68 61 72 20 2a 7a 42 79 74 65 3b 0a  st char *zByte;.
2c70: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
2c80: 3d 20 30 2c 20 69 42 65 67 69 6e 20 3d 20 30 2c  = 0, iBegin = 0,
2c90: 20 69 45 6e 64 20 3d 20 30 2c 20 69 50 6f 73 20   iEnd = 0, iPos 
2ca0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2cb0: 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
2cc0: 43 75 72 73 6f 72 2c 20 26 7a 42 79 74 65 2c 20  Cursor, &zByte, 
2cd0: 26 6e 42 79 74 65 2c 20 26 69 42 65 67 69 6e 2c  &nByte, &iBegin,
2ce0: 20 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 3b 0a   &iEnd, &iPos);.
2cf0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d10: 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
2d20: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 0a 20 20 20  en *pToken;..   
2d30: 20 20 20 20 20 70 20 3d 20 66 74 73 33 52 65 61       p = fts3Rea
2d40: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2c 20 6e 53  llocOrFree(p, nS
2d50: 70 61 63 65 20 2b 20 69 69 2a 73 69 7a 65 6f 66  pace + ii*sizeof
2d60: 28 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e  (Fts3PhraseToken
2d70: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
2d80: 21 70 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  !p ) goto no_mem
2d90: 3b 0a 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  ;..        zTemp
2da0: 20 3d 20 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72   = fts3ReallocOr
2db0: 46 72 65 65 28 7a 54 65 6d 70 2c 20 6e 54 65 6d  Free(zTemp, nTem
2dc0: 70 20 2b 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  p + nByte);.    
2dd0: 20 20 20 20 69 66 28 20 21 7a 54 65 6d 70 20 29      if( !zTemp )
2de0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20   goto no_mem;.. 
2df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2e00: 54 6f 6b 65 6e 3d 3d 69 69 20 29 3b 0a 20 20 20  Token==ii );.   
2e10: 20 20 20 20 20 70 54 6f 6b 65 6e 20 3d 20 26 28       pToken = &(
2e20: 28 46 74 73 33 50 68 72 61 73 65 20 2a 29 28 26  (Fts3Phrase *)(&
2e30: 70 5b 31 5d 29 29 2d 3e 61 54 6f 6b 65 6e 5b 69  p[1]))->aToken[i
2e40: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  i];.        mems
2e50: 65 74 28 70 54 6f 6b 65 6e 2c 20 30 2c 20 73 69  et(pToken, 0, si
2e60: 7a 65 6f 66 28 46 74 73 33 50 68 72 61 73 65 54  zeof(Fts3PhraseT
2e70: 6f 6b 65 6e 29 29 3b 0a 0a 20 20 20 20 20 20 20  oken));..       
2e80: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 6e   memcpy(&zTemp[n
2e90: 54 65 6d 70 5d 2c 20 7a 42 79 74 65 2c 20 6e 42  Temp], zByte, nB
2ea0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 54  yte);.        nT
2eb0: 65 6d 70 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20  emp += nByte;.. 
2ec0: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e         pToken->n
2ed0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
2ee0: 20 20 70 54 6f 6b 65 6e 2d 3e 69 73 50 72 65 66    pToken->isPref
2ef0: 69 78 20 3d 20 28 69 45 6e 64 3c 6e 49 6e 70 75  ix = (iEnd<nInpu
2f00: 74 20 26 26 20 7a 49 6e 70 75 74 5b 69 45 6e 64  t && zInput[iEnd
2f10: 5d 3d 3d 27 2a 27 29 3b 0a 20 20 20 20 20 20 20  ]=='*');.       
2f20: 20 70 54 6f 6b 65 6e 2d 3e 62 46 69 72 73 74 20   pToken->bFirst 
2f30: 3d 20 28 69 42 65 67 69 6e 3e 30 20 26 26 20 7a  = (iBegin>0 && z
2f40: 49 6e 70 75 74 5b 69 42 65 67 69 6e 2d 31 5d 3d  Input[iBegin-1]=
2f50: 3d 27 5e 27 29 3b 0a 20 20 20 20 20 20 20 20 6e  ='^');.        n
2f60: 54 6f 6b 65 6e 20 3d 20 69 69 2b 31 3b 0a 20 20  Token = ii+1;.  
2f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f80: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
2f90: 28 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  (pCursor);.    p
2fa0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 7d 0a  Cursor = 0;.  }.
2fb0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fc0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 69 6e  E_DONE ){.    in
2fd0: 74 20 6a 6a 3b 0a 20 20 20 20 63 68 61 72 20 2a  t jj;.    char *
2fe0: 7a 42 75 66 20 3d 20 30 3b 0a 0a 20 20 20 20 70  zBuf = 0;..    p
2ff0: 20 3d 20 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72   = fts3ReallocOr
3000: 46 72 65 65 28 70 2c 20 6e 53 70 61 63 65 20 2b  Free(p, nSpace +
3010: 20 6e 54 6f 6b 65 6e 2a 73 69 7a 65 6f 66 28 46   nToken*sizeof(F
3020: 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 29 20  ts3PhraseToken) 
3030: 2b 20 6e 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  + nTemp);.    if
3040: 28 20 21 70 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  ( !p ) goto no_m
3050: 65 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  em;.    memset(p
3060: 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 26 28 28  , 0, (char *)&((
3070: 28 46 74 73 33 50 68 72 61 73 65 20 2a 29 26 70  (Fts3Phrase *)&p
3080: 5b 31 5d 29 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 29  [1])->aToken[0])
3090: 2d 28 63 68 61 72 20 2a 29 70 29 3b 0a 20 20 20  -(char *)p);.   
30a0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 51   p->eType = FTSQ
30b0: 55 45 52 59 5f 50 48 52 41 53 45 3b 0a 20 20 20  UERY_PHRASE;.   
30c0: 20 70 2d 3e 70 50 68 72 61 73 65 20 3d 20 28 46   p->pPhrase = (F
30d0: 74 73 33 50 68 72 61 73 65 20 2a 29 26 70 5b 31  ts3Phrase *)&p[1
30e0: 5d 3b 0a 20 20 20 20 70 2d 3e 70 50 68 72 61 73  ];.    p->pPhras
30f0: 65 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61  e->iColumn = pPa
3100: 72 73 65 2d 3e 69 44 65 66 61 75 6c 74 43 6f 6c  rse->iDefaultCol
3110: 3b 0a 20 20 20 20 70 2d 3e 70 50 68 72 61 73 65  ;.    p->pPhrase
3120: 2d 3e 6e 54 6f 6b 65 6e 20 3d 20 6e 54 6f 6b 65  ->nToken = nToke
3130: 6e 3b 0a 0a 20 20 20 20 7a 42 75 66 20 3d 20 28  n;..    zBuf = (
3140: 63 68 61 72 20 2a 29 26 70 2d 3e 70 50 68 72 61  char *)&p->pPhra
3150: 73 65 2d 3e 61 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  se->aToken[nToke
3160: 6e 5d 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d  n];.    if( zTem
3170: 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
3180: 79 28 7a 42 75 66 2c 20 7a 54 65 6d 70 2c 20 6e  y(zBuf, zTemp, n
3190: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
31a0: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
31b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31c0: 20 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70     assert( nTemp
31d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ==0 );.    }..  
31e0: 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
31f0: 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
3200: 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  n; jj++){.      
3210: 70 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b  p->pPhrase->aTok
3220: 65 6e 5b 6a 6a 5d 2e 7a 20 3d 20 7a 42 75 66 3b  en[jj].z = zBuf;
3230: 0a 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 70  .      zBuf += p
3240: 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ->pPhrase->aToke
3250: 6e 5b 6a 6a 5d 2e 6e 3b 0a 20 20 20 20 7d 0a 20  n[jj].n;.    }. 
3260: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
3270: 4b 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 45 78 70  K;.  }..  *ppExp
3280: 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
3290: 72 63 3b 0a 6e 6f 5f 6d 65 6d 3a 0a 0a 20 20 69  rc;.no_mem:..  i
32a0: 66 28 20 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  f( pCursor ){.  
32b0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
32c0: 65 28 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  e(pCursor);.  }.
32d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
32e0: 54 65 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Temp);.  sqlite3
32f0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 2a 70 70 45  _free(p);.  *ppE
3300: 78 70 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  xpr = 0;.  retur
3310: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
3320: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  }../*.** The out
3330: 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70  put variable *pp
3340: 45 78 70 72 20 69 73 20 70 6f 70 75 6c 61 74 65  Expr is populate
3350: 64 20 77 69 74 68 20 61 6e 20 61 6c 6c 6f 63 61  d with an alloca
3360: 74 65 64 20 46 74 73 33 45 78 70 72 20 0a 2a 2a  ted Fts3Expr .**
3370: 20 73 74 72 75 63 74 75 72 65 2c 20 6f 72 20 73   structure, or s
3380: 65 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 65  et to 0 if the e
3390: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
33a0: 62 75 66 66 65 72 20 69 73 20 72 65 61 63 68 65  buffer is reache
33b0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  d..**.** Returns
33c0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
33d0: 20 63 6f 64 65 2e 20 53 51 4c 49 54 45 5f 4f 4b   code. SQLITE_OK
33e0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
33f0: 6f 72 6b 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  orks, SQLITE_NOM
3400: 45 4d 0a 2a 2a 20 69 66 20 61 20 6d 61 6c 6c 6f  EM.** if a mallo
3410: 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
3420: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52 4f  , or SQLITE_ERRO
3430: 52 20 69 66 20 61 20 70 61 72 73 65 20 65 72 72  R if a parse err
3440: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
3450: 64 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  d..** If SQLITE_
3460: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65  ERROR is returne
3470: 64 2c 20 70 43 6f 6e 74 65 78 74 20 69 73 20 70  d, pContext is p
3480: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
3490: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
34a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
34b0: 74 4e 65 78 74 4e 6f 64 65 28 0a 20 20 50 61 72  tNextNode(.  Par
34c0: 73 65 43 6f 6e 74 65 78 74 20 2a 70 50 61 72 73  seContext *pPars
34d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
34e0: 20 20 20 20 20 2f 2a 20 66 74 73 33 20 71 75 65       /* fts3 que
34f0: 72 79 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  ry parse context
3500: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3510: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f   Input string */
3540: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 70 70  .  Fts3Expr **pp
3550: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
3560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
3570: 54 3a 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  T: expression */
3580: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6e 73 75 6d  .  int *pnConsum
3590: 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
35a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
35b0: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  T: Number of byt
35c0: 65 73 20 63 6f 6e 73 75 6d 65 64 20 2a 2f 0a 29  es consumed */.)
35d0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
35e0: 20 73 74 72 75 63 74 20 46 74 73 33 4b 65 79 77   struct Fts3Keyw
35f0: 6f 72 64 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ord {.    char *
3600: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 2f 2a 20 4b 65 79 77 6f 72 64 20 74 65 78 74 20  /* Keyword text 
3630: 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
3640: 63 68 61 72 20 6e 3b 20 20 20 20 20 20 20 20 20  char n;         
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3660: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
3670: 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 75 6e 73  yword */.    uns
3680: 69 67 6e 65 64 20 63 68 61 72 20 70 61 72 65 6e  igned char paren
3690: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
36a0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c 69 64     /* Only valid
36b0: 20 69 6e 20 70 61 72 65 6e 20 6d 6f 64 65 20 2a   in paren mode *
36c0: 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
36d0: 68 61 72 20 65 54 79 70 65 3b 20 20 20 20 20 20  har eType;      
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
36f0: 65 79 77 6f 72 64 20 63 6f 64 65 20 2a 2f 0a 20  eyword code */. 
3700: 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20   } aKeyword[] = 
3710: 7b 0a 20 20 20 20 7b 20 22 4f 52 22 20 2c 20 20  {.    { "OR" ,  
3720: 32 2c 20 30 2c 20 46 54 53 51 55 45 52 59 5f 4f  2, 0, FTSQUERY_O
3730: 52 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 41 4e  R   },.    { "AN
3740: 44 22 2c 20 20 33 2c 20 31 2c 20 46 54 53 51 55  D",  3, 1, FTSQU
3750: 45 52 59 5f 41 4e 44 20 20 7d 2c 0a 20 20 20 20  ERY_AND  },.    
3760: 7b 20 22 4e 4f 54 22 2c 20 20 33 2c 20 31 2c 20  { "NOT",  3, 1, 
3770: 46 54 53 51 55 45 52 59 5f 4e 4f 54 20 20 7d 2c  FTSQUERY_NOT  },
3780: 0a 20 20 20 20 7b 20 22 4e 45 41 52 22 2c 20 34  .    { "NEAR", 4
3790: 2c 20 30 2c 20 46 54 53 51 55 45 52 59 5f 4e 45  , 0, FTSQUERY_NE
37a0: 41 52 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  AR }.  };.  int 
37b0: 69 69 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ii;.  int iCol;.
37c0: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 6e 3b 0a 20    int iColLen;. 
37d0: 20 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 33 45   int rc;.  Fts3E
37e0: 78 70 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a  xpr *pRet = 0;..
37f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
3800: 6e 70 75 74 20 3d 20 7a 3b 0a 20 20 69 6e 74 20  nput = z;.  int 
3810: 6e 49 6e 70 75 74 20 3d 20 6e 3b 0a 0a 20 20 70  nInput = n;..  p
3820: 50 61 72 73 65 2d 3e 69 73 4e 6f 74 20 3d 20 30  Parse->isNot = 0
3830: 3b 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65  ;..  /* Skip ove
3840: 72 20 61 6e 79 20 77 68 69 74 65 73 70 61 63 65  r any whitespace
3850: 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   before checking
3860: 20 66 6f 72 20 61 20 6b 65 79 77 6f 72 64 2c 20   for a keyword, 
3870: 61 6e 20 6f 70 65 6e 20 6f 72 0a 20 20 2a 2a 20  an open or.  ** 
3880: 63 6c 6f 73 65 20 62 72 61 63 6b 65 74 2c 20 6f  close bracket, o
3890: 72 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  r a quoted strin
38a0: 67 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  g. .  */.  while
38b0: 28 20 6e 49 6e 70 75 74 3e 30 20 26 26 20 66 74  ( nInput>0 && ft
38c0: 73 33 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75  s3isspace(*zInpu
38d0: 74 29 20 29 7b 0a 20 20 20 20 6e 49 6e 70 75 74  t) ){.    nInput
38e0: 2d 2d 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b  --;.    zInput++
38f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 49 6e 70  ;.  }.  if( nInp
3900: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ut==0 ){.    ret
3910: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
3920: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
3930: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
3940: 20 77 69 74 68 20 61 20 6b 65 79 77 6f 72 64 2e   with a keyword.
3950: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
3960: 69 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28  ii<(int)(sizeof(
3970: 61 4b 65 79 77 6f 72 64 29 2f 73 69 7a 65 6f 66  aKeyword)/sizeof
3980: 28 73 74 72 75 63 74 20 46 74 73 33 4b 65 79 77  (struct Fts3Keyw
3990: 6f 72 64 29 29 3b 20 69 69 2b 2b 29 7b 0a 20 20  ord)); ii++){.  
39a0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 46    const struct F
39b0: 74 73 33 4b 65 79 77 6f 72 64 20 2a 70 4b 65 79  ts3Keyword *pKey
39c0: 20 3d 20 26 61 4b 65 79 77 6f 72 64 5b 69 69 5d   = &aKeyword[ii]
39d0: 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4b 65 79  ;..    if( (pKey
39e0: 2d 3e 70 61 72 65 6e 4f 6e 6c 79 20 26 20 7e 73  ->parenOnly & ~s
39f0: 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62  qlite3_fts3_enab
3a00: 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 29 21  le_parentheses)!
3a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  =0 ){.      cont
3a20: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
3a30: 20 69 66 28 20 6e 49 6e 70 75 74 3e 3d 70 4b 65   if( nInput>=pKe
3a40: 79 2d 3e 6e 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  y->n && 0==memcm
3a50: 70 28 7a 49 6e 70 75 74 2c 20 70 4b 65 79 2d 3e  p(zInput, pKey->
3a60: 7a 2c 20 70 4b 65 79 2d 3e 6e 29 20 29 7b 0a 20  z, pKey->n) ){. 
3a70: 20 20 20 20 20 69 6e 74 20 6e 4e 65 61 72 20 3d       int nNear =
3a80: 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 44 45 46   SQLITE_FTS3_DEF
3a90: 41 55 4c 54 5f 4e 45 41 52 5f 50 41 52 41 4d 3b  AULT_NEAR_PARAM;
3aa0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20  .      int nKey 
3ab0: 3d 20 70 4b 65 79 2d 3e 6e 3b 0a 20 20 20 20 20  = pKey->n;.     
3ac0: 20 63 68 61 72 20 63 4e 65 78 74 3b 0a 0a 20 20   char cNext;..  
3ad0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
3ae0: 73 20 61 20 22 4e 45 41 52 22 20 6b 65 79 77 6f  s a "NEAR" keywo
3af0: 72 64 2c 20 63 68 65 63 6b 20 66 6f 72 20 61 6e  rd, check for an
3b00: 20 65 78 70 6c 69 63 69 74 20 6e 65 61 72 6e 65   explicit nearne
3b10: 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ss. */.      if(
3b20: 20 70 4b 65 79 2d 3e 65 54 79 70 65 3d 3d 46 54   pKey->eType==FT
3b30: 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a 20  SQUERY_NEAR ){. 
3b40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
3b50: 4b 65 79 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  Key==4 );.      
3b60: 20 20 69 66 28 20 7a 49 6e 70 75 74 5b 34 5d 3d    if( zInput[4]=
3b70: 3d 27 2f 27 20 26 26 20 7a 49 6e 70 75 74 5b 35  ='/' && zInput[5
3b80: 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 70 75 74  ]>='0' && zInput
3b90: 5b 35 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20  [5]<='9' ){.    
3ba0: 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 30 3b        nNear = 0;
3bb0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6e  .          for(n
3bc0: 4b 65 79 3d 35 3b 20 7a 49 6e 70 75 74 5b 6e 4b  Key=5; zInput[nK
3bd0: 65 79 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 70  ey]>='0' && zInp
3be0: 75 74 5b 6e 4b 65 79 5d 3c 3d 27 39 27 3b 20 6e  ut[nKey]<='9'; n
3bf0: 4b 65 79 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Key++){.        
3c00: 20 20 20 20 6e 4e 65 61 72 20 3d 20 6e 4e 65 61      nNear = nNea
3c10: 72 20 2a 20 31 30 20 2b 20 28 7a 49 6e 70 75 74  r * 10 + (zInput
3c20: 5b 6e 4b 65 79 5d 20 2d 20 27 30 27 29 3b 0a 20  [nKey] - '0');. 
3c30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3c40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
3c50: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
3c60: 6f 69 6e 74 20 74 68 69 73 20 69 73 20 70 72 6f  oint this is pro
3c70: 62 61 62 6c 79 20 61 20 6b 65 79 77 6f 72 64 2e  bably a keyword.
3c80: 20 42 75 74 20 66 6f 72 20 74 68 61 74 20 74 6f   But for that to
3c90: 20 62 65 20 74 72 75 65 2c 0a 20 20 20 20 20 20   be true,.      
3ca0: 2a 2a 20 74 68 65 20 6e 65 78 74 20 62 79 74 65  ** the next byte
3cb0: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 69   must contain ei
3cc0: 74 68 65 72 20 77 68 69 74 65 73 70 61 63 65 2c  ther whitespace,
3cd0: 20 61 6e 20 6f 70 65 6e 20 6f 72 20 63 6c 6f 73   an open or clos
3ce0: 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e  e.      ** paren
3cf0: 74 68 65 73 69 73 2c 20 61 20 71 75 6f 74 65 20  thesis, a quote 
3d00: 63 68 61 72 61 63 74 65 72 2c 20 6f 72 20 45 4f  character, or EO
3d10: 46 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  F. .      */.   
3d20: 20 20 20 63 4e 65 78 74 20 3d 20 7a 49 6e 70 75     cNext = zInpu
3d30: 74 5b 6e 4b 65 79 5d 3b 0a 20 20 20 20 20 20 69  t[nKey];.      i
3d40: 66 28 20 66 74 73 33 69 73 73 70 61 63 65 28 63  f( fts3isspace(c
3d50: 4e 65 78 74 29 20 0a 20 20 20 20 20 20 20 7c 7c  Next) .       ||
3d60: 20 63 4e 65 78 74 3d 3d 27 22 27 20 7c 7c 20 63   cNext=='"' || c
3d70: 4e 65 78 74 3d 3d 27 28 27 20 7c 7c 20 63 4e 65  Next=='(' || cNe
3d80: 78 74 3d 3d 27 29 27 20 7c 7c 20 63 4e 65 78 74  xt==')' || cNext
3d90: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
3da0: 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73       pRet = (Fts
3db0: 33 45 78 70 72 20 2a 29 66 74 73 33 4d 61 6c 6c  3Expr *)fts3Mall
3dc0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 46 74  ocZero(sizeof(Ft
3dd0: 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  s3Expr));.      
3de0: 20 20 69 66 28 20 21 70 52 65 74 20 29 7b 0a 20    if( !pRet ){. 
3df0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3e00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3e20: 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 70 4b  pRet->eType = pK
3e30: 65 79 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20  ey->eType;.     
3e40: 20 20 20 70 52 65 74 2d 3e 6e 4e 65 61 72 20 3d     pRet->nNear =
3e50: 20 6e 4e 65 61 72 3b 0a 20 20 20 20 20 20 20 20   nNear;.        
3e60: 2a 70 70 45 78 70 72 20 3d 20 70 52 65 74 3b 0a  *ppExpr = pRet;.
3e70: 20 20 20 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75          *pnConsu
3e80: 6d 65 64 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e  med = (int)((zIn
3e90: 70 75 74 20 2d 20 7a 29 20 2b 20 6e 4b 65 79 29  put - z) + nKey)
3ea0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3eb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3ec0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 75    }..      /* Tu
3ed0: 72 6e 73 20 6f 75 74 20 74 68 61 74 20 77 61 73  rns out that was
3ee0: 6e 27 74 20 61 20 6b 65 79 77 6f 72 64 20 61 66  n't a keyword af
3ef0: 74 65 72 20 61 6c 6c 2e 20 54 68 69 73 20 68 61  ter all. This ha
3f00: 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20  ppens if the.   
3f10: 20 20 20 2a 2a 20 75 73 65 72 20 68 61 73 20 73     ** user has s
3f20: 75 70 70 6c 69 65 64 20 61 20 74 6f 6b 65 6e 20  upplied a token 
3f30: 73 75 63 68 20 61 73 20 22 4f 52 61 63 6c 65 22  such as "ORacle"
3f40: 2e 20 43 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 20  . Continue..    
3f50: 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    */.    }.  }..
3f60: 20 20 2f 2a 20 53 65 65 20 69 66 20 77 65 20 61    /* See if we a
3f70: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
3f80: 61 20 71 75 6f 74 65 64 20 70 68 72 61 73 65 2e  a quoted phrase.
3f90: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
3fa0: 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
3fb0: 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
3fc0: 6c 6f 73 69 6e 67 20 71 75 6f 74 65 20 61 6e 64  losing quote and
3fd0: 20 70 61 73 73 20 74 68 65 20 77 68 6f 6c 65 20   pass the whole 
3fe0: 73 74 72 69 6e 67 20 74 6f 20 67 65 74 4e 65 78  string to getNex
3ff0: 74 53 74 72 69 6e 67 28 29 0a 20 20 2a 2a 20 66  tString().  ** f
4000: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 54  or processing. T
4010: 68 69 73 20 69 73 20 65 61 73 79 20 74 6f 20 64  his is easy to d
4020: 6f 2c 20 61 73 20 66 74 73 33 20 68 61 73 20 6e  o, as fts3 has n
4030: 6f 20 73 79 6e 74 61 78 20 66 6f 72 20 65 73 63  o syntax for esc
4040: 61 70 69 6e 67 0a 20 20 2a 2a 20 61 20 71 75 6f  aping.  ** a quo
4050: 74 65 20 63 68 61 72 61 63 74 65 72 20 65 6d 62  te character emb
4060: 65 64 64 65 64 20 69 6e 20 61 20 73 74 72 69 6e  edded in a strin
4070: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 7a  g..  */.  if( *z
4080: 49 6e 70 75 74 3d 3d 27 22 27 20 29 7b 0a 20 20  Input=='"' ){.  
4090: 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
40a0: 49 6e 70 75 74 20 26 26 20 7a 49 6e 70 75 74 5b  Input && zInput[
40b0: 69 69 5d 21 3d 27 22 27 3b 20 69 69 2b 2b 29 3b  ii]!='"'; ii++);
40c0: 0a 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64  .    *pnConsumed
40d0: 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75 74   = (int)((zInput
40e0: 20 2d 20 7a 29 20 2b 20 69 69 20 2b 20 31 29 3b   - z) + ii + 1);
40f0: 0a 20 20 20 20 69 66 28 20 69 69 3d 3d 6e 49 6e  .    if( ii==nIn
4100: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  put ){.      ret
4110: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4130: 72 6e 20 67 65 74 4e 65 78 74 53 74 72 69 6e 67  rn getNextString
4140: 28 70 50 61 72 73 65 2c 20 26 7a 49 6e 70 75 74  (pParse, &zInput
4150: 5b 31 5d 2c 20 69 69 2d 31 2c 20 70 70 45 78 70  [1], ii-1, ppExp
4160: 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49  r);.  }...  /* I
4170: 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
4180: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
4190: 68 69 73 20 6d 75 73 74 20 62 65 20 61 20 72 65  his must be a re
41a0: 67 75 6c 61 72 20 74 6f 6b 65 6e 2c 20 6f 72 20  gular token, or 
41b0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  .  ** the end of
41c0: 20 74 68 65 20 69 6e 70 75 74 2e 20 52 65 61 64   the input. Read
41d0: 20 61 20 72 65 67 75 6c 61 72 20 74 6f 6b 65 6e   a regular token
41e0: 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
41f0: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 2a  e3_tokenizer.  *
4200: 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 42 65 66  * interface. Bef
4210: 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20 66 69  ore doing so, fi
4220: 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 65 72  gure out if ther
4230: 65 20 69 73 20 61 6e 20 65 78 70 6c 69 63 69 74  e is an explicit
4240: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65  .  ** column spe
4250: 63 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 74  cifier for the t
4260: 6f 6b 65 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  oken. .  **.  **
4270: 20 54 4f 44 4f 3a 20 53 74 72 61 6e 67 65 6c 79   TODO: Strangely
4280: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
4290: 69 62 6c 65 20 74 6f 20 61 73 73 6f 63 69 61 74  ible to associat
42a0: 65 20 61 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69  e a column speci
42b0: 66 69 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61  fier.  ** with a
42c0: 20 71 75 6f 74 65 64 20 70 68 72 61 73 65 2c 20   quoted phrase, 
42d0: 6f 6e 6c 79 20 77 69 74 68 20 61 20 73 69 6e 67  only with a sing
42e0: 6c 65 20 74 6f 6b 65 6e 2e 20 4e 6f 74 20 73 75  le token. Not su
42f0: 72 65 20 69 66 20 74 68 69 73 20 77 61 73 0a 20  re if this was. 
4300: 20 2a 2a 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74   ** an implement
4310: 61 74 69 6f 6e 20 61 72 74 69 66 61 63 74 20 6f  ation artifact o
4320: 72 20 61 6e 20 69 6e 74 65 6e 74 69 6f 6e 61 6c  r an intentional
4330: 20 64 65 63 69 73 69 6f 6e 20 77 68 65 6e 20 66   decision when f
4340: 74 73 33 20 77 61 73 0a 20 20 2a 2a 20 66 69 72  ts3 was.  ** fir
4350: 73 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  st implemented. 
4360: 57 68 69 63 68 65 76 65 72 20 69 74 20 77 61 73  Whichever it was
4370: 2c 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 64 75  , this module du
4380: 70 6c 69 63 61 74 65 73 20 74 68 65 20 0a 20 20  plicates the .  
4390: 2a 2a 20 6c 69 6d 69 74 61 74 69 6f 6e 2e 0a 20  ** limitation.. 
43a0: 20 2a 2f 0a 20 20 69 43 6f 6c 20 3d 20 70 50 61   */.  iCol = pPa
43b0: 72 73 65 2d 3e 69 44 65 66 61 75 6c 74 43 6f 6c  rse->iDefaultCol
43c0: 3b 0a 20 20 69 43 6f 6c 4c 65 6e 20 3d 20 30 3b  ;.  iColLen = 0;
43d0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
43e0: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 3b 20 69 69  pParse->nCol; ii
43f0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
4400: 68 61 72 20 2a 7a 53 74 72 20 3d 20 70 50 61 72  har *zStr = pPar
4410: 73 65 2d 3e 61 7a 43 6f 6c 5b 69 69 5d 3b 0a 20  se->azCol[ii];. 
4420: 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 69     int nStr = (i
4430: 6e 74 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b  nt)strlen(zStr);
4440: 0a 20 20 20 20 69 66 28 20 6e 49 6e 70 75 74 3e  .    if( nInput>
4450: 6e 53 74 72 20 26 26 20 7a 49 6e 70 75 74 5b 6e  nStr && zInput[n
4460: 53 74 72 5d 3d 3d 27 3a 27 20 0a 20 20 20 20 20  Str]==':' .     
4470: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
4480: 63 6d 70 28 7a 53 74 72 2c 20 7a 49 6e 70 75 74  cmp(zStr, zInput
4490: 2c 20 6e 53 74 72 29 3d 3d 30 20 0a 20 20 20 20  , nStr)==0 .    
44a0: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  ){.      iCol = 
44b0: 69 69 3b 0a 20 20 20 20 20 20 69 43 6f 6c 4c 65  ii;.      iColLe
44c0: 6e 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75  n = (int)((zInpu
44d0: 74 20 2d 20 7a 29 20 2b 20 6e 53 74 72 20 2b 20  t - z) + nStr + 
44e0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
44f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
4500: 3d 20 67 65 74 4e 65 78 74 54 6f 6b 65 6e 28 70  = getNextToken(p
4510: 50 61 72 73 65 2c 20 69 43 6f 6c 2c 20 26 7a 5b  Parse, iCol, &z[
4520: 69 43 6f 6c 4c 65 6e 5d 2c 20 6e 2d 69 43 6f 6c  iColLen], n-iCol
4530: 4c 65 6e 2c 20 70 70 45 78 70 72 2c 20 70 6e 43  Len, ppExpr, pnC
4540: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 2a 70 6e 43  onsumed);.  *pnC
4550: 6f 6e 73 75 6d 65 64 20 2b 3d 20 69 43 6f 6c 4c  onsumed += iColL
4560: 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  en;.  return rc;
4570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
4580: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 46 74 73  gument is an Fts
4590: 33 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20  3Expr structure 
45a0: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 6f 70 65  for a binary ope
45b0: 72 61 74 6f 72 20 28 61 6e 79 20 74 79 70 65 0a  rator (any type.
45c0: 2a 2a 20 65 78 63 65 70 74 20 61 6e 20 46 54 53  ** except an FTS
45d0: 51 55 45 52 59 5f 50 48 52 41 53 45 29 2e 20 52  QUERY_PHRASE). R
45e0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
45f0: 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
4600: 69 6e 67 20 74 68 65 0a 2a 2a 20 70 72 65 63 65  ing the.** prece
4610: 64 65 6e 63 65 20 6f 66 20 74 68 65 20 6f 70 65  dence of the ope
4620: 72 61 74 6f 72 2e 20 4c 6f 77 65 72 20 76 61 6c  rator. Lower val
4630: 75 65 73 20 68 61 76 65 20 61 20 68 69 67 68 65  ues have a highe
4640: 72 20 70 72 65 63 65 64 65 6e 63 65 20 28 69 2e  r precedence (i.
4650: 65 2e 0a 2a 2a 20 67 72 6f 75 70 20 6d 6f 72 65  e..** group more
4660: 20 74 69 67 68 74 6c 79 29 2e 20 46 6f 72 20 65   tightly). For e
4670: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 43  xample, in the C
4680: 20 6c 61 6e 67 75 61 67 65 2c 20 74 68 65 20 3d   language, the =
4690: 3d 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 67 72  = operator.** gr
46a0: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
46b0: 79 20 74 68 61 6e 20 7c 7c 2c 20 61 6e 64 20 77  y than ||, and w
46c0: 6f 75 6c 64 20 74 68 65 72 65 66 6f 72 65 20 68  ould therefore h
46d0: 61 76 65 20 61 20 68 69 67 68 65 72 20 70 72 65  ave a higher pre
46e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 57  cedence..**.** W
46f0: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 6e 65  hen using the ne
4700: 77 20 66 74 73 33 20 71 75 65 72 79 20 73 79 6e  w fts3 query syn
4710: 74 61 78 20 28 77 68 65 6e 20 53 51 4c 49 54 45  tax (when SQLITE
4720: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52  _ENABLE_FTS3_PAR
4730: 45 4e 54 48 45 53 49 53 0a 2a 2a 20 69 73 20 64  ENTHESIS.** is d
4740: 65 66 69 6e 65 64 29 2c 20 74 68 65 20 6f 72 64  efined), the ord
4750: 65 72 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  er of the operat
4760: 6f 72 73 20 69 6e 20 70 72 65 63 65 64 65 6e 63  ors in precedenc
4770: 65 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74  e from highest t
4780: 6f 0a 2a 2a 20 6c 6f 77 65 73 74 20 69 73 3a 0a  o.** lowest is:.
4790: 2a 2a 0a 2a 2a 20 20 20 4e 45 41 52 0a 2a 2a 20  **.**   NEAR.** 
47a0: 20 20 4e 4f 54 0a 2a 2a 20 20 20 41 4e 44 20 28    NOT.**   AND (
47b0: 69 6e 63 6c 75 64 69 6e 67 20 69 6d 70 6c 69 63  including implic
47c0: 69 74 20 41 4e 44 73 29 0a 2a 2a 20 20 20 4f 52  it ANDs).**   OR
47d0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
47e0: 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
47f0: 6f 6c 64 20 71 75 65 72 79 20 73 79 6e 74 61 78  old query syntax
4800: 2c 20 74 68 65 20 4f 52 20 6f 70 65 72 61 74 6f  , the OR operato
4810: 72 20 68 61 73 20 61 20 68 69 67 68 65 72 0a 2a  r has a higher.*
4820: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 74 68 61  * precedence tha
4830: 6e 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  n the AND operat
4840: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
4850: 74 20 6f 70 50 72 65 63 65 64 65 6e 63 65 28 46  t opPrecedence(F
4860: 74 73 33 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  ts3Expr *p){.  a
4870: 73 73 65 72 74 28 20 70 2d 3e 65 54 79 70 65 21  ssert( p->eType!
4880: 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
4890: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
48a0: 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
48b0: 72 65 6e 74 68 65 73 65 73 20 29 7b 0a 20 20 20  rentheses ){.   
48c0: 20 72 65 74 75 72 6e 20 70 2d 3e 65 54 79 70 65   return p->eType
48d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
48e0: 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
48f0: 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 72 65 74  _NEAR ){.    ret
4900: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 1;.  }else i
4910: 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53  f( p->eType==FTS
4920: 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20  QUERY_OR ){.    
4930: 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
4940: 61 73 73 65 72 74 28 20 70 2d 3e 65 54 79 70 65  assert( p->eType
4950: 3d 3d 46 54 53 51 55 45 52 59 5f 41 4e 44 20 29  ==FTSQUERY_AND )
4960: 3b 0a 20 20 72 65 74 75 72 6e 20 33 3b 0a 7d 0a  ;.  return 3;.}.
4970: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
4980: 70 70 48 65 61 64 20 63 6f 6e 74 61 69 6e 73 20  ppHead contains 
4990: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
49a0: 20 63 75 72 72 65 6e 74 20 68 65 61 64 20 6f 66   current head of
49b0: 20 61 20 71 75 65 72 79 20 0a 2a 2a 20 65 78 70   a query .** exp
49c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 62 65 69  ression tree bei
49d0: 6e 67 20 70 61 72 73 65 64 2e 20 70 50 72 65 76  ng parsed. pPrev
49e0: 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
49f0: 6f 6e 20 6e 6f 64 65 20 6d 6f 73 74 20 72 65 63  on node most rec
4a00: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65  ently.** inserte
4a10: 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65 65 2e  d into the tree.
4a20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
4a30: 64 64 73 20 70 4e 65 77 2c 20 77 68 69 63 68 20  dds pNew, which 
4a40: 69 73 20 61 6c 77 61 79 73 20 61 20 62 69 6e 61  is always a bina
4a50: 72 79 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6e  ry.** operator n
4a60: 6f 64 65 2c 20 69 6e 74 6f 20 74 68 65 20 65 78  ode, into the ex
4a70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 62 61  pression tree ba
4a80: 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
4a90: 69 76 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a  ive precedence.*
4aa0: 2a 20 6f 66 20 70 4e 65 77 20 61 6e 64 20 74 68  * of pNew and th
4ab0: 65 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 73  e existing nodes
4ac0: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 54 68   of the tree. Th
4ad0: 69 73 20 6d 61 79 20 72 65 73 75 6c 74 20 69 6e  is may result in
4ae0: 20 74 68 65 20 68 65 61 64 0a 2a 2a 20 6f 66 20   the head.** of 
4af0: 74 68 65 20 74 72 65 65 20 63 68 61 6e 67 69 6e  the tree changin
4b00: 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  g, in which case
4b10: 20 2a 70 70 48 65 61 64 20 69 73 20 73 65 74 20   *ppHead is set 
4b20: 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 20  to the new root 
4b30: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
4b40: 76 6f 69 64 20 69 6e 73 65 72 74 42 69 6e 61 72  void insertBinar
4b50: 79 4f 70 65 72 61 74 6f 72 28 0a 20 20 46 74 73  yOperator(.  Fts
4b60: 33 45 78 70 72 20 2a 2a 70 70 48 65 61 64 2c 20  3Expr **ppHead, 
4b70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4b80: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   to the root nod
4b90: 65 20 6f 66 20 61 20 74 72 65 65 20 2a 2f 0a 20  e of a tree */. 
4ba0: 20 46 74 73 33 45 78 70 72 20 2a 70 50 72 65 76   Fts3Expr *pPrev
4bb0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64  ,         /* Nod
4bc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
4bd0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
4be0: 65 20 74 72 65 65 20 2a 2f 0a 20 20 46 74 73 33  e tree */.  Fts3
4bf0: 45 78 70 72 20 2a 70 4e 65 77 20 20 20 20 20 20  Expr *pNew      
4c00: 20 20 20 20 20 2f 2a 20 4e 65 77 20 62 69 6e 61       /* New bina
4c10: 72 79 20 6e 6f 64 65 20 74 6f 20 69 6e 73 65 72  ry node to inser
4c20: 74 20 69 6e 74 6f 20 65 78 70 72 65 73 73 69 6f  t into expressio
4c30: 6e 20 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 46  n tree */.){.  F
4c40: 74 73 33 45 78 70 72 20 2a 70 53 70 6c 69 74 20  ts3Expr *pSplit 
4c50: 3d 20 70 50 72 65 76 3b 0a 20 20 77 68 69 6c 65  = pPrev;.  while
4c60: 28 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e  ( pSplit->pParen
4c70: 74 20 26 26 20 6f 70 50 72 65 63 65 64 65 6e 63  t && opPrecedenc
4c80: 65 28 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e  e(pSplit->pParen
4c90: 74 29 3c 3d 6f 70 50 72 65 63 65 64 65 6e 63 65  t)<=opPrecedence
4ca0: 28 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 70 53  (pNew) ){.    pS
4cb0: 70 6c 69 74 20 3d 20 70 53 70 6c 69 74 2d 3e 70  plit = pSplit->p
4cc0: 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 69  Parent;.  }..  i
4cd0: 66 28 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65  f( pSplit->pPare
4ce0: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
4cf0: 28 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e  ( pSplit->pParen
4d00: 74 2d 3e 70 52 69 67 68 74 3d 3d 70 53 70 6c 69  t->pRight==pSpli
4d10: 74 20 29 3b 0a 20 20 20 20 70 53 70 6c 69 74 2d  t );.    pSplit-
4d20: 3e 70 50 61 72 65 6e 74 2d 3e 70 52 69 67 68 74  >pParent->pRight
4d30: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
4d40: 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 53 70  w->pParent = pSp
4d50: 6c 69 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  lit->pParent;.  
4d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 48 65  }else{.    *ppHe
4d70: 61 64 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ad = pNew;.  }. 
4d80: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
4d90: 53 70 6c 69 74 3b 0a 20 20 70 53 70 6c 69 74 2d  Split;.  pSplit-
4da0: 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 3b  >pParent = pNew;
4db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
4dc0: 74 68 65 20 66 74 73 33 20 71 75 65 72 79 20 65  the fts3 query e
4dd0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 75 6e 64 20  xpression found 
4de0: 69 6e 20 62 75 66 66 65 72 20 7a 2c 20 6c 65 6e  in buffer z, len
4df0: 67 74 68 20 6e 2e 20 54 68 69 73 20 66 75 6e 63  gth n. This func
4e00: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
4e10: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
4e20: 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
4e30: 72 20 69 73 20 72 65 61 63 68 65 64 20 6f 72 20  r is reached or 
4e40: 61 6e 20 75 6e 6d 61 74 63 68 65 64 20 0a 2a 2a  an unmatched .**
4e50: 20 63 6c 6f 73 69 6e 67 20 62 72 61 63 6b 65 74   closing bracket
4e60: 20 2d 20 27 29 27 20 2d 20 69 73 20 65 6e 63 6f   - ')' - is enco
4e70: 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
4e80: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
4e90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4ea0: 6e 65 64 2c 20 2a 70 70 45 78 70 72 20 69 73 20  ned, *ppExpr is 
4eb0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4ec0: 74 68 65 0a 2a 2a 20 70 61 72 73 65 64 20 66 6f  the.** parsed fo
4ed0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
4ee0: 73 69 6f 6e 20 61 6e 64 20 2a 70 6e 43 6f 6e 73  sion and *pnCons
4ef0: 75 6d 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  umed is set to t
4f00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
4f10: 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
4f20: 62 75 66 66 65 72 20 7a 2e 20 4f 74 68 65 72 77  buffer z. Otherw
4f30: 69 73 65 2c 20 2a 70 70 45 78 70 72 20 69 73 20  ise, *ppExpr is 
4f40: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
4f50: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 6f 75  ITE_NOMEM.** (ou
4f60: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 65 72 72 6f  t of memory erro
4f70: 72 29 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52  r) or SQLITE_ERR
4f80: 4f 52 20 28 70 61 72 73 65 20 65 72 72 6f 72 29  OR (parse error)
4f90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
4fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
4fb0: 45 78 70 72 50 61 72 73 65 28 0a 20 20 50 61 72  ExprParse(.  Par
4fc0: 73 65 43 6f 6e 74 65 78 74 20 2a 70 50 61 72 73  seContext *pPars
4fd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4fe0: 20 20 20 20 20 2f 2a 20 66 74 73 33 20 71 75 65       /* fts3 que
4ff0: 72 79 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  ry parse context
5000: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5010: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5030: 20 54 65 78 74 20 6f 66 20 4d 41 54 43 48 20 71   Text of MATCH q
5040: 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33 45 78  uery */.  Fts3Ex
5050: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 2f 2a 20 4f 55 54 3a 20 50 61 72 73 65 64    /* OUT: Parsed
5080: 20 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65   query structure
5090: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6e   */.  int *pnCon
50a0: 73 75 6d 65 64 20 20 20 20 20 20 20 20 20 20 20  sumed           
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50c0: 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20   OUT: Number of 
50d0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 20 2a  bytes consumed *
50e0: 2f 0a 29 7b 0a 20 20 46 74 73 33 45 78 70 72 20  /.){.  Fts3Expr 
50f0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73  *pRet = 0;.  Fts
5100: 33 45 78 70 72 20 2a 70 50 72 65 76 20 3d 20 30  3Expr *pPrev = 0
5110: 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 4e  ;.  Fts3Expr *pN
5120: 6f 74 42 72 61 6e 63 68 20 3d 20 30 3b 20 20 20  otBranch = 0;   
5130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5140: 6e 6c 79 20 75 73 65 64 20 69 6e 20 6c 65 67 61  nly used in lega
5150: 63 79 20 70 61 72 73 65 20 6d 6f 64 65 20 2a 2f  cy parse mode */
5160: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 6e 3b 0a  .  int nIn = n;.
5170: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5180: 6e 20 3d 20 7a 3b 0a 20 20 69 6e 74 20 72 63 20  n = z;.  int rc 
5190: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
51a0: 6e 74 20 69 73 52 65 71 75 69 72 65 50 68 72 61  nt isRequirePhra
51b0: 73 65 20 3d 20 31 3b 0a 0a 20 20 77 68 69 6c 65  se = 1;..  while
51c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51d0: 29 7b 0a 20 20 20 20 46 74 73 33 45 78 70 72 20  ){.    Fts3Expr 
51e0: 2a 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  *p = 0;.    int 
51f0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 72  nByte = 0;.    r
5200: 63 20 3d 20 67 65 74 4e 65 78 74 4e 6f 64 65 28  c = getNextNode(
5210: 70 50 61 72 73 65 2c 20 7a 49 6e 2c 20 6e 49 6e  pParse, zIn, nIn
5220: 2c 20 26 70 2c 20 26 6e 42 79 74 65 29 3b 0a 20  , &p, &nByte);. 
5230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
5250: 74 20 69 73 50 68 72 61 73 65 3b 0a 0a 20 20 20  t isPhrase;..   
5260: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
5270: 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
5280: 6e 74 68 65 73 65 73 20 0a 20 20 20 20 20 20 20  ntheses .       
5290: 26 26 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53  && p->eType==FTS
52a0: 51 55 45 52 59 5f 50 48 52 41 53 45 20 26 26 20  QUERY_PHRASE && 
52b0: 70 50 61 72 73 65 2d 3e 69 73 4e 6f 74 20 0a 20  pParse->isNot . 
52c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
52d0: 2f 2a 20 43 72 65 61 74 65 20 61 6e 20 69 6d 70  /* Create an imp
52e0: 6c 69 63 69 74 20 4e 4f 54 20 6f 70 65 72 61 74  licit NOT operat
52f0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46  or. */.        F
5300: 74 73 33 45 78 70 72 20 2a 70 4e 6f 74 20 3d 20  ts3Expr *pNot = 
5310: 66 74 73 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  fts3MallocZero(s
5320: 69 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29 29  izeof(Fts3Expr))
5330: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
5340: 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Not ){.         
5350: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
5360: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Free(p);.       
5370: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5380: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
5390: 67 6f 74 6f 20 65 78 70 72 70 61 72 73 65 5f 6f  goto exprparse_o
53a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
53b0: 20 20 20 20 20 20 70 4e 6f 74 2d 3e 65 54 79 70        pNot->eTyp
53c0: 65 20 3d 20 46 54 53 51 55 45 52 59 5f 4e 4f 54  e = FTSQUERY_NOT
53d0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 2d 3e  ;.        pNot->
53e0: 70 52 69 67 68 74 20 3d 20 70 3b 0a 20 20 20 20  pRight = p;.    
53f0: 20 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d      p->pParent =
5400: 20 70 4e 6f 74 3b 0a 20 20 20 20 20 20 20 20 69   pNot;.        i
5410: 66 28 20 70 4e 6f 74 42 72 61 6e 63 68 20 29 7b  f( pNotBranch ){
5420: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 74 2d  .          pNot-
5430: 3e 70 4c 65 66 74 20 3d 20 70 4e 6f 74 42 72 61  >pLeft = pNotBra
5440: 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nch;.          p
5450: 4e 6f 74 42 72 61 6e 63 68 2d 3e 70 50 61 72 65  NotBranch->pPare
5460: 6e 74 20 3d 20 70 4e 6f 74 3b 0a 20 20 20 20 20  nt = pNot;.     
5470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 6f     }.        pNo
5480: 74 42 72 61 6e 63 68 20 3d 20 70 4e 6f 74 3b 0a  tBranch = pNot;.
5490: 20 20 20 20 20 20 20 20 70 20 3d 20 70 50 72 65          p = pPre
54a0: 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
54b0: 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70          int eTyp
54c0: 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
54d0: 20 20 20 20 20 20 69 73 50 68 72 61 73 65 20 3d        isPhrase =
54e0: 20 28 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52   (eType==FTSQUER
54f0: 59 5f 50 48 52 41 53 45 20 7c 7c 20 70 2d 3e 70  Y_PHRASE || p->p
5500: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  Left);..        
5510: 2f 2a 20 54 68 65 20 69 73 52 65 71 75 69 72 65  /* The isRequire
5520: 50 68 72 61 73 65 20 76 61 72 69 61 62 6c 65 20  Phrase variable 
5530: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
5540: 66 20 61 20 70 68 72 61 73 65 20 6f 72 0a 20 20  f a phrase or.  
5550: 20 20 20 20 20 20 2a 2a 20 61 6e 20 65 78 70 72        ** an expr
5560: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 65 64  ession contained
5570: 20 69 6e 20 70 61 72 65 6e 74 68 65 73 69 73 20   in parenthesis 
5580: 69 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  is required. If 
5590: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 69 6e  a.        ** bin
55a0: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 28 41 4e  ary operator (AN
55b0: 44 2c 20 4f 52 2c 20 4e 4f 54 20 6f 72 20 4e 45  D, OR, NOT or NE
55c0: 41 52 29 20 69 73 20 65 6e 63 6f 75 6e 74 65 64  AR) is encounted
55d0: 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
55e0: 20 69 73 52 65 71 75 69 72 65 50 68 72 61 73 65   isRequirePhrase
55f0: 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 69 73   is set, this is
5600: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
5610: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5620: 20 20 20 20 69 66 28 20 21 69 73 50 68 72 61 73      if( !isPhras
5630: 65 20 26 26 20 69 73 52 65 71 75 69 72 65 50 68  e && isRequirePh
5640: 72 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rase ){.        
5650: 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70    sqlite3Fts3Exp
5660: 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  rFree(p);.      
5670: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5680: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
5690: 20 67 6f 74 6f 20 65 78 70 72 70 61 72 73 65 5f   goto exprparse_
56a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
56b0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73   .        if( is
56c0: 50 68 72 61 73 65 20 26 26 20 21 69 73 52 65 71  Phrase && !isReq
56d0: 75 69 72 65 50 68 72 61 73 65 20 29 7b 0a 20 20  uirePhrase ){.  
56e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
56f0: 74 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e  t an implicit AN
5700: 44 20 6f 70 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  D operator. */. 
5710: 20 20 20 20 20 20 20 20 20 46 74 73 33 45 78 70           Fts3Exp
5720: 72 20 2a 70 41 6e 64 3b 0a 20 20 20 20 20 20 20  r *pAnd;.       
5730: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 20     assert( pRet 
5740: 26 26 20 70 50 72 65 76 20 29 3b 0a 20 20 20 20  && pPrev );.    
5750: 20 20 20 20 20 20 70 41 6e 64 20 3d 20 66 74 73        pAnd = fts
5760: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
5770: 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b 0a 20  of(Fts3Expr));. 
5780: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 41           if( !pA
5790: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
57a0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70    sqlite3Fts3Exp
57b0: 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  rFree(p);.      
57c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
57d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
57e0: 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72 70 61       goto exprpa
57f0: 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  rse_out;.       
5800: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
5810: 41 6e 64 2d 3e 65 54 79 70 65 20 3d 20 46 54 53  And->eType = FTS
5820: 51 55 45 52 59 5f 41 4e 44 3b 0a 20 20 20 20 20  QUERY_AND;.     
5830: 20 20 20 20 20 69 6e 73 65 72 74 42 69 6e 61 72       insertBinar
5840: 79 4f 70 65 72 61 74 6f 72 28 26 70 52 65 74 2c  yOperator(&pRet,
5850: 20 70 50 72 65 76 2c 20 70 41 6e 64 29 3b 0a 20   pPrev, pAnd);. 
5860: 20 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d           pPrev =
5870: 20 70 41 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d   pAnd;.        }
5880: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ..        /* Thi
5890: 73 20 74 65 73 74 20 63 61 74 63 68 65 73 20 61  s test catches a
58a0: 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20  ttempts to make 
58b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 6f  either operand o
58c0: 66 20 61 20 4e 45 41 52 0a 20 20 20 20 20 20 20  f a NEAR.       
58d0: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 6f 6d   ** operator som
58e0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
58f0: 6e 20 61 20 70 68 72 61 73 65 2e 20 46 6f 72 20  n a phrase. For 
5900: 65 78 61 6d 70 6c 65 2c 20 65 69 74 68 65 72 20  example, either 
5910: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
5920: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
5930: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
5940: 2a 2a 20 20 20 20 28 62 72 61 63 6b 65 74 65 64  **    (bracketed
5950: 20 65 78 70 72 65 73 73 69 6f 6e 29 20 4e 45 41   expression) NEA
5960: 52 20 70 68 72 61 73 65 0a 20 20 20 20 20 20 20  R phrase.       
5970: 20 2a 2a 20 20 20 20 70 68 72 61 73 65 20 4e 45   **    phrase NE
5980: 41 52 20 28 62 72 61 63 6b 65 74 65 64 20 65 78  AR (bracketed ex
5990: 70 72 65 73 73 69 6f 6e 29 0a 20 20 20 20 20 20  pression).      
59a0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
59b0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
59c0: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
59d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
59e0: 20 20 20 69 66 28 20 70 50 72 65 76 20 26 26 20     if( pPrev && 
59f0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 65  (.            (e
5a00: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e  Type==FTSQUERY_N
5a10: 45 41 52 20 26 26 20 21 69 73 50 68 72 61 73 65  EAR && !isPhrase
5a20: 20 26 26 20 70 50 72 65 76 2d 3e 65 54 79 70 65   && pPrev->eType
5a30: 21 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  !=FTSQUERY_PHRAS
5a40: 45 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  E).         || (
5a50: 65 54 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f  eType!=FTSQUERY_
5a60: 50 48 52 41 53 45 20 26 26 20 69 73 50 68 72 61  PHRASE && isPhra
5a70: 73 65 20 26 26 20 70 50 72 65 76 2d 3e 65 54 79  se && pPrev->eTy
5a80: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
5a90: 52 29 0a 20 20 20 20 20 20 20 20 29 29 7b 0a 20  R).        )){. 
5aa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5ab0: 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29 3b  Fts3ExprFree(p);
5ac0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
5ad0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5ae0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70          goto exp
5af0: 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20  rparse_out;.    
5b00: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
5b10: 20 69 66 28 20 69 73 50 68 72 61 73 65 20 29 7b   if( isPhrase ){
5b20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5b30: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ret ){.         
5b40: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
5b50: 20 26 26 20 70 50 72 65 76 2d 3e 70 4c 65 66 74   && pPrev->pLeft
5b60: 20 26 26 20 70 50 72 65 76 2d 3e 70 52 69 67 68   && pPrev->pRigh
5b70: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
5b80: 20 20 20 20 70 50 72 65 76 2d 3e 70 52 69 67 68      pPrev->pRigh
5b90: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
5ba0: 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20     p->pParent = 
5bb0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
5bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5bd0: 20 20 20 20 70 52 65 74 20 3d 20 70 3b 0a 20 20      pRet = p;.  
5be0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5c00: 20 20 20 69 6e 73 65 72 74 42 69 6e 61 72 79 4f     insertBinaryO
5c10: 70 65 72 61 74 6f 72 28 26 70 52 65 74 2c 20 70  perator(&pRet, p
5c20: 50 72 65 76 2c 20 70 29 3b 0a 20 20 20 20 20 20  Prev, p);.      
5c30: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 52 65    }.        isRe
5c40: 71 75 69 72 65 50 68 72 61 73 65 20 3d 20 21 69  quirePhrase = !i
5c50: 73 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 7d  sPhrase;.      }
5c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
5c70: 42 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Byte>0 );.    }.
5c80: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
5c90: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 6e 42  SQLITE_OK || (nB
5ca0: 79 74 65 3e 30 20 26 26 20 6e 42 79 74 65 3c 3d  yte>0 && nByte<=
5cb0: 6e 49 6e 29 20 29 3b 0a 20 20 20 20 6e 49 6e 20  nIn) );.    nIn 
5cc0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7a 49  -= nByte;.    zI
5cd0: 6e 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  n += nByte;.    
5ce0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 0a  pPrev = p;.  }..
5cf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d00: 5f 44 4f 4e 45 20 26 26 20 70 52 65 74 20 26 26  _DONE && pRet &&
5d10: 20 69 73 52 65 71 75 69 72 65 50 68 72 61 73 65   isRequirePhrase
5d20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
5d30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
5d40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d50: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 63 20  _DONE ){.    rc 
5d60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d70: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 66 74   if( !sqlite3_ft
5d80: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
5d90: 68 65 73 65 73 20 26 26 20 70 4e 6f 74 42 72 61  heses && pNotBra
5da0: 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nch ){.      if(
5db0: 20 21 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20   !pRet ){.      
5dc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5dd0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
5de0: 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78  {.        Fts3Ex
5df0: 70 72 20 2a 70 49 74 65 72 20 3d 20 70 4e 6f 74  pr *pIter = pNot
5e00: 42 72 61 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  Branch;.        
5e10: 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c  while( pIter->pL
5e20: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
5e30: 20 70 49 74 65 72 20 3d 20 70 49 74 65 72 2d 3e   pIter = pIter->
5e40: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 7d  pLeft;.        }
5e50: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
5e60: 70 4c 65 66 74 20 3d 20 70 52 65 74 3b 0a 20 20  pLeft = pRet;.  
5e70: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50 61 72        pRet->pPar
5e80: 65 6e 74 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ent = pIter;.   
5e90: 20 20 20 20 20 70 52 65 74 20 3d 20 70 4e 6f 74       pRet = pNot
5ea0: 42 72 61 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  Branch;.      }.
5eb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 43      }.  }.  *pnC
5ec0: 6f 6e 73 75 6d 65 64 20 3d 20 6e 20 2d 20 6e 49  onsumed = n - nI
5ed0: 6e 3b 0a 0a 65 78 70 72 70 61 72 73 65 5f 6f 75  n;..exprparse_ou
5ee0: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
5ef0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5f00: 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65  lite3Fts3ExprFre
5f10: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 73 71 6c  e(pRet);.    sql
5f20: 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65  ite3Fts3ExprFree
5f30: 28 70 4e 6f 74 42 72 61 6e 63 68 29 3b 0a 20 20  (pNotBranch);.  
5f40: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
5f50: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 52 65 74    *ppExpr = pRet
5f60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5f70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ../*.** Return S
5f80: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
5f90: 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70 74 68  he maximum depth
5fa0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
5fb0: 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 0a  on tree passed .
5fc0: 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
5fd0: 72 67 75 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  rgument is more 
5fe0: 74 68 61 6e 20 6e 4d 61 78 44 65 70 74 68 2e 0a  than nMaxDepth..
5ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
6000: 73 33 45 78 70 72 43 68 65 63 6b 44 65 70 74 68  s3ExprCheckDepth
6010: 28 46 74 73 33 45 78 70 72 20 2a 70 2c 20 69 6e  (Fts3Expr *p, in
6020: 74 20 6e 4d 61 78 44 65 70 74 68 29 7b 0a 20 20  t nMaxDepth){.  
6030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6040: 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
6050: 20 20 20 69 66 28 20 6e 4d 61 78 44 65 70 74 68     if( nMaxDepth
6060: 3c 30 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  <0 ){ .      rc 
6070: 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b  = SQLITE_TOOBIG;
6080: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6090: 20 20 72 63 20 3d 20 66 74 73 33 45 78 70 72 43    rc = fts3ExprC
60a0: 68 65 63 6b 44 65 70 74 68 28 70 2d 3e 70 4c 65  heckDepth(p->pLe
60b0: 66 74 2c 20 6e 4d 61 78 44 65 70 74 68 2d 31 29  ft, nMaxDepth-1)
60c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
60d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
60e0: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 78       rc = fts3Ex
60f0: 70 72 43 68 65 63 6b 44 65 70 74 68 28 70 2d 3e  prCheckDepth(p->
6100: 70 52 69 67 68 74 2c 20 6e 4d 61 78 44 65 70 74  pRight, nMaxDept
6110: 68 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  h-1);.      }.  
6120: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6130: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6140: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
6150: 6d 70 74 73 20 74 6f 20 74 72 61 6e 73 66 6f 72  mpts to transfor
6160: 6d 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  m the expression
6170: 20 74 72 65 65 20 61 74 20 28 2a 70 70 29 20 74   tree at (*pp) t
6180: 6f 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65  o.** an equivale
6190: 6e 74 20 62 75 74 20 6d 6f 72 65 20 62 61 6c 61  nt but more bala
61a0: 6e 63 65 64 20 66 6f 72 6d 2e 20 54 68 65 20 74  nced form. The t
61b0: 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ree is modified 
61c0: 69 6e 20 70 6c 61 63 65 2e 0a 2a 2a 20 49 66 20  in place..** If 
61d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
61e0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
61f0: 64 20 61 6e 64 20 28 2a 70 70 29 20 73 65 74 20  d and (*pp) set 
6200: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
6210: 0a 2a 2a 20 6e 65 77 20 72 6f 6f 74 20 65 78 70  .** new root exp
6220: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 20 0a 2a  ression node. .*
6230: 2a 0a 2a 2a 20 6e 4d 61 78 44 65 70 74 68 20 69  *.** nMaxDepth i
6240: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  s the maximum al
6250: 6c 6f 77 61 62 6c 65 20 64 65 70 74 68 20 6f 66  lowable depth of
6260: 20 74 68 65 20 62 61 6c 61 6e 63 65 64 20 73 75   the balanced su
6270: 62 2d 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  b-tree..**.** Ot
6280: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
6290: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
62a0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
62b0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
62c0: 64 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  d .** expression
62d0: 20 28 2a 70 70 29 20 66 72 65 65 64 2e 0a 2a 2f   (*pp) freed..*/
62e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
62f0: 45 78 70 72 42 61 6c 61 6e 63 65 28 46 74 73 33  ExprBalance(Fts3
6300: 45 78 70 72 20 2a 2a 70 70 2c 20 69 6e 74 20 6e  Expr **pp, int n
6310: 4d 61 78 44 65 70 74 68 29 7b 0a 20 20 69 6e 74  MaxDepth){.  int
6320: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6340: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6350: 20 46 74 73 33 45 78 70 72 20 2a 70 52 6f 6f 74   Fts3Expr *pRoot
6360: 20 3d 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20   = *pp;         
6370: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 72 6f 6f 74   /* Initial root
6380: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 45   node */.  Fts3E
6390: 78 70 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 20  xpr *pFree = 0; 
63a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
63b0: 73 74 20 6f 66 20 66 72 65 65 20 6e 6f 64 65 73  st of free nodes
63c0: 2e 20 4c 69 6e 6b 65 64 20 62 79 20 70 50 61 72  . Linked by pPar
63d0: 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ent. */.  int eT
63e0: 79 70 65 20 3d 20 70 52 6f 6f 74 2d 3e 65 54 79  ype = pRoot->eTy
63f0: 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
6400: 65 20 6f 66 20 6e 6f 64 65 20 69 6e 20 74 68 69  e of node in thi
6410: 73 20 74 72 65 65 20 2a 2f 0a 0a 20 20 69 66 28  s tree */..  if(
6420: 20 6e 4d 61 78 44 65 70 74 68 3d 3d 30 20 29 7b   nMaxDepth==0 ){
6430: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6440: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
6450: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6460: 20 26 26 20 28 65 54 79 70 65 3d 3d 46 54 53 51   && (eType==FTSQ
6470: 55 45 52 59 5f 41 4e 44 20 7c 7c 20 65 54 79 70  UERY_AND || eTyp
6480: 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52 29 20  e==FTSQUERY_OR) 
6490: 29 7b 0a 20 20 20 20 46 74 73 33 45 78 70 72 20  ){.    Fts3Expr 
64a0: 2a 2a 61 70 4c 65 61 66 3b 0a 20 20 20 20 61 70  **apLeaf;.    ap
64b0: 4c 65 61 66 20 3d 20 28 46 74 73 33 45 78 70 72  Leaf = (Fts3Expr
64c0: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   **)sqlite3_mall
64d0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 45 78  oc(sizeof(Fts3Ex
64e0: 70 72 20 2a 29 20 2a 20 6e 4d 61 78 44 65 70 74  pr *) * nMaxDept
64f0: 68 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 61  h);.    if( 0==a
6500: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  pLeaf ){.      r
6510: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6520: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6530: 20 20 20 6d 65 6d 73 65 74 28 61 70 4c 65 61 66     memset(apLeaf
6540: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
6550: 45 78 70 72 20 2a 29 20 2a 20 6e 4d 61 78 44 65  Expr *) * nMaxDe
6560: 70 74 68 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pth);.    }..   
6570: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6580: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
6590: 69 3b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70  i;.      Fts3Exp
65a0: 72 20 2a 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r *p;..      /* 
65b0: 53 65 74 20 24 70 20 74 6f 20 70 6f 69 6e 74 20  Set $p to point 
65c0: 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
65d0: 20 6c 65 61 66 20 69 6e 20 74 68 65 20 74 72 65   leaf in the tre
65e0: 65 20 6f 66 20 65 54 79 70 65 20 6e 6f 64 65 73  e of eType nodes
65f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70  . */.      for(p
6600: 3d 70 52 6f 6f 74 3b 20 70 2d 3e 65 54 79 70 65  =pRoot; p->eType
6610: 3d 3d 65 54 79 70 65 3b 20 70 3d 70 2d 3e 70 4c  ==eType; p=p->pL
6620: 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  eft){.        as
6630: 73 65 72 74 28 20 70 2d 3e 70 50 61 72 65 6e 74  sert( p->pParent
6640: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 61 72 65 6e  ==0 || p->pParen
6650: 74 2d 3e 70 4c 65 66 74 3d 3d 70 20 29 3b 0a 20  t->pLeft==p );. 
6660: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6670: 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d 3e 70 52  ->pLeft && p->pR
6680: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ight );.      }.
6690: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c  .      /* This l
66a0: 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
66b0: 72 20 65 61 63 68 20 6c 65 61 66 20 69 6e 20 74  r each leaf in t
66c0: 68 65 20 74 72 65 65 20 6f 66 20 65 54 79 70 65  he tree of eType
66d0: 20 6e 6f 64 65 73 2e 20 2a 2f 0a 20 20 20 20 20   nodes. */.     
66e0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
66f0: 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20       int iLvl;. 
6700: 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
6710: 2a 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 50  *pParent = p->pP
6720: 61 72 65 6e 74 3b 20 20 20 20 20 2f 2a 20 43 75  arent;     /* Cu
6730: 72 72 65 6e 74 20 70 61 72 65 6e 74 20 6f 66 20  rrent parent of 
6740: 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73  p */..        as
6750: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
6760: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65   || pParent->pLe
6770: 66 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 20  ft==p );.       
6780: 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b   p->pParent = 0;
6790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
67a0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
67b0: 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74    pParent->pLeft
67c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
67d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
67e0: 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Root = 0;.      
67f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
6800: 20 66 74 73 33 45 78 70 72 42 61 6c 61 6e 63 65   fts3ExprBalance
6810: 28 26 70 2c 20 6e 4d 61 78 44 65 70 74 68 2d 31  (&p, nMaxDepth-1
6820: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
6830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
6840: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 66  reak;..        f
6850: 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 20 26 26 20  or(iLvl=0; p && 
6860: 69 4c 76 6c 3c 6e 4d 61 78 44 65 70 74 68 3b 20  iLvl<nMaxDepth; 
6870: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
6880: 20 20 20 69 66 28 20 61 70 4c 65 61 66 5b 69 4c     if( apLeaf[iL
6890: 76 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vl]==0 ){.      
68a0: 20 20 20 20 20 20 61 70 4c 65 61 66 5b 69 4c 76        apLeaf[iLv
68b0: 6c 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  l] = p;.        
68c0: 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
68d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
68e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
68f0: 70 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 20  pFree );.       
6900: 20 20 20 20 20 70 46 72 65 65 2d 3e 70 4c 65 66       pFree->pLef
6910: 74 20 3d 20 61 70 4c 65 61 66 5b 69 4c 76 6c 5d  t = apLeaf[iLvl]
6920: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
6930: 72 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 3b  ree->pRight = p;
6940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 72  .            pFr
6950: 65 65 2d 3e 70 4c 65 66 74 2d 3e 70 50 61 72 65  ee->pLeft->pPare
6960: 6e 74 20 3d 20 70 46 72 65 65 3b 0a 20 20 20 20  nt = pFree;.    
6970: 20 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e 70          pFree->p
6980: 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 20 3d  Right->pParent =
6990: 20 70 46 72 65 65 3b 0a 0a 20 20 20 20 20 20 20   pFree;..       
69a0: 20 20 20 20 20 70 20 3d 20 70 46 72 65 65 3b 0a       p = pFree;.
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 72 65              pFre
69c0: 65 20 3d 20 70 46 72 65 65 2d 3e 70 50 61 72 65  e = pFree->pPare
69d0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt;.            
69e0: 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  p->pParent = 0;.
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 4c 65              apLe
6a00: 61 66 5b 69 4c 76 6c 5d 20 3d 20 30 3b 0a 20 20  af[iLvl] = 0;.  
6a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6a30: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  p ){.          s
6a40: 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72  qlite3Fts3ExprFr
6a50: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
6a60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f   rc = SQLITE_TOO
6a70: 42 49 47 3b 0a 20 20 20 20 20 20 20 20 20 20 62  BIG;.          b
6a80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6a90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
6aa0: 68 61 74 20 77 61 73 20 74 68 65 20 6c 61 73 74  hat was the last
6ab0: 20 6c 65 61 66 20 6e 6f 64 65 2c 20 62 72 65 61   leaf node, brea
6ac0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
6ad0: 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  p */.        if(
6ae0: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 62 72   pParent==0 ) br
6af0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  eak;..        /*
6b00: 20 53 65 74 20 24 70 20 74 6f 20 70 6f 69 6e 74   Set $p to point
6b10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 61   to the next lea
6b20: 66 20 69 6e 20 74 68 65 20 74 72 65 65 20 6f 66  f in the tree of
6b30: 20 65 54 79 70 65 20 6e 6f 64 65 73 20 2a 2f 0a   eType nodes */.
6b40: 20 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 50          for(p=pP
6b50: 61 72 65 6e 74 2d 3e 70 52 69 67 68 74 3b 20 70  arent->pRight; p
6b60: 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65 3b 20  ->eType==eType; 
6b70: 70 3d 70 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20  p=p->pLeft);..  
6b80: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
6b90: 70 50 61 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  pParent from the
6ba0: 20 6f 72 69 67 69 6e 61 6c 20 74 72 65 65 2e 20   original tree. 
6bb0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
6bc0: 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72  t( pParent->pPar
6bd0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
6be0: 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66  t->pParent->pLef
6bf0: 74 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t==pParent );.  
6c00: 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
6c10: 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 20 3d  Right->pParent =
6c20: 20 70 50 61 72 65 6e 74 2d 3e 70 50 61 72 65 6e   pParent->pParen
6c30: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
6c40: 50 61 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74 20  Parent->pParent 
6c50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
6c60: 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  rent->pParent->p
6c70: 4c 65 66 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  Left = pParent->
6c80: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
6c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6ca0: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
6cb0: 3d 3d 70 52 6f 6f 74 20 29 3b 0a 20 20 20 20 20  ==pRoot );.     
6cc0: 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
6cd0: 72 65 6e 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20  rent->pRight;.  
6ce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
6cf0: 20 2f 2a 20 4c 69 6e 6b 20 70 50 61 72 65 6e 74   /* Link pParent
6d00: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 20 6e   into the free n
6d10: 6f 64 65 20 6c 69 73 74 2e 20 49 74 20 77 69 6c  ode list. It wil
6d20: 6c 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 0a  l be used as an.
6d30: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
6d40: 6e 61 6c 20 6e 6f 64 65 20 6f 66 20 74 68 65 20  nal node of the 
6d50: 6e 65 77 20 74 72 65 65 2e 20 20 2a 2f 0a 20 20  new tree.  */.  
6d60: 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
6d70: 50 61 72 65 6e 74 20 3d 20 70 46 72 65 65 3b 0a  Parent = pFree;.
6d80: 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
6d90: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 7d  pParent;.      }
6da0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
6db0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6dc0: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
6dd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6de0: 4d 61 78 44 65 70 74 68 3b 20 69 2b 2b 29 7b 0a  MaxDepth; i++){.
6df0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
6e00: 4c 65 61 66 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Leaf[i] ){.     
6e10: 20 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20         if( p==0 
6e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e30: 20 70 20 3d 20 61 70 4c 65 61 66 5b 69 5d 3b 0a   p = apLeaf[i];.
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
6e50: 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
6e60: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
6e80: 73 73 65 72 74 28 20 70 46 72 65 65 21 3d 30 20  ssert( pFree!=0 
6e90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6ea0: 20 70 46 72 65 65 2d 3e 70 52 69 67 68 74 20 3d   pFree->pRight =
6eb0: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   p;.            
6ec0: 20 20 70 46 72 65 65 2d 3e 70 4c 65 66 74 20 3d    pFree->pLeft =
6ed0: 20 61 70 4c 65 61 66 5b 69 5d 3b 0a 20 20 20 20   apLeaf[i];.    
6ee0: 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 2d            pFree-
6ef0: 3e 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20  >pLeft->pParent 
6f00: 3d 20 70 46 72 65 65 3b 0a 20 20 20 20 20 20 20  = pFree;.       
6f10: 20 20 20 20 20 20 20 70 46 72 65 65 2d 3e 70 52         pFree->pR
6f20: 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  ight->pParent = 
6f30: 70 46 72 65 65 3b 0a 0a 20 20 20 20 20 20 20 20  pFree;..        
6f40: 20 20 20 20 20 20 70 20 3d 20 70 46 72 65 65 3b        p = pFree;
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6f60: 46 72 65 65 20 3d 20 70 46 72 65 65 2d 3e 70 50  Free = pFree->pP
6f70: 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  arent;.         
6f80: 20 20 20 20 20 70 2d 3e 70 50 61 72 65 6e 74 20       p->pParent 
6f90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
6fa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
6fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6fc0: 20 70 52 6f 6f 74 20 3d 20 70 3b 0a 20 20 20 20   pRoot = p;.    
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6fe0: 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
6ff0: 75 72 72 65 64 2e 20 44 65 6c 65 74 65 20 74 68  urred. Delete th
7000: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
7010: 65 20 61 70 4c 65 61 66 5b 5d 20 61 72 72 61 79  e apLeaf[] array
7020: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64   .        ** and
7030: 20 70 46 72 65 65 20 6c 69 73 74 2e 20 45 76 65   pFree list. Eve
7040: 72 79 74 68 69 6e 67 20 65 6c 73 65 20 69 73 20  rything else is 
7050: 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74 68  cleaned up by th
7060: 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20  e call to.      
7070: 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33    ** sqlite3Fts3
7080: 45 78 70 72 46 72 65 65 28 70 52 6f 6f 74 29 20  ExprFree(pRoot) 
7090: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
70a0: 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 44 65     Fts3Expr *pDe
70b0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
70c0: 3d 30 3b 20 69 3c 6e 4d 61 78 44 65 70 74 68 3b  =0; i<nMaxDepth;
70d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
70e0: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
70f0: 46 72 65 65 28 61 70 4c 65 61 66 5b 69 5d 29 3b  Free(apLeaf[i]);
7100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7110: 20 20 20 77 68 69 6c 65 28 20 28 70 44 65 6c 3d     while( (pDel=
7120: 70 46 72 65 65 29 21 3d 30 20 29 7b 0a 20 20 20  pFree)!=0 ){.   
7130: 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
7140: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
7150: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7160: 66 72 65 65 28 70 44 65 6c 29 3b 0a 20 20 20 20  free(pDel);.    
7170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
7190: 65 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ee==0 );.      s
71a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 20 61 70 4c  qlite3_free( apL
71b0: 65 61 66 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  eaf );.    }.  }
71c0: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
71d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
71e0: 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65  ite3Fts3ExprFree
71f0: 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 70 52 6f  (pRoot);.    pRo
7200: 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ot = 0;.  }.  *p
7210: 70 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 72 65 74  p = pRoot;.  ret
7220: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7230: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7240: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
7250: 69 74 65 33 46 74 73 33 45 78 70 72 50 61 72 73  ite3Fts3ExprPars
7260: 65 28 29 2c 20 77 69 74 68 20 74 68 65 20 66 6f  e(), with the fo
7270: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 64 69 66 66 65  llowing.** diffe
7280: 72 65 6e 63 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rences:.**.**   
7290: 31 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 64  1. It does not d
72a0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 62  o expression reb
72b0: 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 20 20 20 32  alancing..**   2
72c0: 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68  . It does not ch
72d0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 78 70  eck that the exp
72e0: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
72f0: 20 65 78 63 65 65 64 20 74 68 65 20 0a 2a 2a 20   exceed the .** 
7300: 20 20 20 20 20 6d 61 78 69 6d 75 6d 20 61 6c 6c       maximum all
7310: 6f 77 61 62 6c 65 20 64 65 70 74 68 2e 0a 2a 2a  owable depth..**
7320: 20 20 20 33 2e 20 45 76 65 6e 20 69 66 20 69 74     3. Even if it
7330: 20 66 61 69 6c 73 2c 20 2a 70 70 45 78 70 72 20   fails, *ppExpr 
7340: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73 65 74  may still be set
7350: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20   to point to an 
7360: 0a 2a 2a 20 20 20 20 20 20 65 78 70 72 65 73 73  .**      express
7370: 69 6f 6e 20 74 72 65 65 2e 20 49 74 20 73 68 6f  ion tree. It sho
7380: 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64 20 75  uld be deleted u
7390: 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73 33  sing sqlite3Fts3
73a0: 45 78 70 72 46 72 65 65 28 29 0a 2a 2a 20 20 20  ExprFree().**   
73b0: 20 20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e     in this case.
73c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
73d0: 74 73 33 45 78 70 72 50 61 72 73 65 55 6e 62 61  ts3ExprParseUnba
73e0: 6c 61 6e 63 65 64 28 0a 20 20 73 71 6c 69 74 65  lanced(.  sqlite
73f0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  3_tokenizer *pTo
7400: 6b 65 6e 69 7a 65 72 2c 20 20 20 20 20 20 2f 2a  kenizer,      /*
7410: 20 54 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c   Tokenizer modul
7420: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
7430: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
7440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
7450: 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20 74 6f  nguage id for to
7460: 6b 65 6e 69 7a 65 72 20 2a 2f 0a 20 20 63 68 61  kenizer */.  cha
7470: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 20 20  r **azCol,      
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
74a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 66 74  umn names for ft
74b0: 73 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  s3 table */.  in
74c0: 74 20 62 46 74 73 34 2c 20 20 20 20 20 20 20 20  t bFts4,        
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c 6c    /* True to all
74f0: 6f 77 20 46 54 53 34 2d 6f 6e 6c 79 20 73 79 6e  ow FTS4-only syn
7500: 74 61 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  tax */.  int nCo
7510: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7530: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
7540: 73 20 69 6e 20 61 7a 43 6f 6c 5b 5d 20 2a 2f 0a  s in azCol[] */.
7550: 20 20 69 6e 74 20 69 44 65 66 61 75 6c 74 43 6f    int iDefaultCo
7560: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7570: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
7580: 20 63 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72 79   column to query
7590: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
75a0: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
75b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
75c0: 74 20 6f 66 20 4d 41 54 43 48 20 71 75 65 72 79  t of MATCH query
75d0: 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
75e0: 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20 20  *ppExpr         
75f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7600: 3a 20 50 61 72 73 65 64 20 71 75 65 72 79 20 73  : Parsed query s
7610: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
7620: 20 69 6e 74 20 6e 50 61 72 73 65 64 3b 0a 20 20   int nParsed;.  
7630: 69 6e 74 20 72 63 3b 0a 20 20 50 61 72 73 65 43  int rc;.  ParseC
7640: 6f 6e 74 65 78 74 20 73 50 61 72 73 65 3b 0a 0a  ontext sParse;..
7650: 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65    memset(&sParse
7660: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 61 72 73  , 0, sizeof(Pars
7670: 65 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 73 50  eContext));.  sP
7680: 61 72 73 65 2e 70 54 6f 6b 65 6e 69 7a 65 72 20  arse.pTokenizer 
7690: 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  = pTokenizer;.  
76a0: 73 50 61 72 73 65 2e 69 4c 61 6e 67 69 64 20 3d  sParse.iLangid =
76b0: 20 69 4c 61 6e 67 69 64 3b 0a 20 20 73 50 61 72   iLangid;.  sPar
76c0: 73 65 2e 61 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  se.azCol = (cons
76d0: 74 20 63 68 61 72 20 2a 2a 29 61 7a 43 6f 6c 3b  t char **)azCol;
76e0: 0a 20 20 73 50 61 72 73 65 2e 6e 43 6f 6c 20 3d  .  sParse.nCol =
76f0: 20 6e 43 6f 6c 3b 0a 20 20 73 50 61 72 73 65 2e   nCol;.  sParse.
7700: 69 44 65 66 61 75 6c 74 43 6f 6c 20 3d 20 69 44  iDefaultCol = iD
7710: 65 66 61 75 6c 74 43 6f 6c 3b 0a 20 20 73 50 61  efaultCol;.  sPa
7720: 72 73 65 2e 62 46 74 73 34 20 3d 20 62 46 74 73  rse.bFts4 = bFts
7730: 34 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  4;.  if( z==0 ){
7740: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 30  .    *ppExpr = 0
7750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
7760: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
7770: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ( n<0 ){.    n =
7780: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b   (int)strlen(z);
7790: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33  .  }.  rc = fts3
77a0: 45 78 70 72 50 61 72 73 65 28 26 73 50 61 72 73  ExprParse(&sPars
77b0: 65 2c 20 7a 2c 20 6e 2c 20 70 70 45 78 70 72 2c  e, z, n, ppExpr,
77c0: 20 26 6e 50 61 72 73 65 64 29 3b 0a 20 20 61 73   &nParsed);.  as
77d0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
77e0: 5f 4f 4b 20 7c 7c 20 2a 70 70 45 78 70 72 3d 3d  _OK || *ppExpr==
77f0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
7800: 20 66 6f 72 20 6d 69 73 6d 61 74 63 68 65 64 20   for mismatched 
7810: 70 61 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a 20  parenthesis */. 
7820: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7830: 4f 4b 20 26 26 20 73 50 61 72 73 65 2e 6e 4e 65  OK && sParse.nNe
7840: 73 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  st ){.    rc = S
7850: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
7860: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
7870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7880: 74 65 72 73 20 7a 20 61 6e 64 20 6e 20 63 6f 6e  ters z and n con
7890: 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
78a0: 6f 20 61 6e 64 20 6c 65 6e 67 74 68 20 6f 66 20  o and length of 
78b0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
78c0: 69 6e 67 0a 2a 2a 20 61 6e 20 66 74 73 33 20 71  ing.** an fts3 q
78d0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
78e0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 54   respectively. T
78f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
7900: 65 6d 70 74 73 20 74 6f 20 70 61 72 73 65 20 74  empts to parse t
7910: 68 65 0a 2a 2a 20 71 75 65 72 79 20 65 78 70 72  he.** query expr
7920: 65 73 73 69 6f 6e 20 61 6e 64 20 63 72 65 61 74  ession and creat
7930: 65 20 61 20 74 72 65 65 20 6f 66 20 46 74 73 33  e a tree of Fts3
7940: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 73 20  Expr structures 
7950: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
7960: 0a 2a 2a 20 70 61 72 73 65 64 20 65 78 70 72 65  .** parsed expre
7970: 73 73 69 6f 6e 2e 20 49 66 20 73 75 63 63 65 73  ssion. If succes
7980: 73 66 75 6c 2c 20 2a 70 70 45 78 70 72 20 69 73  sful, *ppExpr is
7990: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
79a0: 20 74 68 65 20 68 65 61 64 0a 2a 2a 20 6f 66 20   the head.** of 
79b0: 74 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  the parsed expre
79c0: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 53  ssion tree and S
79d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
79e0: 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
79f0: 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 65 69 74  r.** occurs, eit
7a00: 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
7a10: 20 28 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20   (out-of-memory 
7a20: 65 72 72 6f 72 29 20 6f 72 20 53 51 4c 49 54 45  error) or SQLITE
7a30: 5f 45 52 52 4f 52 20 28 70 61 72 73 65 0a 2a 2a  _ERROR (parse.**
7a40: 20 65 72 72 6f 72 29 20 69 73 20 72 65 74 75 72   error) is retur
7a50: 6e 65 64 20 61 6e 64 20 2a 70 70 45 78 70 72 20  ned and *ppExpr 
7a60: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
7a70: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
7a80: 6e 20 69 73 20 61 20 6e 65 67 61 74 69 76 65 20  n is a negative 
7a90: 6e 75 6d 62 65 72 2c 20 74 68 65 6e 20 7a 20 69  number, then z i
7aa0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
7ab0: 6e 74 20 74 6f 20 61 0a 2a 2a 20 6e 75 6c 2d 74  nt to a.** nul-t
7ac0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
7ad0: 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 20   and the length 
7ae0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 75 73  is determined us
7af0: 69 6e 67 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2a  ing strlen()..**
7b00: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
7b10: 72 61 6d 65 74 65 72 2c 20 70 54 6f 6b 65 6e 69  rameter, pTokeni
7b20: 7a 65 72 2c 20 69 73 20 70 61 73 73 65 64 20 74  zer, is passed t
7b30: 68 65 20 66 74 73 33 20 74 6f 6b 65 6e 69 7a 65  he fts3 tokenize
7b40: 72 20 6d 6f 64 75 6c 65 20 74 6f 0a 2a 2a 20 75  r module to.** u
7b50: 73 65 20 74 6f 20 6e 6f 72 6d 61 6c 69 7a 65 20  se to normalize 
7b60: 71 75 65 72 79 20 74 6f 6b 65 6e 73 20 77 68 69  query tokens whi
7b70: 6c 65 20 70 61 72 73 69 6e 67 20 74 68 65 20 65  le parsing the e
7b80: 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 65 20 61  xpression. The a
7b90: 7a 43 6f 6c 5b 5d 0a 2a 2a 20 61 72 72 61 79 2c  zCol[].** array,
7ba0: 20 77 68 69 63 68 20 69 73 20 61 73 73 75 6d 65   which is assume
7bb0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6e 43 6f  d to contain nCo
7bc0: 6c 20 65 6e 74 72 69 65 73 2c 20 73 68 6f 75 6c  l entries, shoul
7bd0: 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  d contain the na
7be0: 6d 65 73 0a 2a 2a 20 6f 66 20 65 61 63 68 20 63  mes.** of each c
7bf0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 72  olumn in the tar
7c00: 67 65 74 20 66 74 73 33 20 74 61 62 6c 65 2c 20  get fts3 table, 
7c10: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65  in order from le
7c20: 66 74 20 74 6f 20 72 69 67 68 74 2e 20 0a 2a 2a  ft to right. .**
7c30: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6d 75   Column names mu
7c40: 73 74 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  st be nul-termin
7c50: 61 74 65 64 20 73 74 72 69 6e 67 73 2e 0a 2a 2a  ated strings..**
7c60: 0a 2a 2a 20 54 68 65 20 69 44 65 66 61 75 6c 74  .** The iDefault
7c70: 43 6f 6c 20 70 61 72 61 6d 65 74 65 72 20 73 68  Col parameter sh
7c80: 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
7c90: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
7ca0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
7cb0: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
7cc0: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
7cd0: 64 65 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  de of the MATCH 
7ce0: 6f 70 65 72 61 74 6f 72 20 28 74 68 65 20 64 65  operator (the de
7cf0: 66 61 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  fault.** column 
7d00: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
7d10: 20 66 6f 72 20 74 6f 6b 65 6e 73 20 66 6f 72 20   for tokens for 
7d20: 77 68 69 63 68 20 61 20 63 6f 6c 75 6d 6e 20 6e  which a column n
7d30: 61 6d 65 20 69 73 20 6e 6f 74 20 65 78 70 6c 69  ame is not expli
7d40: 63 69 74 6c 79 0a 2a 2a 20 73 70 65 63 69 66 69  citly.** specifi
7d50: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
7d60: 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 29 2c  e query string),
7d70: 20 6f 72 20 2d 31 20 69 66 20 74 6f 6b 65 6e 73   or -1 if tokens
7d80: 20 6d 61 79 20 62 79 20 64 65 66 61 75 6c 74 0a   may by default.
7d90: 2a 2a 20 6d 61 74 63 68 20 61 6e 79 20 74 61 62  ** match any tab
7da0: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 69 6e  le column..*/.in
7db0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70  t sqlite3Fts3Exp
7dc0: 72 50 61 72 73 65 28 0a 20 20 73 71 6c 69 74 65  rParse(.  sqlite
7dd0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  3_tokenizer *pTo
7de0: 6b 65 6e 69 7a 65 72 2c 20 20 20 20 20 20 2f 2a  kenizer,      /*
7df0: 20 54 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c   Tokenizer modul
7e00: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
7e10: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
7e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
7e30: 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20 74 6f  nguage id for to
7e40: 6b 65 6e 69 7a 65 72 20 2a 2f 0a 20 20 63 68 61  kenizer */.  cha
7e50: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 20 20  r **azCol,      
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
7e80: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 66 74  umn names for ft
7e90: 73 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  s3 table */.  in
7ea0: 74 20 62 46 74 73 34 2c 20 20 20 20 20 20 20 20  t bFts4,        
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c 6c    /* True to all
7ed0: 6f 77 20 46 54 53 34 2d 6f 6e 6c 79 20 73 79 6e  ow FTS4-only syn
7ee0: 74 61 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  tax */.  int nCo
7ef0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f10: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
7f20: 73 20 69 6e 20 61 7a 43 6f 6c 5b 5d 20 2a 2f 0a  s in azCol[] */.
7f30: 20 20 69 6e 74 20 69 44 65 66 61 75 6c 74 43 6f    int iDefaultCo
7f40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7f50: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
7f60: 20 63 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72 79   column to query
7f70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7f80: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
7f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
7fa0: 74 20 6f 66 20 4d 41 54 43 48 20 71 75 65 72 79  t of MATCH query
7fb0: 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
7fc0: 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20  *ppExpr,        
7fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7fe0: 3a 20 50 61 72 73 65 64 20 71 75 65 72 79 20 73  : Parsed query s
7ff0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63 68  tructure */.  ch
8000: 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20  ar **pzErr      
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
8030: 6d 65 73 73 61 67 65 20 28 73 71 6c 69 74 65 33  message (sqlite3
8040: 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20  _malloc) */.){. 
8050: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 45 78   int rc = fts3Ex
8060: 70 72 50 61 72 73 65 55 6e 62 61 6c 61 6e 63 65  prParseUnbalance
8070: 64 28 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69  d(.      pTokeni
8080: 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 61 7a  zer, iLangid, az
8090: 43 6f 6c 2c 20 62 46 74 73 34 2c 20 6e 43 6f 6c  Col, bFts4, nCol
80a0: 2c 20 69 44 65 66 61 75 6c 74 43 6f 6c 2c 20 7a  , iDefaultCol, z
80b0: 2c 20 6e 2c 20 70 70 45 78 70 72 0a 20 20 29 3b  , n, ppExpr.  );
80c0: 0a 20 20 0a 20 20 2f 2a 20 52 65 62 61 6c 61 6e  .  .  /* Rebalan
80d0: 63 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ce the expressio
80e0: 6e 2e 20 41 6e 64 20 63 68 65 63 6b 20 74 68 61  n. And check tha
80f0: 74 20 69 74 73 20 64 65 70 74 68 20 64 6f 65 73  t its depth does
8100: 20 6e 6f 74 20 65 78 63 65 65 64 0a 20 20 2a 2a   not exceed.  **
8110: 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 4d 41 58   SQLITE_FTS3_MAX
8120: 5f 45 58 50 52 5f 44 45 50 54 48 2e 20 20 2a 2f  _EXPR_DEPTH.  */
8130: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8140: 45 5f 4f 4b 20 26 26 20 2a 70 70 45 78 70 72 20  E_OK && *ppExpr 
8150: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
8160: 45 78 70 72 42 61 6c 61 6e 63 65 28 70 70 45 78  ExprBalance(ppEx
8170: 70 72 2c 20 53 51 4c 49 54 45 5f 46 54 53 33 5f  pr, SQLITE_FTS3_
8180: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 29 3b  MAX_EXPR_DEPTH);
8190: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
81a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
81b0: 72 63 20 3d 20 66 74 73 33 45 78 70 72 43 68 65  rc = fts3ExprChe
81c0: 63 6b 44 65 70 74 68 28 2a 70 70 45 78 70 72 2c  ckDepth(*ppExpr,
81d0: 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 4d 41 58   SQLITE_FTS3_MAX
81e0: 5f 45 58 50 52 5f 44 45 50 54 48 29 3b 0a 20 20  _EXPR_DEPTH);.  
81f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
8200: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8210: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45      sqlite3Fts3E
8220: 78 70 72 46 72 65 65 28 2a 70 70 45 78 70 72 29  xprFree(*ppExpr)
8230: 3b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  ;.    *ppExpr = 
8240: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
8250: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a  QLITE_TOOBIG ){.
8260: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
8270: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
8280: 20 20 20 20 20 20 20 20 20 20 22 46 54 53 20 65            "FTS e
8290: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
82a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
82b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
82c0: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
82d0: 54 45 5f 46 54 53 33 5f 4d 41 58 5f 45 58 50 52  TE_FTS3_MAX_EXPR
82e0: 5f 44 45 50 54 48 0a 20 20 20 20 20 20 29 3b 0a  _DEPTH.      );.
82f0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8300: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
8310: 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
8320: 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  E_ERROR ){.     
8330: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
8340: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
8350: 72 6d 65 64 20 4d 41 54 43 48 20 65 78 70 72 65  rmed MATCH expre
8360: 73 73 69 6f 6e 3a 20 5b 25 73 5d 22 2c 20 7a 29  ssion: [%s]", z)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
8380: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8390: 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67 6c 65  ** Free a single
83a0: 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78 70 72   node of an expr
83b0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
83c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
83d0: 46 72 65 65 45 78 70 72 4e 6f 64 65 28 46 74 73  FreeExprNode(Fts
83e0: 33 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73  3Expr *p){.  ass
83f0: 65 72 74 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46  ert( p->eType==F
8400: 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 7c  TSQUERY_PHRASE |
8410: 7c 20 70 2d 3e 70 50 68 72 61 73 65 3d 3d 30 20  | p->pPhrase==0 
8420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
8430: 45 76 61 6c 50 68 72 61 73 65 43 6c 65 61 6e 75  EvalPhraseCleanu
8440: 70 28 70 2d 3e 70 50 68 72 61 73 65 29 3b 0a 20  p(p->pPhrase);. 
8450: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
8460: 3e 61 4d 49 29 3b 0a 20 20 73 71 6c 69 74 65 33  >aMI);.  sqlite3
8470: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
8480: 2a 2a 20 46 72 65 65 20 61 20 70 61 72 73 65 64  ** Free a parsed
8490: 20 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72   fts3 query expr
84a0: 65 73 73 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64  ession allocated
84b0: 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 33 45   by sqlite3Fts3E
84c0: 78 70 72 50 61 72 73 65 28 29 2e 0a 2a 2a 0a 2a  xprParse()..**.*
84d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
84e0: 77 6f 75 6c 64 20 62 65 20 73 69 6d 70 6c 65 72  would be simpler
84f0: 20 69 66 20 69 74 20 72 65 63 75 72 73 69 76 65   if it recursive
8500: 6c 79 20 63 61 6c 6c 65 64 20 69 74 73 65 6c 66  ly called itself
8510: 2e 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 77 6f  . But.** that wo
8520: 75 6c 64 20 6d 65 61 6e 20 70 61 73 73 69 6e 67  uld mean passing
8530: 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20   a sufficiently 
8540: 6c 61 72 67 65 20 65 78 70 72 65 73 73 69 6f 6e  large expression
8550: 20 74 6f 20 45 78 70 72 50 61 72 73 65 28 29 0a   to ExprParse().
8560: 2a 2a 20 63 6f 75 6c 64 20 63 61 75 73 65 20 61  ** could cause a
8570: 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 2e   stack overflow.
8580: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8590: 46 74 73 33 45 78 70 72 46 72 65 65 28 46 74 73  Fts3ExprFree(Fts
85a0: 33 45 78 70 72 20 2a 70 44 65 6c 29 7b 0a 20 20  3Expr *pDel){.  
85b0: 46 74 73 33 45 78 70 72 20 2a 70 3b 0a 20 20 61  Fts3Expr *p;.  a
85c0: 73 73 65 72 74 28 20 70 44 65 6c 3d 3d 30 20 7c  ssert( pDel==0 |
85d0: 7c 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3d  | pDel->pParent=
85e0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  =0 );.  for(p=pD
85f0: 65 6c 3b 20 70 20 26 26 20 28 70 2d 3e 70 4c 65  el; p && (p->pLe
8600: 66 74 7c 7c 70 2d 3e 70 52 69 67 68 74 29 3b 20  ft||p->pRight); 
8610: 70 3d 28 70 2d 3e 70 4c 65 66 74 20 3f 20 70 2d  p=(p->pLeft ? p-
8620: 3e 70 4c 65 66 74 20 3a 20 70 2d 3e 70 52 69 67  >pLeft : p->pRig
8630: 68 74 29 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ht)){.    assert
8640: 28 20 70 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  ( p->pParent==0 
8650: 7c 7c 20 70 3d 3d 70 2d 3e 70 50 61 72 65 6e 74  || p==p->pParent
8660: 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 3d 3d 70  ->pRight || p==p
8670: 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  ->pParent->pLeft
8680: 20 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   );.  }.  while(
8690: 20 70 20 29 7b 0a 20 20 20 20 46 74 73 33 45 78   p ){.    Fts3Ex
86a0: 70 72 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 2d  pr *pParent = p-
86b0: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 66 74  >pParent;.    ft
86c0: 73 33 46 72 65 65 45 78 70 72 4e 6f 64 65 28 70  s3FreeExprNode(p
86d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 65  );.    if( pPare
86e0: 6e 74 20 26 26 20 70 3d 3d 70 50 61 72 65 6e 74  nt && p==pParent
86f0: 2d 3e 70 4c 65 66 74 20 26 26 20 70 50 61 72 65  ->pLeft && pPare
8700: 6e 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  nt->pRight ){.  
8710: 20 20 20 20 70 20 3d 20 70 50 61 72 65 6e 74 2d      p = pParent-
8720: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 77  >pRight;.      w
8730: 68 69 6c 65 28 20 70 20 26 26 20 28 70 2d 3e 70  hile( p && (p->p
8740: 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68  Left || p->pRigh
8750: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  t) ){.        as
8760: 73 65 72 74 28 20 70 3d 3d 70 2d 3e 70 50 61 72  sert( p==p->pPar
8770: 65 6e 74 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  ent->pRight || p
8780: 3d 3d 70 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c  ==p->pParent->pL
8790: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  eft );.        p
87a0: 20 3d 20 28 70 2d 3e 70 4c 65 66 74 20 3f 20 70   = (p->pLeft ? p
87b0: 2d 3e 70 4c 65 66 74 20 3a 20 70 2d 3e 70 52 69  ->pLeft : p->pRi
87c0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ght);.      }.  
87d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87e0: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
87f0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  }.  }.}../******
8800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8840: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
8850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8890: 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69  ****.** Everythi
88a0: 6e 67 20 61 66 74 65 72 20 74 68 69 73 20 70 6f  ng after this po
88b0: 69 6e 74 20 69 73 20 6a 75 73 74 20 74 65 73 74  int is just test
88c0: 20 63 6f 64 65 2e 0a 2a 2f 0a 0a 23 69 66 64 65   code..*/..#ifde
88d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 0a 23  f SQLITE_TEST..#
88e0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
88f0: 3e 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  >../*.** Functio
8900: 6e 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 68  n to query the h
8910: 61 73 68 2d 74 61 62 6c 65 20 6f 66 20 74 6f 6b  ash-table of tok
8920: 65 6e 69 7a 65 72 73 20 28 73 65 65 20 52 45 41  enizers (see REA
8930: 44 4d 45 2e 74 6f 6b 65 6e 69 7a 65 72 73 29 2e  DME.tokenizers).
8940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
8950: 75 65 72 79 54 65 73 74 54 6f 6b 65 6e 69 7a 65  ueryTestTokenize
8960: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
8970: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
8980: 2a 7a 4e 61 6d 65 2c 20 20 0a 20 20 63 6f 6e 73  *zName,  .  cons
8990: 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  t sqlite3_tokeni
89a0: 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a  zer_module **pp.
89b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
89c0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
89d0: 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mt;.  const char
89e0: 20 7a 53 71 6c 5b 5d 20 3d 20 22 53 45 4c 45 43   zSql[] = "SELEC
89f0: 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
8a00: 28 3f 29 22 3b 0a 0a 20 20 2a 70 70 20 3d 20 30  (?)";..  *pp = 0
8a10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8a20: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
8a30: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
8a40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8a50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8a60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8a70: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
8a80: 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
8a90: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
8aa0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
8ab0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
8ac0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
8ad0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
8ae0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
8af0: 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45  Stmt, 0)==SQLITE
8b00: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 6d  _BLOB ){.      m
8b10: 65 6d 63 70 79 28 28 76 6f 69 64 20 2a 29 70 70  emcpy((void *)pp
8b20: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
8b30: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c  _blob(pStmt, 0),
8b40: 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20   sizeof(*pp));. 
8b50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8b60: 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
8b70: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  ize(pStmt);.}../
8b80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
8b90: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
8ba0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  r containing a t
8bb0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
8bc0: 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  on of the.** exp
8bd0: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
8be0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
8bf0: 6d 65 6e 74 2e 20 54 68 65 20 62 75 66 66 65 72  ment. The buffer
8c00: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
8c10: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
8c20: 6c 6f 63 28 29 2e 20 49 74 20 69 73 20 74 68 65  loc(). It is the
8c30: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
8c40: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
8c50: 20 75 73 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   use .** sqlite3
8c60: 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
8c70: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 2e 20 49  se the memory. I
8c80: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
8c90: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
8ca0: 64 2c 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  d,.** NULL is re
8cb0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
8cc0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8cd0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
8ce0: 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
8cf0: 6e 74 73 20 61 72 65 20 70 72 65 70 65 6e 64 65  nts are prepende
8d00: 64 20 74 6f 20 0a 2a 2a 20 74 68 65 20 72 65 74  d to .** the ret
8d10: 75 72 6e 65 64 20 65 78 70 72 65 73 73 69 6f 6e  urned expression
8d20: 20 74 65 78 74 20 61 6e 64 20 74 68 65 6e 20 66   text and then f
8d30: 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
8d40: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
8d50: 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 54  atic char *exprT
8d60: 6f 53 74 72 69 6e 67 28 46 74 73 33 45 78 70 72  oString(Fts3Expr
8d70: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 2a 7a   *pExpr, char *z
8d80: 42 75 66 29 7b 0a 20 20 69 66 28 20 70 45 78 70  Buf){.  if( pExp
8d90: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
8da0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  rn sqlite3_mprin
8db0: 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 73 77  tf("");.  }.  sw
8dc0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79  itch( pExpr->eTy
8dd0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46  pe ){.    case F
8de0: 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 3a 20  TSQUERY_PHRASE: 
8df0: 7b 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61  {.      Fts3Phra
8e00: 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45  se *pPhrase = pE
8e10: 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20  xpr->pPhrase;.  
8e20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
8e30: 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   zBuf = sqlite3_
8e40: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
8e50: 20 20 20 22 25 7a 50 48 52 41 53 45 20 25 64 20     "%zPHRASE %d 
8e60: 30 22 2c 20 7a 42 75 66 2c 20 70 50 68 72 61 73  0", zBuf, pPhras
8e70: 65 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  e->iColumn);.   
8e80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42 75 66     for(i=0; zBuf
8e90: 20 26 26 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e   && i<pPhrase->n
8ea0: 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
8eb0: 20 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69       zBuf = sqli
8ec0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20  te3_mprintf("%z 
8ed0: 25 2e 2a 73 25 73 22 2c 20 7a 42 75 66 2c 20 0a  %.*s%s", zBuf, .
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 68 72              pPhr
8ef0: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 6e  ase->aToken[i].n
8f00: 2c 20 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  , pPhrase->aToke
8f10: 6e 5b 69 5d 2e 7a 2c 0a 20 20 20 20 20 20 20 20  n[i].z,.        
8f20: 20 20 20 20 28 70 50 68 72 61 73 65 2d 3e 61 54      (pPhrase->aT
8f30: 6f 6b 65 6e 5b 69 5d 2e 69 73 50 72 65 66 69 78  oken[i].isPrefix
8f40: 3f 22 2b 22 3a 22 22 29 0a 20 20 20 20 20 20 20  ?"+":"").       
8f50: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
8f60: 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 20    return zBuf;. 
8f70: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 46     }..    case F
8f80: 54 53 51 55 45 52 59 5f 4e 45 41 52 3a 0a 20 20  TSQUERY_NEAR:.  
8f90: 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74      zBuf = sqlit
8fa0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 4e 45  e3_mprintf("%zNE
8fb0: 41 52 2f 25 64 20 22 2c 20 7a 42 75 66 2c 20 70  AR/%d ", zBuf, p
8fc0: 45 78 70 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20  Expr->nNear);.  
8fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8fe0: 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e 4f 54  ase FTSQUERY_NOT
8ff0: 3a 0a 20 20 20 20 20 20 7a 42 75 66 20 3d 20 73  :.      zBuf = s
9000: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9010: 25 7a 4e 4f 54 20 22 2c 20 7a 42 75 66 29 3b 0a  %zNOT ", zBuf);.
9020: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9030: 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 41   case FTSQUERY_A
9040: 4e 44 3a 0a 20 20 20 20 20 20 7a 42 75 66 20 3d  ND:.      zBuf =
9050: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9060: 28 22 25 7a 41 4e 44 20 22 2c 20 7a 42 75 66 29  ("%zAND ", zBuf)
9070: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9080: 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59     case FTSQUERY
9090: 5f 4f 52 3a 0a 20 20 20 20 20 20 7a 42 75 66 20  _OR:.      zBuf 
90a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
90b0: 66 28 22 25 7a 4f 52 20 22 2c 20 7a 42 75 66 29  f("%zOR ", zBuf)
90c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
90d0: 20 7d 0a 0a 20 20 69 66 28 20 7a 42 75 66 20 29   }..  if( zBuf )
90e0: 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   zBuf = sqlite3_
90f0: 6d 70 72 69 6e 74 66 28 22 25 7a 7b 22 2c 20 7a  mprintf("%z{", z
9100: 42 75 66 29 3b 0a 20 20 69 66 28 20 7a 42 75 66  Buf);.  if( zBuf
9110: 20 29 20 7a 42 75 66 20 3d 20 65 78 70 72 54 6f   ) zBuf = exprTo
9120: 53 74 72 69 6e 67 28 70 45 78 70 72 2d 3e 70 4c  String(pExpr->pL
9130: 65 66 74 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66  eft, zBuf);.  if
9140: 28 20 7a 42 75 66 20 29 20 7a 42 75 66 20 3d 20  ( zBuf ) zBuf = 
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9160: 22 25 7a 7d 20 7b 22 2c 20 7a 42 75 66 29 3b 0a  "%z} {", zBuf);.
9170: 0a 20 20 69 66 28 20 7a 42 75 66 20 29 20 7a 42  .  if( zBuf ) zB
9180: 75 66 20 3d 20 65 78 70 72 54 6f 53 74 72 69 6e  uf = exprToStrin
9190: 67 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  g(pExpr->pRight,
91a0: 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 7a 42   zBuf);.  if( zB
91b0: 75 66 20 29 20 7a 42 75 66 20 3d 20 73 71 6c 69  uf ) zBuf = sqli
91c0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 7d  te3_mprintf("%z}
91d0: 22 2c 20 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74  ", zBuf);..  ret
91e0: 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn zBuf;.}../*.
91f0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 69  ** This is the i
9200: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
9210: 20 61 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75   a scalar SQL fu
9220: 6e 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  nction used to t
9230: 65 73 74 20 74 68 65 20 0a 2a 2a 20 65 78 70 72  est the .** expr
9240: 65 73 73 69 6f 6e 20 70 61 72 73 65 72 2e 20 49  ession parser. I
9250: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  t should be call
9260: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
9270: 2a 0a 2a 2a 20 20 20 66 74 73 33 5f 65 78 70 72  *.**   fts3_expr
9280: 74 65 73 74 28 3c 74 6f 6b 65 6e 69 7a 65 72 3e  test(<tokenizer>
9290: 2c 20 3c 65 78 70 72 3e 2c 20 3c 63 6f 6c 75 6d  , <expr>, <colum
92a0: 6e 20 31 3e 2c 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  n 1>, ...);.**.*
92b0: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
92c0: 6d 65 6e 74 2c 20 3c 74 6f 6b 65 6e 69 7a 65 72  ment, <tokenizer
92d0: 3e 2c 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  >, is the name o
92e0: 66 20 74 68 65 20 66 74 73 33 20 74 6f 6b 65 6e  f the fts3 token
92f0: 69 7a 65 72 20 75 73 65 64 0a 2a 2a 20 74 6f 20  izer used.** to 
9300: 70 61 72 73 65 20 74 68 65 20 71 75 65 72 79 20  parse the query 
9310: 65 78 70 72 65 73 73 69 6f 6e 20 28 73 65 65 20  expression (see 
9320: 52 45 41 44 4d 45 2e 74 6f 6b 65 6e 69 7a 65 72  README.tokenizer
9330: 73 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  s). The second a
9340: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 74 68  rgument.** is th
9350: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
9360: 6f 6e 20 74 6f 20 70 61 72 73 65 2e 20 45 61 63  on to parse. Eac
9370: 68 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  h subsequent arg
9380: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
9390: 65 0a 2a 2a 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  e.** of a column
93a0: 20 6f 66 20 74 68 65 20 66 74 73 33 20 74 61 62   of the fts3 tab
93b0: 6c 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72  le that the quer
93c0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79  y expression may
93d0: 20 72 65 66 65 72 20 74 6f 2e 0a 2a 2a 20 46 6f   refer to..** Fo
93e0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
93f0: 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f 65     SELECT fts3_e
9400: 78 70 72 74 65 73 74 28 27 73 69 6d 70 6c 65 27  xprtest('simple'
9410: 2c 20 27 42 69 6c 6c 20 63 6f 6c 32 3a 42 6c 6f  , 'Bill col2:Blo
9420: 67 67 73 27 2c 20 27 63 6f 6c 31 27 2c 20 27 63  ggs', 'col1', 'c
9430: 6f 6c 32 27 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ol2');.*/.static
9440: 20 76 6f 69 64 20 66 74 73 33 45 78 70 72 54 65   void fts3ExprTe
9450: 73 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  st(.  sqlite3_co
9460: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
9470: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
9480: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
9490: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
94a0: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
94b0: 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20   const *pModule 
94c0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  = 0;.  sqlite3_t
94d0: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
94e0: 69 7a 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  izer = 0;.  int 
94f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43  rc;.  char **azC
9500: 6f 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  ol = 0;.  const 
9510: 63 68 61 72 20 2a 7a 45 78 70 72 3b 0a 20 20 69  char *zExpr;.  i
9520: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20  nt nExpr;.  int 
9530: 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  nCol;.  int ii;.
9540: 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
9550: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  r;.  char *zBuf 
9560: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
9570: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
9580: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
9590: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 69 66 28 20  ontext);..  if( 
95a0: 61 72 67 63 3c 33 20 29 7b 0a 20 20 20 20 73 71  argc<3 ){.    sq
95b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
95c0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20  or(context, .   
95d0: 20 20 20 20 20 22 55 73 61 67 65 3a 20 66 74 73       "Usage: fts
95e0: 33 5f 65 78 70 72 74 65 73 74 28 74 6f 6b 65 6e  3_exprtest(token
95f0: 69 7a 65 72 2c 20 65 78 70 72 2c 20 63 6f 6c 31  izer, expr, col1
9600: 2c 20 2e 2e 2e 22 2c 20 2d 31 0a 20 20 20 20 29  , ...", -1.    )
9610: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9620: 7d 0a 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  }..  rc = queryT
9630: 65 73 74 54 6f 6b 65 6e 69 7a 65 72 28 64 62 2c  estTokenizer(db,
9640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9650: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
9660: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
9670: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9680: 5b 30 5d 29 2c 20 26 70 4d 6f 64 75 6c 65 29 3b  [0]), &pModule);
9690: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
96a0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
96b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
96c0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
96d0: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 70  t);.    goto exp
96e0: 72 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d 65 6c  rtest_out;.  }el
96f0: 73 65 20 69 66 28 20 21 70 4d 6f 64 75 6c 65 20  se if( !pModule 
9700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9710: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9720: 65 78 74 2c 20 22 4e 6f 20 73 75 63 68 20 74 6f  ext, "No such to
9730: 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 22 2c  kenizer module",
9740: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9750: 78 70 72 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d  xprtest_out;.  }
9760: 0a 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  ..  rc = pModule
9770: 2d 3e 78 43 72 65 61 74 65 28 30 2c 20 30 2c 20  ->xCreate(0, 0, 
9780: 26 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20  &pTokenizer);.  
9790: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
97a0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d  TE_NOMEM || rc==
97b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
97c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
97d0: 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
97e0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
97f0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
9800: 20 20 20 20 67 6f 74 6f 20 65 78 70 72 74 65 73      goto exprtes
9810: 74 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 54 6f  t_out;.  }.  pTo
9820: 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65  kenizer->pModule
9830: 20 3d 20 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 7a   = pModule;..  z
9840: 45 78 70 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  Expr = (const ch
9850: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
9860: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
9870: 3b 0a 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69  ;.  nExpr = sqli
9880: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9890: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 43 6f 6c  argv[1]);.  nCol
98a0: 20 3d 20 61 72 67 63 2d 32 3b 0a 20 20 61 7a 43   = argc-2;.  azC
98b0: 6f 6c 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ol = (char **)sq
98c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 6f  lite3_malloc(nCo
98d0: 6c 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  l*sizeof(char *)
98e0: 29 3b 0a 20 20 69 66 28 20 21 61 7a 43 6f 6c 20  );.  if( !azCol 
98f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9900: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
9910: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
9920: 67 6f 74 6f 20 65 78 70 72 74 65 73 74 5f 6f 75  goto exprtest_ou
9930: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 69 3d  t;.  }.  for(ii=
9940: 30 3b 20 69 69 3c 6e 43 6f 6c 3b 20 69 69 2b 2b  0; ii<nCol; ii++
9950: 29 7b 0a 20 20 20 20 61 7a 43 6f 6c 5b 69 69 5d  ){.    azCol[ii]
9960: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9970: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9980: 67 76 5b 69 69 2b 32 5d 29 3b 0a 20 20 7d 0a 0a  gv[ii+2]);.  }..
9990: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 73    if( sqlite3_us
99a0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
99b0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
99c0: 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  ummy = 0;.    rc
99d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45 78   = sqlite3Fts3Ex
99e0: 70 72 50 61 72 73 65 28 0a 20 20 20 20 20 20 20  prParse(.       
99f0: 20 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 30 2c 20   pTokenizer, 0, 
9a00: 61 7a 43 6f 6c 2c 20 30 2c 20 6e 43 6f 6c 2c 20  azCol, 0, nCol, 
9a10: 6e 43 6f 6c 2c 20 7a 45 78 70 72 2c 20 6e 45 78  nCol, zExpr, nEx
9a20: 70 72 2c 20 26 70 45 78 70 72 2c 20 26 7a 44 75  pr, &pExpr, &zDu
9a30: 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  mmy.    );.    a
9a40: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
9a50: 45 5f 4f 4b 20 7c 7c 20 70 45 78 70 72 3d 3d 30  E_OK || pExpr==0
9a60: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
9a70: 66 72 65 65 28 7a 44 75 6d 6d 79 29 3b 0a 20 20  free(zDummy);.  
9a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
9a90: 66 74 73 33 45 78 70 72 50 61 72 73 65 55 6e 62  fts3ExprParseUnb
9aa0: 61 6c 61 6e 63 65 64 28 0a 20 20 20 20 20 20 20  alanced(.       
9ab0: 20 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 30 2c 20   pTokenizer, 0, 
9ac0: 61 7a 43 6f 6c 2c 20 30 2c 20 6e 43 6f 6c 2c 20  azCol, 0, nCol, 
9ad0: 6e 43 6f 6c 2c 20 7a 45 78 70 72 2c 20 6e 45 78  nCol, zExpr, nEx
9ae0: 70 72 2c 20 26 70 45 78 70 72 0a 20 20 20 20 29  pr, &pExpr.    )
9af0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
9b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
9b10: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
9b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
9b30: 33 45 78 70 72 46 72 65 65 28 70 45 78 70 72 29  3ExprFree(pExpr)
9b40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
9b50: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
9b60: 78 74 2c 20 22 45 72 72 6f 72 20 70 61 72 73 69  xt, "Error parsi
9b70: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  ng expression", 
9b80: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  -1);.  }else if(
9b90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
9ba0: 4d 20 7c 7c 20 21 28 7a 42 75 66 20 3d 20 65 78  M || !(zBuf = ex
9bb0: 70 72 54 6f 53 74 72 69 6e 67 28 70 45 78 70 72  prToString(pExpr
9bc0: 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  , 0)) ){.    sql
9bd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9be0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
9bf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9c00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
9c10: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
9c20: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
9c30: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
9c40: 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
9c50: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46  .  }..  sqlite3F
9c60: 74 73 33 45 78 70 72 46 72 65 65 28 70 45 78 70  ts3ExprFree(pExp
9c70: 72 29 3b 0a 0a 65 78 70 72 74 65 73 74 5f 6f 75  r);..exprtest_ou
9c80: 74 3a 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c 65  t:.  if( pModule
9c90: 20 26 26 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29   && pTokenizer )
9ca0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75  {.    rc = pModu
9cb0: 6c 65 2d 3e 78 44 65 73 74 72 6f 79 28 70 54 6f  le->xDestroy(pTo
9cc0: 6b 65 6e 69 7a 65 72 29 3b 0a 20 20 7d 0a 20 20  kenizer);.  }.  
9cd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
9ce0: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ol);.}../*.** Re
9cf0: 67 69 73 74 65 72 20 74 68 65 20 71 75 65 72 79  gister the query
9d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 72 73   expression pars
9d10: 65 72 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e  er test function
9d20: 20 66 74 73 33 5f 65 78 70 72 74 65 73 74 28 29   fts3_exprtest()
9d30: 20 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61   .** with databa
9d40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
9d50: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
9d60: 33 46 74 73 33 45 78 70 72 49 6e 69 74 54 65 73  3Fts3ExprInitTes
9d70: 74 49 6e 74 65 72 66 61 63 65 28 73 71 6c 69 74  tInterface(sqlit
9d80: 65 33 2a 20 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3* db){.  int r
9d90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
9da0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
9db0: 20 20 20 64 62 2c 20 22 66 74 73 33 5f 65 78 70     db, "fts3_exp
9dc0: 72 74 65 73 74 22 2c 20 2d 31 2c 20 53 51 4c 49  rtest", -1, SQLI
9dd0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 33  TE_UTF8, 0, fts3
9de0: 45 78 70 72 54 65 73 74 2c 20 30 2c 20 30 0a 20  ExprTest, 0, 0. 
9df0: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
9e00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
9e10: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
9e20: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
9e30: 22 66 74 73 33 5f 65 78 70 72 74 65 73 74 5f 72  "fts3_exprtest_r
9e40: 65 62 61 6c 61 6e 63 65 22 2c 20 0a 20 20 20 20  ebalance", .    
9e50: 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55      -1, SQLITE_U
9e60: 54 46 38 2c 20 28 76 6f 69 64 20 2a 29 31 2c 20  TF8, (void *)1, 
9e70: 66 74 73 33 45 78 70 72 54 65 73 74 2c 20 30 2c  fts3ExprTest, 0,
9e80: 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20   0.    );.  }.  
9e90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
9ea0: 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ndif.#endif /* !
9eb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
9ec0: 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORE) || defined(
9ed0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
9ee0: 53 33 29 20 2a 2f 0a                             S3) */.