/ Hex Artifact Content
Login

Artifact 6cb4410f87676ae633bd7923bbc78526cb839c4d:


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 0a 2f 2a 0a  turn rc;.}.../*.
14d0: 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6e  ** Extract the n
14e0: 65 78 74 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 62  ext token from b
14f0: 75 66 66 65 72 20 7a 20 28 6c 65 6e 67 74 68 20  uffer z (length 
1500: 6e 29 20 75 73 69 6e 67 20 74 68 65 20 74 6f 6b  n) using the tok
1510: 65 6e 69 7a 65 72 0a 2a 2a 20 61 6e 64 20 6f 74  enizer.** and ot
1520: 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  her information 
1530: 28 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 74  (column names et
1540: 63 2e 29 20 69 6e 20 70 50 61 72 73 65 2e 20 43  c.) in pParse. C
1550: 72 65 61 74 65 20 61 6e 20 46 74 73 33 45 78 70  reate an Fts3Exp
1560: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6f  r.** structure o
1570: 66 20 74 79 70 65 20 46 54 53 51 55 45 52 59 5f  f type FTSQUERY_
1580: 50 48 52 41 53 45 20 63 6f 6e 74 61 69 6e 69 6e  PHRASE containin
1590: 67 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73 69  g a phrase consi
15a0: 73 74 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a  sting of this.**
15b0: 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 61 6e   single token an
15c0: 64 20 73 65 74 20 2a 70 70 45 78 70 72 20 74 6f  d set *ppExpr to
15d0: 20 70 6f 69 6e 74 20 74 6f 20 69 74 2e 20 49 66   point to it. If
15e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15f0: 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 72 65 61  buffer is.** rea
1600: 63 68 65 64 20 62 65 66 6f 72 65 20 61 20 74 6f  ched before a to
1610: 6b 65 6e 20 69 73 20 66 6f 75 6e 64 2c 20 73 65  ken is found, se
1620: 74 20 2a 70 70 45 78 70 72 20 74 6f 20 7a 65 72  t *ppExpr to zer
1630: 6f 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  o. It is the.** 
1640: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1650: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1660: 65 76 65 6e 74 75 61 6c 6c 79 20 64 65 61 6c 6c  eventually deall
1670: 6f 63 61 74 65 20 74 68 65 20 61 6c 6c 6f 63 61  ocate the alloca
1680: 74 65 64 20 0a 2a 2a 20 46 74 73 33 45 78 70 72  ted .** Fts3Expr
1690: 20 73 74 72 75 63 74 75 72 65 20 28 69 66 20 61   structure (if a
16a0: 6e 79 29 20 62 79 20 70 61 73 73 69 6e 67 20 69  ny) by passing i
16b0: 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  t to sqlite3_fre
16c0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e()..**.** Retur
16d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
16e0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 53 51  uccessful, or SQ
16f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
1700: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1710: 6e 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  n.** fails..*/.s
1720: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4e 65 78  tatic int getNex
1730: 74 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 43  tToken(.  ParseC
1740: 6f 6e 74 65 78 74 20 2a 70 50 61 72 73 65 2c 20  ontext *pParse, 
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 2f 2a 20 66 74 73 33 20 71 75 65 72 79 20    /* fts3 query 
1770: 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  parse context */
1780: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17b0: 6c 75 65 20 66 6f 72 20 46 74 73 33 50 68 72 61  lue for Fts3Phra
17c0: 73 65 2e 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  se.iColumn */.  
17d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
17e0: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
1800: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73   string */.  Fts
1810: 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20  3Expr **ppExpr, 
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70       /* OUT: exp
1840: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1850: 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20   *pnConsumed    
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
1880: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
1890: 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  sumed */.){.  sq
18a0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
18b0: 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 50  *pTokenizer = pP
18c0: 61 72 73 65 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72  arse->pTokenizer
18d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
18e0: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
18f0: 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54  st *pModule = pT
1900: 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c  okenizer->pModul
1910: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  e;.  int rc;.  s
1920: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1930: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1940: 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52  ;.  Fts3Expr *pR
1950: 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43  et = 0;.  int nC
1960: 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 0a 20 20  onsumed = 0;..  
1970: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1980: 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54  OpenTokenizer(pT
1990: 6f 6b 65 6e 69 7a 65 72 2c 20 70 50 61 72 73 65  okenizer, pParse
19a0: 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 2c 20 6e 2c  ->iLangid, z, n,
19b0: 20 26 70 43 75 72 73 6f 72 29 3b 0a 20 20 69 66   &pCursor);.  if
19c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
19e0: 72 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  r *zToken;.    i
19f0: 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 2c 20 69  nt nToken = 0, i
1a00: 53 74 61 72 74 20 3d 20 30 2c 20 69 45 6e 64 20  Start = 0, iEnd 
1a10: 3d 20 30 2c 20 69 50 6f 73 69 74 69 6f 6e 20 3d  = 0, iPosition =
1a20: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   0;.    int nByt
1a30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 2f 2a 20 74 6f 74 61 6c 20 73 70 61 63 65 20   /* total space 
1a60: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
1a70: 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
1a80: 2d 3e 78 4e 65 78 74 28 70 43 75 72 73 6f 72 2c  ->xNext(pCursor,
1a90: 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65   &zToken, &nToke
1aa0: 6e 2c 20 26 69 53 74 61 72 74 2c 20 26 69 45 6e  n, &iStart, &iEn
1ab0: 64 2c 20 26 69 50 6f 73 69 74 69 6f 6e 29 3b 0a  d, &iPosition);.
1ac0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ad0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1ae0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1af0: 73 33 45 78 70 72 29 20 2b 20 73 69 7a 65 6f 66  s3Expr) + sizeof
1b00: 28 46 74 73 33 50 68 72 61 73 65 29 20 2b 20 6e  (Fts3Phrase) + n
1b10: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 52 65  Token;.      pRe
1b20: 74 20 3d 20 28 46 74 73 33 45 78 70 72 20 2a 29  t = (Fts3Expr *)
1b30: 66 74 73 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  fts3MallocZero(n
1b40: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1b50: 20 21 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20   !pRet ){.      
1b60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b70: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
1b80: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
1b90: 65 54 79 70 65 20 3d 20 46 54 53 51 55 45 52 59  eType = FTSQUERY
1ba0: 5f 50 48 52 41 53 45 3b 0a 20 20 20 20 20 20 20  _PHRASE;.       
1bb0: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 20 3d   pRet->pPhrase =
1bc0: 20 28 46 74 73 33 50 68 72 61 73 65 20 2a 29 26   (Fts3Phrase *)&
1bd0: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pRet[1];.       
1be0: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e   pRet->pPhrase->
1bf0: 6e 54 6f 6b 65 6e 20 3d 20 31 3b 0a 20 20 20 20  nToken = 1;.    
1c00: 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73      pRet->pPhras
1c10: 65 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  e->iColumn = iCo
1c20: 6c 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  l;.        pRet-
1c30: 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  >pPhrase->aToken
1c40: 5b 30 5d 2e 6e 20 3d 20 6e 54 6f 6b 65 6e 3b 0a  [0].n = nToken;.
1c50: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50          pRet->pP
1c60: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  hrase->aToken[0]
1c70: 2e 7a 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52  .z = (char *)&pR
1c80: 65 74 2d 3e 70 50 68 72 61 73 65 5b 31 5d 3b 0a  et->pPhrase[1];.
1c90: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1ca0: 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54  Ret->pPhrase->aT
1cb0: 6f 6b 65 6e 5b 30 5d 2e 7a 2c 20 7a 54 6f 6b 65  oken[0].z, zToke
1cc0: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20  n, nToken);..   
1cd0: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3c 6e 20       if( iEnd<n 
1ce0: 26 26 20 7a 5b 69 45 6e 64 5d 3d 3d 27 2a 27 20  && z[iEnd]=='*' 
1cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ){.          pRe
1d00: 74 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b  t->pPhrase->aTok
1d10: 65 6e 5b 30 5d 2e 69 73 50 72 65 66 69 78 20 3d  en[0].isPrefix =
1d20: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 45   1;.          iE
1d30: 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nd++;.        }.
1d40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1d50: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  1 ){.          i
1d60: 66 28 20 21 73 71 6c 69 74 65 33 5f 66 74 73 33  f( !sqlite3_fts3
1d70: 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
1d80: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ses .           
1d90: 26 26 20 69 53 74 61 72 74 3e 30 20 26 26 20 7a  && iStart>0 && z
1da0: 5b 69 53 74 61 72 74 2d 31 5d 3d 3d 27 2d 27 20  [iStart-1]=='-' 
1db0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
1dc0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1dd0: 2d 3e 69 73 4e 6f 74 20 3d 20 31 3b 0a 20 20 20  ->isNot = 1;.   
1de0: 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 2d           iStart-
1df0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  -;.          }el
1e00: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 62  se if( pParse->b
1e10: 46 74 73 34 20 26 26 20 69 53 74 61 72 74 3e 30  Fts4 && iStart>0
1e20: 20 26 26 20 7a 5b 69 53 74 61 72 74 2d 31 5d 3d   && z[iStart-1]=
1e30: 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
1e40: 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73      pRet->pPhras
1e50: 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 62 46 69  e->aToken[0].bFi
1e60: 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rst = 1;.       
1e70: 20 20 20 20 20 69 53 74 61 72 74 2d 2d 3b 0a 20       iStart--;. 
1e80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1ea0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1eb0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ec0: 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 75 6d 65  }.      nConsume
1ed0: 64 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20 7d 0a  d = iEnd;.    }.
1ee0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
1ef0: 6c 6f 73 65 28 70 43 75 72 73 6f 72 29 3b 0a 20  lose(pCursor);. 
1f00: 20 7d 0a 20 20 0a 20 20 2a 70 6e 43 6f 6e 73 75   }.  .  *pnConsu
1f10: 6d 65 64 20 3d 20 6e 43 6f 6e 73 75 6d 65 64 3b  med = nConsumed;
1f20: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70 52 65  .  *ppExpr = pRe
1f30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
1f40: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 6c 61 72 67  }.../*.** Enlarg
1f50: 65 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  e a memory alloc
1f60: 61 74 69 6f 6e 2e 20 20 49 66 20 61 6e 20 6f 75  ation.  If an ou
1f70: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 61 6c 6c 6f  t-of-memory allo
1f80: 63 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 0a 2a  cation occurs,.*
1f90: 2a 20 74 68 65 6e 20 66 72 65 65 20 74 68 65 20  * then free the 
1fa0: 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  old allocation..
1fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1fc0: 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  fts3ReallocOrFre
1fd0: 65 28 76 6f 69 64 20 2a 70 4f 72 69 67 2c 20 69  e(void *pOrig, i
1fe0: 6e 74 20 6e 4e 65 77 29 7b 0a 20 20 76 6f 69 64  nt nNew){.  void
1ff0: 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
2000: 5f 72 65 61 6c 6c 6f 63 28 70 4f 72 69 67 2c 20  _realloc(pOrig, 
2010: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 21 70 52  nNew);.  if( !pR
2020: 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2030: 33 5f 66 72 65 65 28 70 4f 72 69 67 29 3b 0a 20  3_free(pOrig);. 
2040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
2050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
2060: 72 20 7a 49 6e 70 75 74 2c 20 6c 65 6e 67 74 68  r zInput, length
2070: 20 6e 49 6e 70 75 74 2c 20 63 6f 6e 74 61 69 6e   nInput, contain
2080: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
2090: 66 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  f a quoted strin
20a0: 67 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  g.** that appear
20b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  ed as part of an
20c0: 20 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72   fts3 query expr
20d0: 65 73 73 69 6f 6e 2e 20 4e 65 69 74 68 65 72 20  ession. Neither 
20e0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 0a  quote character.
20f0: 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  ** is included i
2100: 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  n the buffer. Th
2110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
2120: 6d 70 74 73 20 74 6f 20 74 6f 6b 65 6e 69 7a 65  mpts to tokenize
2130: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 69   the entire.** i
2140: 6e 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20  nput buffer and 
2150: 63 72 65 61 74 65 20 61 6e 20 46 74 73 33 45 78  create an Fts3Ex
2160: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  pr structure of 
2170: 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
2180: 52 41 53 45 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  RASE .** contain
2190: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ing the results.
21a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
21b0: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
21c0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
21d0: 2a 70 70 45 78 70 72 20 73 65 74 20 74 6f 20 70  *ppExpr set to p
21e0: 6f 69 6e 74 20 61 74 20 74 68 65 0a 2a 2a 20 61  oint at the.** a
21f0: 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 45 78 70  llocated Fts3Exp
2200: 72 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  r structure. Oth
2210: 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53  erwise, either S
2220: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 28 6f 75 74  QLITE_NOMEM (out
2230: 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 65 72   of memory.** er
2240: 72 6f 72 29 20 6f 72 20 53 51 4c 49 54 45 5f 45  ror) or SQLITE_E
2250: 52 52 4f 52 20 28 74 6f 6b 65 6e 69 7a 61 74 69  RROR (tokenizati
2260: 6f 6e 20 65 72 72 6f 72 29 20 69 73 20 72 65 74  on error) is ret
2270: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 45 78 70  urned and *ppExp
2280: 72 20 73 65 74 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  r set.** to 0..*
2290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
22a0: 4e 65 78 74 53 74 72 69 6e 67 28 0a 20 20 50 61  NextString(.  Pa
22b0: 72 73 65 43 6f 6e 74 65 78 74 20 2a 70 50 61 72  rseContext *pPar
22c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
22d0: 20 20 20 20 20 20 2f 2a 20 66 74 73 33 20 71 75        /* fts3 qu
22e0: 65 72 79 20 70 61 72 73 65 20 63 6f 6e 74 65 78  ery parse contex
22f0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2300: 72 20 2a 7a 49 6e 70 75 74 2c 20 69 6e 74 20 6e  r *zInput, int n
2310: 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 2f  Input,         /
2320: 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a  * Input string *
2330: 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 70  /.  Fts3Expr **p
2340: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
2350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2360: 55 54 3a 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  UT: expression *
2370: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
2380: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
2390: 69 7a 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  izer = pParse->p
23a0: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
23b0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
23c0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
23d0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
23e0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e  r->pModule;.  in
23f0: 74 20 72 63 3b 0a 20 20 46 74 73 33 45 78 70 72  t rc;.  Fts3Expr
2400: 20 2a 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   *p = 0;.  sqlit
2410: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
2420: 73 6f 72 20 2a 70 43 75 72 73 6f 72 20 3d 20 30  sor *pCursor = 0
2430: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20  ;.  char *zTemp 
2440: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70  = 0;.  int nTemp
2450: 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74 20 69   = 0;..  const i
2460: 6e 74 20 6e 53 70 61 63 65 20 3d 20 73 69 7a 65  nt nSpace = size
2470: 6f 66 28 46 74 73 33 45 78 70 72 29 20 2b 20 73  of(Fts3Expr) + s
2480: 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61 73 65  izeof(Fts3Phrase
2490: 29 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  );.  int nToken 
24a0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  = 0;..  /* The f
24b0: 69 6e 61 6c 20 46 74 73 33 45 78 70 72 20 64 61  inal Fts3Expr da
24c0: 74 61 20 73 74 72 75 63 74 75 72 65 2c 20 69 6e  ta structure, in
24d0: 63 6c 75 64 69 6e 67 20 74 68 65 20 46 74 73 33  cluding the Fts3
24e0: 50 68 72 61 73 65 2c 0a 20 20 2a 2a 20 46 74 73  Phrase,.  ** Fts
24f0: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 73 74 72  3PhraseToken str
2500: 75 63 74 75 72 65 73 20 74 6f 6b 65 6e 20 62 75  uctures token bu
2510: 66 66 65 72 73 20 61 72 65 20 61 6c 6c 20 73 74  ffers are all st
2520: 6f 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  ored as a single
2530: 20 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f   .  ** allocatio
2540: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 65 78  n so that the ex
2550: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2560: 66 72 65 65 64 20 77 69 74 68 20 61 20 73 69 6e  freed with a sin
2570: 67 6c 65 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  gle call to.  **
2580: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
2590: 20 53 65 74 74 69 6e 67 20 74 68 69 73 20 75 70   Setting this up
25a0: 20 72 65 71 75 69 72 65 73 20 61 20 74 77 6f 20   requires a two 
25b0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 2e 0a 20  pass approach.. 
25c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
25d0: 73 74 20 70 61 73 73 2c 20 69 6e 20 74 68 65 20  st pass, in the 
25e0: 62 6c 6f 63 6b 20 62 65 6c 6f 77 2c 20 75 73 65  block below, use
25f0: 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 63 75  s a tokenizer cu
2600: 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 0a  rsor to iterate.
2610: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65    ** through the
2620: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 65   tokens in the e
2630: 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
2640: 70 61 73 73 20 75 73 65 73 20 66 74 73 33 52 65  pass uses fts3Re
2650: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 29 0a 20 20  allocOrFree().  
2660: 2a 2a 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 64  ** to assemble d
2670: 61 74 61 20 69 6e 20 74 77 6f 20 64 79 6e 61 6d  ata in two dynam
2680: 69 63 20 62 75 66 66 65 72 73 3a 0a 20 20 2a 2a  ic buffers:.  **
2690: 0a 20 20 2a 2a 20 20 20 42 75 66 66 65 72 20 70  .  **   Buffer p
26a0: 3a 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  : Points to the 
26b0: 46 74 73 33 45 78 70 72 20 73 74 72 75 63 74 75  Fts3Expr structu
26c0: 72 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  re, followed by 
26d0: 74 68 65 20 46 74 73 33 50 68 72 61 73 65 0a 20  the Fts3Phrase. 
26e0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
26f0: 73 74 72 75 63 74 75 72 65 2c 20 66 6f 6c 6c 6f  structure, follo
2700: 77 65 64 20 62 79 20 74 68 65 20 61 72 72 61 79  wed by the array
2710: 20 6f 66 20 46 74 73 33 50 68 72 61 73 65 54 6f   of Fts3PhraseTo
2720: 6b 65 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  ken .  **       
2730: 20 20 20 20 20 20 73 74 72 75 63 74 75 72 65 73        structures
2740: 2e 20 54 68 69 73 20 70 61 73 73 20 6f 6e 6c 79  . This pass only
2750: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 46   populates the F
2760: 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 61  ts3PhraseToken a
2770: 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
2780: 20 20 42 75 66 66 65 72 20 7a 54 65 6d 70 3a 20    Buffer zTemp: 
2790: 43 6f 6e 74 61 69 6e 73 20 63 6f 70 69 65 73 20  Contains copies 
27a0: 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 2e 0a 20  of all tokens.. 
27b0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
27c0: 6f 6e 64 20 70 61 73 73 2c 20 69 6e 20 74 68 65  ond pass, in the
27d0: 20 62 6c 6f 63 6b 20 74 68 61 74 20 62 65 67 69   block that begi
27e0: 6e 73 20 22 69 66 28 20 72 63 3d 3d 53 51 4c 49  ns "if( rc==SQLI
27f0: 54 45 5f 44 4f 4e 45 20 29 22 20 62 65 6c 6f 77  TE_DONE )" below
2800: 2c 0a 20 20 2a 2a 20 61 70 70 65 6e 64 73 20 62  ,.  ** appends b
2810: 75 66 66 65 72 20 7a 54 65 6d 70 20 74 6f 20 62  uffer zTemp to b
2820: 75 66 66 65 72 20 70 2c 20 61 6e 64 20 66 69 6c  uffer p, and fil
2830: 6c 73 20 69 6e 20 74 68 65 20 46 74 73 33 45 78  ls in the Fts3Ex
2840: 70 72 20 61 6e 64 20 46 74 73 33 50 68 72 61 73  pr and Fts3Phras
2850: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
2860: 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
2870: 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2880: 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20 20 20 70  kenizer(.      p
2890: 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 50 61 72 73  Tokenizer, pPars
28a0: 65 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 49 6e 70  e->iLangid, zInp
28b0: 75 74 2c 20 6e 49 6e 70 75 74 2c 20 26 70 43 75  ut, nInput, &pCu
28c0: 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  rsor);.  if( rc=
28d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28e0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
28f0: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
2900: 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
2910: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2920: 7a 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  zByte;.      int
2930: 20 6e 42 79 74 65 20 3d 20 30 2c 20 69 42 65 67   nByte = 0, iBeg
2940: 69 6e 20 3d 20 30 2c 20 69 45 6e 64 20 3d 20 30  in = 0, iEnd = 0
2950: 2c 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  , iPos = 0;.    
2960: 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2970: 78 4e 65 78 74 28 70 43 75 72 73 6f 72 2c 20 26  xNext(pCursor, &
2980: 7a 42 79 74 65 2c 20 26 6e 42 79 74 65 2c 20 26  zByte, &nByte, &
2990: 69 42 65 67 69 6e 2c 20 26 69 45 6e 64 2c 20 26  iBegin, &iEnd, &
29a0: 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 66 28  iPos);.      if(
29b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29c0: 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 50 68  {.        Fts3Ph
29d0: 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  raseToken *pToke
29e0: 6e 3b 0a 0a 20 20 20 20 20 20 20 20 70 20 3d 20  n;..        p = 
29f0: 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  fts3ReallocOrFre
2a00: 65 28 70 2c 20 6e 53 70 61 63 65 20 2b 20 69 69  e(p, nSpace + ii
2a10: 2a 73 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61  *sizeof(Fts3Phra
2a20: 73 65 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 20  seToken));.     
2a30: 20 20 20 69 66 28 20 21 70 20 29 20 67 6f 74 6f     if( !p ) goto
2a40: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 20 20 20 20   no_mem;..      
2a50: 20 20 7a 54 65 6d 70 20 3d 20 66 74 73 33 52 65    zTemp = fts3Re
2a60: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 7a 54 65 6d  allocOrFree(zTem
2a70: 70 2c 20 6e 54 65 6d 70 20 2b 20 6e 42 79 74 65  p, nTemp + nByte
2a80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2a90: 7a 54 65 6d 70 20 29 20 67 6f 74 6f 20 6e 6f 5f  zTemp ) goto no_
2aa0: 6d 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  mem;..        as
2ab0: 73 65 72 74 28 20 6e 54 6f 6b 65 6e 3d 3d 69 69  sert( nToken==ii
2ac0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b   );.        pTok
2ad0: 65 6e 20 3d 20 26 28 28 46 74 73 33 50 68 72 61  en = &((Fts3Phra
2ae0: 73 65 20 2a 29 28 26 70 5b 31 5d 29 29 2d 3e 61  se *)(&p[1]))->a
2af0: 54 6f 6b 65 6e 5b 69 69 5d 3b 0a 20 20 20 20 20  Token[ii];.     
2b00: 20 20 20 6d 65 6d 73 65 74 28 70 54 6f 6b 65 6e     memset(pToken
2b10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
2b20: 50 68 72 61 73 65 54 6f 6b 65 6e 29 29 3b 0a 0a  PhraseToken));..
2b30: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2b40: 7a 54 65 6d 70 5b 6e 54 65 6d 70 5d 2c 20 7a 42  zTemp[nTemp], zB
2b50: 79 74 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  yte, nByte);.   
2b60: 20 20 20 20 20 6e 54 65 6d 70 20 2b 3d 20 6e 42       nTemp += nB
2b70: 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 70 54  yte;..        pT
2b80: 6f 6b 65 6e 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b  oken->n = nByte;
2b90: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
2ba0: 3e 69 73 50 72 65 66 69 78 20 3d 20 28 69 45 6e  >isPrefix = (iEn
2bb0: 64 3c 6e 49 6e 70 75 74 20 26 26 20 7a 49 6e 70  d<nInput && zInp
2bc0: 75 74 5b 69 45 6e 64 5d 3d 3d 27 2a 27 29 3b 0a  ut[iEnd]=='*');.
2bd0: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e          pToken->
2be0: 62 46 69 72 73 74 20 3d 20 28 69 42 65 67 69 6e  bFirst = (iBegin
2bf0: 3e 30 20 26 26 20 7a 49 6e 70 75 74 5b 69 42 65  >0 && zInput[iBe
2c00: 67 69 6e 2d 31 5d 3d 3d 27 5e 27 29 3b 0a 20 20  gin-1]=='^');.  
2c10: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 69        nToken = i
2c20: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
2c30: 20 7d 0a 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   }..    pModule-
2c40: 3e 78 43 6c 6f 73 65 28 70 43 75 72 73 6f 72 29  >xClose(pCursor)
2c50: 3b 0a 20 20 20 20 70 43 75 72 73 6f 72 20 3d 20  ;.    pCursor = 
2c60: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  0;.  }..  if( rc
2c70: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2c80: 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20  .    int jj;.   
2c90: 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b   char *zBuf = 0;
2ca0: 0a 0a 20 20 20 20 70 20 3d 20 66 74 73 33 52 65  ..    p = fts3Re
2cb0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2c 20 6e  allocOrFree(p, n
2cc0: 53 70 61 63 65 20 2b 20 6e 54 6f 6b 65 6e 2a 73  Space + nToken*s
2cd0: 69 7a 65 6f 66 28 46 74 73 33 50 68 72 61 73 65  izeof(Fts3Phrase
2ce0: 54 6f 6b 65 6e 29 20 2b 20 6e 54 65 6d 70 29 3b  Token) + nTemp);
2cf0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 67 6f  .    if( !p ) go
2d00: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 6d  to no_mem;.    m
2d10: 65 6d 73 65 74 28 70 2c 20 30 2c 20 28 63 68 61  emset(p, 0, (cha
2d20: 72 20 2a 29 26 28 28 28 46 74 73 33 50 68 72 61  r *)&(((Fts3Phra
2d30: 73 65 20 2a 29 26 70 5b 31 5d 29 2d 3e 61 54 6f  se *)&p[1])->aTo
2d40: 6b 65 6e 5b 30 5d 29 2d 28 63 68 61 72 20 2a 29  ken[0])-(char *)
2d50: 70 29 3b 0a 20 20 20 20 70 2d 3e 65 54 79 70 65  p);.    p->eType
2d60: 20 3d 20 46 54 53 51 55 45 52 59 5f 50 48 52 41   = FTSQUERY_PHRA
2d70: 53 45 3b 0a 20 20 20 20 70 2d 3e 70 50 68 72 61  SE;.    p->pPhra
2d80: 73 65 20 3d 20 28 46 74 73 33 50 68 72 61 73 65  se = (Fts3Phrase
2d90: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
2da0: 3e 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d  >pPhrase->iColum
2db0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 69 44 65 66  n = pParse->iDef
2dc0: 61 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  aultCol;.    p->
2dd0: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 20  pPhrase->nToken 
2de0: 3d 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 20 20 7a  = nToken;..    z
2df0: 42 75 66 20 3d 20 28 63 68 61 72 20 2a 29 26 70  Buf = (char *)&p
2e00: 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ->pPhrase->aToke
2e10: 6e 5b 6e 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 69  n[nToken];.    i
2e20: 66 28 20 7a 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( zTemp ){.    
2e30: 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
2e40: 54 65 6d 70 2c 20 6e 54 65 6d 70 29 3b 0a 20 20  Temp, nTemp);.  
2e50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e60: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 65 6c  (zTemp);.    }el
2e70: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2e80: 28 20 6e 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20  ( nTemp==0 );.  
2e90: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 6a 6a 3d    }..    for(jj=
2ea0: 30 3b 20 6a 6a 3c 70 2d 3e 70 50 68 72 61 73 65  0; jj<p->pPhrase
2eb0: 2d 3e 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b  ->nToken; jj++){
2ec0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 68 72 61 73  .      p->pPhras
2ed0: 65 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 7a 20  e->aToken[jj].z 
2ee0: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 7a 42  = zBuf;.      zB
2ef0: 75 66 20 2b 3d 20 70 2d 3e 70 50 68 72 61 73 65  uf += p->pPhrase
2f00: 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 6e 3b 0a  ->aToken[jj].n;.
2f10: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53      }.    rc = S
2f20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2f30: 20 2a 70 70 45 78 70 72 20 3d 20 70 3b 0a 20 20   *ppExpr = p;.  
2f40: 72 65 74 75 72 6e 20 72 63 3b 0a 6e 6f 5f 6d 65  return rc;.no_me
2f50: 6d 3a 0a 0a 20 20 69 66 28 20 70 43 75 72 73 6f  m:..  if( pCurso
2f60: 72 20 29 7b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  r ){.    pModule
2f70: 2d 3e 78 43 6c 6f 73 65 28 70 43 75 72 73 6f 72  ->xClose(pCursor
2f80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2f90: 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2fa0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
2fb0: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 30 3b 0a  .  *ppExpr = 0;.
2fc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fd0: 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NOMEM;.}../*.** 
2fe0: 46 75 6e 63 74 69 6f 6e 20 67 65 74 4e 65 78 74  Function getNext
2ff0: 4e 6f 64 65 28 29 2c 20 77 68 69 63 68 20 69 73  Node(), which is
3000: 20 63 61 6c 6c 65 64 20 62 79 20 66 74 73 33 45   called by fts3E
3010: 78 70 72 50 61 72 73 65 28 29 2c 20 6d 61 79 20  xprParse(), may 
3020: 69 74 73 65 6c 66 0a 2a 2a 20 63 61 6c 6c 20 66  itself.** call f
3030: 74 73 33 45 78 70 72 50 61 72 73 65 28 29 2e 20  ts3ExprParse(). 
3040: 53 6f 20 74 68 69 73 20 66 6f 72 77 61 72 64 20  So this forward 
3050: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20 72  declaration is r
3060: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
3070: 69 63 20 69 6e 74 20 66 74 73 33 45 78 70 72 50  ic int fts3ExprP
3080: 61 72 73 65 28 50 61 72 73 65 43 6f 6e 74 65 78  arse(ParseContex
3090: 74 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  t *, const char 
30a0: 2a 2c 20 69 6e 74 2c 20 46 74 73 33 45 78 70 72  *, int, Fts3Expr
30b0: 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f 2a   **, int *);../*
30c0: 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20 76  .** The output v
30d0: 61 72 69 61 62 6c 65 20 2a 70 70 45 78 70 72 20  ariable *ppExpr 
30e0: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
30f0: 68 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 46  h an allocated F
3100: 74 73 33 45 78 70 72 20 0a 2a 2a 20 73 74 72 75  ts3Expr .** stru
3110: 63 74 75 72 65 2c 20 6f 72 20 73 65 74 20 74 6f  cture, or set to
3120: 20 30 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66   0 if the end of
3130: 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
3140: 72 20 69 73 20 72 65 61 63 68 65 64 2e 0a 2a 2a  r is reached..**
3150: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 6e 20 53  .** Returns an S
3160: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
3170: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  . SQLITE_OK if e
3180: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
3190: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
31a0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
31b0: 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 6f 72 20  lure occurs, or 
31c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
31d0: 61 20 70 61 72 73 65 20 65 72 72 6f 72 20 69 73  a parse error is
31e0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
31f0: 20 49 66 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   If SQLITE_ERROR
3200: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 70 43   is returned, pC
3210: 6f 6e 74 65 78 74 20 69 73 20 70 6f 70 75 6c 61  ontext is popula
3220: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
3230: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
3240: 61 74 69 63 20 69 6e 74 20 67 65 74 4e 65 78 74  atic int getNext
3250: 4e 6f 64 65 28 0a 20 20 50 61 72 73 65 43 6f 6e  Node(.  ParseCon
3260: 74 65 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20  text *pParse,   
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 2f 2a 20 66 74 73 33 20 71 75 65 72 79 20 70 61  /* fts3 query pa
3290: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
32a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
32b0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
32c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
32d0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74  t string */.  Ft
32e0: 73 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c  s3Expr **ppExpr,
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78        /* OUT: ex
3310: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
3320: 74 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20 20  t *pnConsumed   
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
3350: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
3360: 6e 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20 73  nsumed */.){.  s
3370: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
3380: 63 74 20 46 74 73 33 4b 65 79 77 6f 72 64 20 7b  ct Fts3Keyword {
3390: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  .    char *z;   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
33c0: 79 77 6f 72 64 20 74 65 78 74 20 2a 2f 0a 20 20  yword text */.  
33d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
33f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
3400: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
3410: 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
3420: 20 63 68 61 72 20 70 61 72 65 6e 4f 6e 6c 79 3b   char parenOnly;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3440: 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 6e 20 70   Only valid in p
3450: 61 72 65 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  aren mode */.   
3460: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
3470: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
3480: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72         /* Keywor
3490: 64 20 63 6f 64 65 20 2a 2f 0a 20 20 7d 20 61 4b  d code */.  } aK
34a0: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
34b0: 20 7b 20 22 4f 52 22 20 2c 20 20 32 2c 20 30 2c   { "OR" ,  2, 0,
34c0: 20 46 54 53 51 55 45 52 59 5f 4f 52 20 20 20 7d   FTSQUERY_OR   }
34d0: 2c 0a 20 20 20 20 7b 20 22 41 4e 44 22 2c 20 20  ,.    { "AND",  
34e0: 33 2c 20 31 2c 20 46 54 53 51 55 45 52 59 5f 41  3, 1, FTSQUERY_A
34f0: 4e 44 20 20 7d 2c 0a 20 20 20 20 7b 20 22 4e 4f  ND  },.    { "NO
3500: 54 22 2c 20 20 33 2c 20 31 2c 20 46 54 53 51 55  T",  3, 1, FTSQU
3510: 45 52 59 5f 4e 4f 54 20 20 7d 2c 0a 20 20 20 20  ERY_NOT  },.    
3520: 7b 20 22 4e 45 41 52 22 2c 20 34 2c 20 30 2c 20  { "NEAR", 4, 0, 
3530: 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7d 0a  FTSQUERY_NEAR }.
3540: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20    };.  int ii;. 
3550: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
3560: 20 69 43 6f 6c 4c 65 6e 3b 0a 20 20 69 6e 74 20   iColLen;.  int 
3570: 72 63 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a  rc;.  Fts3Expr *
3580: 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e  pRet = 0;..  con
3590: 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75 74 20  st char *zInput 
35a0: 3d 20 7a 3b 0a 20 20 69 6e 74 20 6e 49 6e 70 75  = z;.  int nInpu
35b0: 74 20 3d 20 6e 3b 0a 0a 20 20 70 50 61 72 73 65  t = n;..  pParse
35c0: 2d 3e 69 73 4e 6f 74 20 3d 20 30 3b 0a 0a 20 20  ->isNot = 0;..  
35d0: 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  /* Skip over any
35e0: 20 77 68 69 74 65 73 70 61 63 65 20 62 65 66 6f   whitespace befo
35f0: 72 65 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  re checking for 
3600: 61 20 6b 65 79 77 6f 72 64 2c 20 61 6e 20 6f 70  a keyword, an op
3610: 65 6e 20 6f 72 0a 20 20 2a 2a 20 63 6c 6f 73 65  en or.  ** close
3620: 20 62 72 61 63 6b 65 74 2c 20 6f 72 20 61 20 71   bracket, or a q
3630: 75 6f 74 65 64 20 73 74 72 69 6e 67 2e 20 0a 20  uoted string. . 
3640: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e   */.  while( nIn
3650: 70 75 74 3e 30 20 26 26 20 66 74 73 33 69 73 73  put>0 && fts3iss
3660: 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b  pace(*zInput) ){
3670: 0a 20 20 20 20 6e 49 6e 70 75 74 2d 2d 3b 0a 20  .    nInput--;. 
3680: 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20 7d     zInput++;.  }
3690: 0a 20 20 69 66 28 20 6e 49 6e 70 75 74 3d 3d 30  .  if( nInput==0
36a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
36b0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
36c0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 77 65 20  .  /* See if we 
36d0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
36e0: 20 61 20 6b 65 79 77 6f 72 64 2e 20 2a 2f 0a 20   a keyword. */. 
36f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 69   for(ii=0; ii<(i
3700: 6e 74 29 28 73 69 7a 65 6f 66 28 61 4b 65 79 77  nt)(sizeof(aKeyw
3710: 6f 72 64 29 2f 73 69 7a 65 6f 66 28 73 74 72 75  ord)/sizeof(stru
3720: 63 74 20 46 74 73 33 4b 65 79 77 6f 72 64 29 29  ct Fts3Keyword))
3730: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ; ii++){.    con
3740: 73 74 20 73 74 72 75 63 74 20 46 74 73 33 4b 65  st struct Fts3Ke
3750: 79 77 6f 72 64 20 2a 70 4b 65 79 20 3d 20 26 61  yword *pKey = &a
3760: 4b 65 79 77 6f 72 64 5b 69 69 5d 3b 0a 0a 20 20  Keyword[ii];..  
3770: 20 20 69 66 28 20 28 70 4b 65 79 2d 3e 70 61 72    if( (pKey->par
3780: 65 6e 4f 6e 6c 79 20 26 20 7e 73 71 6c 69 74 65  enOnly & ~sqlite
3790: 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
37a0: 72 65 6e 74 68 65 73 65 73 29 21 3d 30 20 29 7b  rentheses)!=0 ){
37b0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
37c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
37d0: 6e 49 6e 70 75 74 3e 3d 70 4b 65 79 2d 3e 6e 20  nInput>=pKey->n 
37e0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 49 6e  && 0==memcmp(zIn
37f0: 70 75 74 2c 20 70 4b 65 79 2d 3e 7a 2c 20 70 4b  put, pKey->z, pK
3800: 65 79 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20  ey->n) ){.      
3810: 69 6e 74 20 6e 4e 65 61 72 20 3d 20 53 51 4c 49  int nNear = SQLI
3820: 54 45 5f 46 54 53 33 5f 44 45 46 41 55 4c 54 5f  TE_FTS3_DEFAULT_
3830: 4e 45 41 52 5f 50 41 52 41 4d 3b 0a 20 20 20 20  NEAR_PARAM;.    
3840: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 4b 65    int nKey = pKe
3850: 79 2d 3e 6e 3b 0a 20 20 20 20 20 20 63 68 61 72  y->n;.      char
3860: 20 63 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 2f   cNext;..      /
3870: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 22  * If this is a "
3880: 4e 45 41 52 22 20 6b 65 79 77 6f 72 64 2c 20 63  NEAR" keyword, c
3890: 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 70 6c  heck for an expl
38a0: 69 63 69 74 20 6e 65 61 72 6e 65 73 73 2e 20 2a  icit nearness. *
38b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
38c0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
38d0: 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 20 20  Y_NEAR ){.      
38e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
38f0: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4 );.        if(
3900: 20 7a 49 6e 70 75 74 5b 34 5d 3d 3d 27 2f 27 20   zInput[4]=='/' 
3910: 26 26 20 7a 49 6e 70 75 74 5b 35 5d 3e 3d 27 30  && zInput[5]>='0
3920: 27 20 26 26 20 7a 49 6e 70 75 74 5b 35 5d 3c 3d  ' && zInput[5]<=
3930: 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '9' ){.         
3940: 20 6e 4e 65 61 72 20 3d 20 30 3b 0a 20 20 20 20   nNear = 0;.    
3950: 20 20 20 20 20 20 66 6f 72 28 6e 4b 65 79 3d 35        for(nKey=5
3960: 3b 20 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 3e 3d  ; zInput[nKey]>=
3970: 27 30 27 20 26 26 20 7a 49 6e 70 75 74 5b 6e 4b  '0' && zInput[nK
3980: 65 79 5d 3c 3d 27 39 27 3b 20 6e 4b 65 79 2b 2b  ey]<='9'; nKey++
3990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
39a0: 4e 65 61 72 20 3d 20 6e 4e 65 61 72 20 2a 20 31  Near = nNear * 1
39b0: 30 20 2b 20 28 7a 49 6e 70 75 74 5b 6e 4b 65 79  0 + (zInput[nKey
39c0: 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 20 20  ] - '0');.      
39d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
39e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
39f0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
3a00: 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79  this is probably
3a10: 20 61 20 6b 65 79 77 6f 72 64 2e 20 42 75 74 20   a keyword. But 
3a20: 66 6f 72 20 74 68 61 74 20 74 6f 20 62 65 20 74  for that to be t
3a30: 72 75 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  rue,.      ** th
3a40: 65 20 6e 65 78 74 20 62 79 74 65 20 6d 75 73 74  e next byte must
3a50: 20 63 6f 6e 74 61 69 6e 20 65 69 74 68 65 72 20   contain either 
3a60: 77 68 69 74 65 73 70 61 63 65 2c 20 61 6e 20 6f  whitespace, an o
3a70: 70 65 6e 20 6f 72 20 63 6c 6f 73 65 0a 20 20 20  pen or close.   
3a80: 20 20 20 2a 2a 20 70 61 72 65 6e 74 68 65 73 69     ** parenthesi
3a90: 73 2c 20 61 20 71 75 6f 74 65 20 63 68 61 72 61  s, a quote chara
3aa0: 63 74 65 72 2c 20 6f 72 20 45 4f 46 2e 20 0a 20  cter, or EOF. . 
3ab0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 4e       */.      cN
3ac0: 65 78 74 20 3d 20 7a 49 6e 70 75 74 5b 6e 4b 65  ext = zInput[nKe
3ad0: 79 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  y];.      if( ft
3ae0: 73 33 69 73 73 70 61 63 65 28 63 4e 65 78 74 29  s3isspace(cNext)
3af0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 63 4e 65 78   .       || cNex
3b00: 74 3d 3d 27 22 27 20 7c 7c 20 63 4e 65 78 74 3d  t=='"' || cNext=
3b10: 3d 27 28 27 20 7c 7c 20 63 4e 65 78 74 3d 3d 27  ='(' || cNext=='
3b20: 29 27 20 7c 7c 20 63 4e 65 78 74 3d 3d 30 0a 20  )' || cNext==0. 
3b30: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3b40: 70 52 65 74 20 3d 20 28 46 74 73 33 45 78 70 72  pRet = (Fts3Expr
3b50: 20 2a 29 66 74 73 33 4d 61 6c 6c 6f 63 5a 65 72   *)fts3MallocZer
3b60: 6f 28 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70  o(sizeof(Fts3Exp
3b70: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r));.        if(
3b80: 20 21 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20   !pRet ){.      
3b90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3ba0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
3bb0: 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d   }.        pRet-
3bc0: 3e 65 54 79 70 65 20 3d 20 70 4b 65 79 2d 3e 65  >eType = pKey->e
3bd0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 52  Type;.        pR
3be0: 65 74 2d 3e 6e 4e 65 61 72 20 3d 20 6e 4e 65 61  et->nNear = nNea
3bf0: 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 45 78  r;.        *ppEx
3c00: 70 72 20 3d 20 70 52 65 74 3b 0a 20 20 20 20 20  pr = pRet;.     
3c10: 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 3d     *pnConsumed =
3c20: 20 28 69 6e 74 29 28 28 7a 49 6e 70 75 74 20 2d   (int)((zInput -
3c30: 20 7a 29 20 2b 20 6e 4b 65 79 29 3b 0a 20 20 20   z) + nKey);.   
3c40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
3c50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a  TE_OK;.      }..
3c60: 20 20 20 20 20 20 2f 2a 20 54 75 72 6e 73 20 6f        /* Turns o
3c70: 75 74 20 74 68 61 74 20 77 61 73 6e 27 74 20 61  ut that wasn't a
3c80: 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72 20 61   keyword after a
3c90: 6c 6c 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ll. This happens
3ca0: 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
3cb0: 20 75 73 65 72 20 68 61 73 20 73 75 70 70 6c 69   user has suppli
3cc0: 65 64 20 61 20 74 6f 6b 65 6e 20 73 75 63 68 20  ed a token such 
3cd0: 61 73 20 22 4f 52 61 63 6c 65 22 2e 20 43 6f 6e  as "ORacle". Con
3ce0: 74 69 6e 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  tinue..      */.
3cf0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3d00: 43 68 65 63 6b 20 66 6f 72 20 61 6e 20 6f 70 65  Check for an ope
3d10: 6e 20 62 72 61 63 6b 65 74 2e 20 2a 2f 0a 20 20  n bracket. */.  
3d20: 69 66 28 20 73 71 6c 69 74 65 33 5f 66 74 73 33  if( sqlite3_fts3
3d30: 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
3d40: 73 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  ses ){.    if( *
3d50: 7a 49 6e 70 75 74 3d 3d 27 28 27 20 29 7b 0a 20  zInput=='(' ){. 
3d60: 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 75 6d       int nConsum
3d70: 65 64 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ed;.      pParse
3d80: 2d 3e 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 20  ->nNest++;.     
3d90: 20 72 63 20 3d 20 66 74 73 33 45 78 70 72 50 61   rc = fts3ExprPa
3da0: 72 73 65 28 70 50 61 72 73 65 2c 20 26 7a 49 6e  rse(pParse, &zIn
3db0: 70 75 74 5b 31 5d 2c 20 6e 49 6e 70 75 74 2d 31  put[1], nInput-1
3dc0: 2c 20 70 70 45 78 70 72 2c 20 26 6e 43 6f 6e 73  , ppExpr, &nCons
3dd0: 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 69 66 28  umed);.      if(
3de0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3df0: 26 20 21 2a 70 70 45 78 70 72 20 29 7b 0a 20 20  & !*ppExpr ){.  
3e00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3e10: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
3e20: 20 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65        *pnConsume
3e30: 64 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75  d = (int)((zInpu
3e40: 74 20 2d 20 7a 29 20 2b 20 31 20 2b 20 6e 43 6f  t - z) + 1 + nCo
3e50: 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 72  nsumed);.      r
3e60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
3e70: 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
3e80: 66 6f 72 20 61 20 63 6c 6f 73 65 20 62 72 61 63  for a close brac
3e90: 6b 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ket. */.    if( 
3ea0: 2a 7a 49 6e 70 75 74 3d 3d 27 29 27 20 29 7b 0a  *zInput==')' ){.
3eb0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4e        pParse->nN
3ec0: 65 73 74 2d 2d 3b 0a 20 20 20 20 20 20 2a 70 6e  est--;.      *pn
3ed0: 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74 29  Consumed = (int)
3ee0: 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b 20  ((zInput - z) + 
3ef0: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
3f00: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
3f10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
3f20: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
3f30: 69 6e 67 20 77 69 74 68 20 61 20 71 75 6f 74 65  ing with a quote
3f40: 64 20 70 68 72 61 73 65 2e 20 49 66 20 74 68 69  d phrase. If thi
3f50: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
3f60: 68 65 6e 0a 20 20 2a 2a 20 73 65 61 72 63 68 20  hen.  ** search 
3f70: 66 6f 72 20 74 68 65 20 63 6c 6f 73 69 6e 67 20  for the closing 
3f80: 71 75 6f 74 65 20 61 6e 64 20 70 61 73 73 20 74  quote and pass t
3f90: 68 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 20  he whole string 
3fa0: 74 6f 20 67 65 74 4e 65 78 74 53 74 72 69 6e 67  to getNextString
3fb0: 28 29 0a 20 20 2a 2a 20 66 6f 72 20 70 72 6f 63  ().  ** for proc
3fc0: 65 73 73 69 6e 67 2e 20 54 68 69 73 20 69 73 20  essing. This is 
3fd0: 65 61 73 79 20 74 6f 20 64 6f 2c 20 61 73 20 66  easy to do, as f
3fe0: 74 73 33 20 68 61 73 20 6e 6f 20 73 79 6e 74 61  ts3 has no synta
3ff0: 78 20 66 6f 72 20 65 73 63 61 70 69 6e 67 0a 20  x for escaping. 
4000: 20 2a 2a 20 61 20 71 75 6f 74 65 20 63 68 61 72   ** a quote char
4010: 61 63 74 65 72 20 65 6d 62 65 64 64 65 64 20 69  acter embedded i
4020: 6e 20 61 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  n a string..  */
4030: 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d 3d  .  if( *zInput==
4040: 27 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  '"' ){.    for(i
4050: 69 3d 31 3b 20 69 69 3c 6e 49 6e 70 75 74 20 26  i=1; ii<nInput &
4060: 26 20 7a 49 6e 70 75 74 5b 69 69 5d 21 3d 27 22  & zInput[ii]!='"
4070: 27 3b 20 69 69 2b 2b 29 3b 0a 20 20 20 20 2a 70  '; ii++);.    *p
4080: 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74  nConsumed = (int
4090: 29 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b  )((zInput - z) +
40a0: 20 69 69 20 2b 20 31 29 3b 0a 20 20 20 20 69 66   ii + 1);.    if
40b0: 28 20 69 69 3d 3d 6e 49 6e 70 75 74 20 29 7b 0a  ( ii==nInput ){.
40c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
40d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
40e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65 74 4e  .    return getN
40f0: 65 78 74 53 74 72 69 6e 67 28 70 50 61 72 73 65  extString(pParse
4100: 2c 20 26 7a 49 6e 70 75 74 5b 31 5d 2c 20 69 69  , &zInput[1], ii
4110: 2d 31 2c 20 70 70 45 78 70 72 29 3b 0a 20 20 7d  -1, ppExpr);.  }
4120: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
4130: 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
4140: 20 70 6f 69 6e 74 2c 20 74 68 69 73 20 6d 75 73   point, this mus
4150: 74 20 62 65 20 61 20 72 65 67 75 6c 61 72 20 74  t be a regular t
4160: 6f 6b 65 6e 2c 20 6f 72 20 0a 20 20 2a 2a 20 74  oken, or .  ** t
4170: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
4180: 70 75 74 2e 20 52 65 61 64 20 61 20 72 65 67 75  put. Read a regu
4190: 6c 61 72 20 74 6f 6b 65 6e 20 75 73 69 6e 67 20  lar token using 
41a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  the sqlite3_toke
41b0: 6e 69 7a 65 72 0a 20 20 2a 2a 20 69 6e 74 65 72  nizer.  ** inter
41c0: 66 61 63 65 2e 20 42 65 66 6f 72 65 20 64 6f 69  face. Before doi
41d0: 6e 67 20 73 6f 2c 20 66 69 67 75 72 65 20 6f 75  ng so, figure ou
41e0: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  t if there is an
41f0: 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
4200: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 65 72 20  olumn specifier 
4210: 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 2e 20 0a  for the token. .
4220: 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
4230: 53 74 72 61 6e 67 65 6c 79 2c 20 69 74 20 69 73  Strangely, it is
4240: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
4250: 20 61 73 73 6f 63 69 61 74 65 20 61 20 63 6f 6c   associate a col
4260: 75 6d 6e 20 73 70 65 63 69 66 69 65 72 0a 20 20  umn specifier.  
4270: 2a 2a 20 77 69 74 68 20 61 20 71 75 6f 74 65 64  ** with a quoted
4280: 20 70 68 72 61 73 65 2c 20 6f 6e 6c 79 20 77 69   phrase, only wi
4290: 74 68 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  th a single toke
42a0: 6e 2e 20 4e 6f 74 20 73 75 72 65 20 69 66 20 74  n. Not sure if t
42b0: 68 69 73 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20  his was.  ** an 
42c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
42d0: 72 74 69 66 61 63 74 20 6f 72 20 61 6e 20 69 6e  rtifact or an in
42e0: 74 65 6e 74 69 6f 6e 61 6c 20 64 65 63 69 73 69  tentional decisi
42f0: 6f 6e 20 77 68 65 6e 20 66 74 73 33 20 77 61 73  on when fts3 was
4300: 0a 20 20 2a 2a 20 66 69 72 73 74 20 69 6d 70 6c  .  ** first impl
4310: 65 6d 65 6e 74 65 64 2e 20 57 68 69 63 68 65 76  emented. Whichev
4320: 65 72 20 69 74 20 77 61 73 2c 20 74 68 69 73 20  er it was, this 
4330: 6d 6f 64 75 6c 65 20 64 75 70 6c 69 63 61 74 65  module duplicate
4340: 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 69 6d 69  s the .  ** limi
4350: 74 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  tation..  */.  i
4360: 43 6f 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 44  Col = pParse->iD
4370: 65 66 61 75 6c 74 43 6f 6c 3b 0a 20 20 69 43 6f  efaultCol;.  iCo
4380: 6c 4c 65 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  lLen = 0;.  for(
4390: 69 69 3d 30 3b 20 69 69 3c 70 50 61 72 73 65 2d  ii=0; ii<pParse-
43a0: 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nCol; ii++){.  
43b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
43c0: 74 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a 43  tr = pParse->azC
43d0: 6f 6c 5b 69 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ol[ii];.    int 
43e0: 6e 53 74 72 20 3d 20 28 69 6e 74 29 73 74 72 6c  nStr = (int)strl
43f0: 65 6e 28 7a 53 74 72 29 3b 0a 20 20 20 20 69 66  en(zStr);.    if
4400: 28 20 6e 49 6e 70 75 74 3e 6e 53 74 72 20 26 26  ( nInput>nStr &&
4410: 20 7a 49 6e 70 75 74 5b 6e 53 74 72 5d 3d 3d 27   zInput[nStr]=='
4420: 3a 27 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  :' .     && sqli
4430: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 53 74  te3_strnicmp(zSt
4440: 72 2c 20 7a 49 6e 70 75 74 2c 20 6e 53 74 72 29  r, zInput, nStr)
4450: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
4460: 20 20 69 43 6f 6c 20 3d 20 69 69 3b 0a 20 20 20    iCol = ii;.   
4470: 20 20 20 69 43 6f 6c 4c 65 6e 20 3d 20 28 69 6e     iColLen = (in
4480: 74 29 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20  t)((zInput - z) 
4490: 2b 20 6e 53 74 72 20 2b 20 31 29 3b 0a 20 20 20  + nStr + 1);.   
44a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44b0: 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 4e 65    }.  rc = getNe
44c0: 78 74 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  xtToken(pParse, 
44d0: 69 43 6f 6c 2c 20 26 7a 5b 69 43 6f 6c 4c 65 6e  iCol, &z[iColLen
44e0: 5d 2c 20 6e 2d 69 43 6f 6c 4c 65 6e 2c 20 70 70  ], n-iColLen, pp
44f0: 45 78 70 72 2c 20 70 6e 43 6f 6e 73 75 6d 65 64  Expr, pnConsumed
4500: 29 3b 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64  );.  *pnConsumed
4510: 20 2b 3d 20 69 43 6f 6c 4c 65 6e 3b 0a 20 20 72   += iColLen;.  r
4520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4530: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
4540: 69 73 20 61 6e 20 46 74 73 33 45 78 70 72 20 73  is an Fts3Expr s
4550: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 20 62  tructure for a b
4560: 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 28  inary operator (
4570: 61 6e 79 20 74 79 70 65 0a 2a 2a 20 65 78 63 65  any type.** exce
4580: 70 74 20 61 6e 20 46 54 53 51 55 45 52 59 5f 50  pt an FTSQUERY_P
4590: 48 52 41 53 45 29 2e 20 52 65 74 75 72 6e 20 61  HRASE). Return a
45a0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n integer value 
45b0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
45c0: 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f  .** precedence o
45d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 20  f the operator. 
45e0: 4c 6f 77 65 72 20 76 61 6c 75 65 73 20 68 61 76  Lower values hav
45f0: 65 20 61 20 68 69 67 68 65 72 20 70 72 65 63 65  e a higher prece
4600: 64 65 6e 63 65 20 28 69 2e 65 2e 0a 2a 2a 20 67  dence (i.e..** g
4610: 72 6f 75 70 20 6d 6f 72 65 20 74 69 67 68 74 6c  roup more tightl
4620: 79 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  y). For example,
4630: 20 69 6e 20 74 68 65 20 43 20 6c 61 6e 67 75 61   in the C langua
4640: 67 65 2c 20 74 68 65 20 3d 3d 20 6f 70 65 72 61  ge, the == opera
4650: 74 6f 72 0a 2a 2a 20 67 72 6f 75 70 73 20 6d 6f  tor.** groups mo
4660: 72 65 20 74 69 67 68 74 6c 79 20 74 68 61 6e 20  re tightly than 
4670: 7c 7c 2c 20 61 6e 64 20 77 6f 75 6c 64 20 74 68  ||, and would th
4680: 65 72 65 66 6f 72 65 20 68 61 76 65 20 61 20 68  erefore have a h
4690: 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65  igher precedence
46a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 75 73 69  ..**.** When usi
46b0: 6e 67 20 74 68 65 20 6e 65 77 20 66 74 73 33 20  ng the new fts3 
46c0: 71 75 65 72 79 20 73 79 6e 74 61 78 20 28 77 68  query syntax (wh
46d0: 65 6e 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  en SQLITE_ENABLE
46e0: 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 45 53 49  _FTS3_PARENTHESI
46f0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 29  S.** is defined)
4700: 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74  , the order of t
4710: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  he operators in 
4720: 70 72 65 63 65 64 65 6e 63 65 20 66 72 6f 6d 20  precedence from 
4730: 68 69 67 68 65 73 74 20 74 6f 0a 2a 2a 20 6c 6f  highest to.** lo
4740: 77 65 73 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  west is:.**.**  
4750: 20 4e 45 41 52 0a 2a 2a 20 20 20 4e 4f 54 0a 2a   NEAR.**   NOT.*
4760: 2a 20 20 20 41 4e 44 20 28 69 6e 63 6c 75 64 69  *   AND (includi
4770: 6e 67 20 69 6d 70 6c 69 63 69 74 20 41 4e 44 73  ng implicit ANDs
4780: 29 0a 2a 2a 20 20 20 4f 52 0a 2a 2a 0a 2a 2a 20  ).**   OR.**.** 
4790: 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 75  Note that when u
47a0: 73 69 6e 67 20 74 68 65 20 6f 6c 64 20 71 75 65  sing the old que
47b0: 72 79 20 73 79 6e 74 61 78 2c 20 74 68 65 20 4f  ry syntax, the O
47c0: 52 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 61  R operator has a
47d0: 20 68 69 67 68 65 72 0a 2a 2a 20 70 72 65 63 65   higher.** prece
47e0: 64 65 6e 63 65 20 74 68 61 6e 20 74 68 65 20 41  dence than the A
47f0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  ND operator..*/.
4800: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 50 72 65  static int opPre
4810: 63 65 64 65 6e 63 65 28 46 74 73 33 45 78 70 72  cedence(Fts3Expr
4820: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4830: 70 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45  p->eType!=FTSQUE
4840: 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 69  RY_PHRASE );.  i
4850: 66 28 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  f( sqlite3_fts3_
4860: 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
4870: 65 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  es ){.    return
4880: 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c   p->eType;.  }el
4890: 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d  se if( p->eType=
48a0: 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29  =FTSQUERY_NEAR )
48b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
48c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
48d0: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f  Type==FTSQUERY_O
48e0: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
48f0: 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  2;.  }.  assert(
4900: 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
4910: 45 52 59 5f 41 4e 44 20 29 3b 0a 20 20 72 65 74  ERY_AND );.  ret
4920: 75 72 6e 20 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 3;.}../*.** 
4930: 41 72 67 75 6d 65 6e 74 20 70 70 48 65 61 64 20  Argument ppHead 
4940: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
4950: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
4960: 74 20 68 65 61 64 20 6f 66 20 61 20 71 75 65 72  t head of a quer
4970: 79 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  y .** expression
4980: 20 74 72 65 65 20 62 65 69 6e 67 20 70 61 72 73   tree being pars
4990: 65 64 2e 20 70 50 72 65 76 20 69 73 20 74 68 65  ed. pPrev is the
49a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
49b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
49c0: 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
49d0: 74 68 65 20 74 72 65 65 2e 20 54 68 69 73 20 66  the tree. This f
49e0: 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 70 4e 65  unction adds pNe
49f0: 77 2c 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  w, which is alwa
4a00: 79 73 20 61 20 62 69 6e 61 72 79 0a 2a 2a 20 6f  ys a binary.** o
4a10: 70 65 72 61 74 6f 72 20 6e 6f 64 65 2c 20 69 6e  perator node, in
4a20: 74 6f 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  to the expressio
4a30: 6e 20 74 72 65 65 20 62 61 73 65 64 20 6f 6e 20  n tree based on 
4a40: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
4a50: 63 65 64 65 6e 63 65 0a 2a 2a 20 6f 66 20 70 4e  cedence.** of pN
4a60: 65 77 20 61 6e 64 20 74 68 65 20 65 78 69 73 74  ew and the exist
4a70: 69 6e 67 20 6e 6f 64 65 73 20 6f 66 20 74 68 65  ing nodes of the
4a80: 20 74 72 65 65 2e 20 54 68 69 73 20 6d 61 79 20   tree. This may 
4a90: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 68 65  result in the he
4aa0: 61 64 0a 2a 2a 20 6f 66 20 74 68 65 20 74 72 65  ad.** of the tre
4ab0: 65 20 63 68 61 6e 67 69 6e 67 2c 20 69 6e 20 77  e changing, in w
4ac0: 68 69 63 68 20 63 61 73 65 20 2a 70 70 48 65 61  hich case *ppHea
4ad0: 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
4ae0: 6e 65 77 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a  new root node..*
4af0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4b00: 73 65 72 74 42 69 6e 61 72 79 4f 70 65 72 61 74  sertBinaryOperat
4b10: 6f 72 28 0a 20 20 46 74 73 33 45 78 70 72 20 2a  or(.  Fts3Expr *
4b20: 2a 70 70 48 65 61 64 2c 20 20 20 20 20 20 20 2f  *ppHead,       /
4b30: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4b40: 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 20   root node of a 
4b50: 74 72 65 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  tree */.  Fts3Ex
4b60: 70 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  pr *pPrev,      
4b70: 20 20 20 2f 2a 20 4e 6f 64 65 20 6d 6f 73 74 20     /* Node most 
4b80: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
4b90: 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65 65 20  d into the tree 
4ba0: 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
4bb0: 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
4bc0: 20 4e 65 77 20 62 69 6e 61 72 79 20 6e 6f 64 65   New binary node
4bd0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
4be0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
4bf0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 45 78 70 72  */.){.  Fts3Expr
4c00: 20 2a 70 53 70 6c 69 74 20 3d 20 70 50 72 65 76   *pSplit = pPrev
4c10: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 70 6c 69  ;.  while( pSpli
4c20: 74 2d 3e 70 50 61 72 65 6e 74 20 26 26 20 6f 70  t->pParent && op
4c30: 50 72 65 63 65 64 65 6e 63 65 28 70 53 70 6c 69  Precedence(pSpli
4c40: 74 2d 3e 70 50 61 72 65 6e 74 29 3c 3d 6f 70 50  t->pParent)<=opP
4c50: 72 65 63 65 64 65 6e 63 65 28 70 4e 65 77 29 20  recedence(pNew) 
4c60: 29 7b 0a 20 20 20 20 70 53 70 6c 69 74 20 3d 20  ){.    pSplit = 
4c70: 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74 3b  pSplit->pParent;
4c80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 70 6c  .  }..  if( pSpl
4c90: 69 74 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20  it->pParent ){. 
4ca0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 6c 69     assert( pSpli
4cb0: 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 52 69 67  t->pParent->pRig
4cc0: 68 74 3d 3d 70 53 70 6c 69 74 20 29 3b 0a 20 20  ht==pSplit );.  
4cd0: 20 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e    pSplit->pParen
4ce0: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77  t->pRight = pNew
4cf0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72  ;.    pNew->pPar
4d00: 65 6e 74 20 3d 20 70 53 70 6c 69 74 2d 3e 70 50  ent = pSplit->pP
4d10: 61 72 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  arent;.  }else{.
4d20: 20 20 20 20 2a 70 70 48 65 61 64 20 3d 20 70 4e      *ppHead = pN
4d30: 65 77 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  ew;.  }.  pNew->
4d40: 70 4c 65 66 74 20 3d 20 70 53 70 6c 69 74 3b 0a  pLeft = pSplit;.
4d50: 20 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e    pSplit->pParen
4d60: 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  t = pNew;.}../*.
4d70: 2a 2a 20 50 61 72 73 65 20 74 68 65 20 66 74 73  ** Parse the fts
4d80: 33 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  3 query expressi
4d90: 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 62 75 66 66  on found in buff
4da0: 65 72 20 7a 2c 20 6c 65 6e 67 74 68 20 6e 2e 20  er z, length n. 
4db0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
4dc0: 20 72 65 74 75 72 6e 73 20 65 69 74 68 65 72 20   returns either 
4dd0: 77 68 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  when the end of 
4de0: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65  the buffer is re
4df0: 61 63 68 65 64 20 6f 72 20 61 6e 20 75 6e 6d 61  ached or an unma
4e00: 74 63 68 65 64 20 0a 2a 2a 20 63 6c 6f 73 69 6e  tched .** closin
4e10: 67 20 62 72 61 63 6b 65 74 20 2d 20 27 29 27 20  g bracket - ')' 
4e20: 2d 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  - is encountered
4e30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
4e40: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
4e50: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 2a 70   is returned, *p
4e60: 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20  pExpr is set to 
4e70: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4e80: 70 61 72 73 65 64 20 66 6f 72 6d 20 6f 66 20 74  parsed form of t
4e90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
4ea0: 64 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 69 73  d *pnConsumed is
4eb0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4ec0: 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 72  er of.** bytes r
4ed0: 65 61 64 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ead from buffer 
4ee0: 7a 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70  z. Otherwise, *p
4ef0: 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20  pExpr is set to 
4f00: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  0 and SQLITE_NOM
4f10: 45 4d 0a 2a 2a 20 28 6f 75 74 20 6f 66 20 6d 65  EM.** (out of me
4f20: 6d 6f 72 79 20 65 72 72 6f 72 29 20 6f 72 20 53  mory error) or S
4f30: 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 70 61 72  QLITE_ERROR (par
4f40: 73 65 20 65 72 72 6f 72 29 20 69 73 20 72 65 74  se error) is ret
4f50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
4f60: 20 69 6e 74 20 66 74 73 33 45 78 70 72 50 61 72   int fts3ExprPar
4f70: 73 65 28 0a 20 20 50 61 72 73 65 43 6f 6e 74 65  se(.  ParseConte
4f80: 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  xt *pParse,     
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fa0: 20 66 74 73 33 20 71 75 65 72 79 20 70 61 72 73   fts3 query pars
4fb0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
4fc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
4fd0: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
4fe0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4ff0: 66 20 4d 41 54 43 48 20 71 75 65 72 79 20 2a 2f  f MATCH query */
5000: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 70 70  .  Fts3Expr **pp
5010: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5030: 54 3a 20 50 61 72 73 65 64 20 71 75 65 72 79 20  T: Parsed query 
5040: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
5050: 6e 74 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20  nt *pnConsumed  
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
5080: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
5090: 6f 6e 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20  onsumed */.){.  
50a0: 46 74 73 33 45 78 70 72 20 2a 70 52 65 74 20 3d  Fts3Expr *pRet =
50b0: 20 30 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a   0;.  Fts3Expr *
50c0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 46 74 73  pPrev = 0;.  Fts
50d0: 33 45 78 70 72 20 2a 70 4e 6f 74 42 72 61 6e 63  3Expr *pNotBranc
50e0: 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  h = 0;          
50f0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 73 65       /* Only use
5100: 64 20 69 6e 20 6c 65 67 61 63 79 20 70 61 72 73  d in legacy pars
5110: 65 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  e mode */.  int 
5120: 6e 49 6e 20 3d 20 6e 3b 0a 20 20 63 6f 6e 73 74  nIn = n;.  const
5130: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 3b 0a   char *zIn = z;.
5140: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5150: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 52 65  E_OK;.  int isRe
5160: 71 75 69 72 65 50 68 72 61 73 65 20 3d 20 31 3b  quirePhrase = 1;
5170: 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
5180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5190: 46 74 73 33 45 78 70 72 20 2a 70 20 3d 20 30 3b  Fts3Expr *p = 0;
51a0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
51b0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   0;.    rc = get
51c0: 4e 65 78 74 4e 6f 64 65 28 70 50 61 72 73 65 2c  NextNode(pParse,
51d0: 20 7a 49 6e 2c 20 6e 49 6e 2c 20 26 70 2c 20 26   zIn, nIn, &p, &
51e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
51f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5200: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 68 72  .      int isPhr
5210: 61 73 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ase;..      if( 
5220: 21 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  !sqlite3_fts3_en
5230: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
5240: 20 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 65   .       && p->e
5250: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
5260: 48 52 41 53 45 20 26 26 20 70 50 61 72 73 65 2d  HRASE && pParse-
5270: 3e 69 73 4e 6f 74 20 0a 20 20 20 20 20 20 29 7b  >isNot .      ){
5280: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61  .        /* Crea
5290: 74 65 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 4e  te an implicit N
52a0: 4f 54 20 6f 70 65 72 61 74 6f 72 2e 20 2a 2f 0a  OT operator. */.
52b0: 20 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72          Fts3Expr
52c0: 20 2a 70 4e 6f 74 20 3d 20 66 74 73 33 4d 61 6c   *pNot = fts3Mal
52d0: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 46  locZero(sizeof(F
52e0: 74 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20 20  ts3Expr));.     
52f0: 20 20 20 69 66 28 20 21 70 4e 6f 74 20 29 7b 0a     if( !pNot ){.
5300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5310: 33 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29  3Fts3ExprFree(p)
5320: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
5330: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5340: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78           goto ex
5350: 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20  prparse_out;.   
5360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
5370: 4e 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46 54 53  Not->eType = FTS
5380: 51 55 45 52 59 5f 4e 4f 54 3b 0a 20 20 20 20 20  QUERY_NOT;.     
5390: 20 20 20 70 4e 6f 74 2d 3e 70 52 69 67 68 74 20     pNot->pRight 
53a0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = p;.        if(
53b0: 20 70 4e 6f 74 42 72 61 6e 63 68 20 29 7b 0a 20   pNotBranch ){. 
53c0: 20 20 20 20 20 20 20 20 20 70 4e 6f 74 2d 3e 70           pNot->p
53d0: 4c 65 66 74 20 3d 20 70 4e 6f 74 42 72 61 6e 63  Left = pNotBranc
53e0: 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
53f0: 20 20 20 20 20 70 4e 6f 74 42 72 61 6e 63 68 20       pNotBranch 
5400: 3d 20 70 4e 6f 74 3b 0a 20 20 20 20 20 20 20 20  = pNot;.        
5410: 70 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 20  p = pPrev;.     
5420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5430: 69 6e 74 20 65 54 79 70 65 20 3d 20 70 2d 3e 65  int eType = p->e
5440: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 73  Type;.        is
5450: 50 68 72 61 73 65 20 3d 20 28 65 54 79 70 65 3d  Phrase = (eType=
5460: 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
5470: 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 0a   || p->pLeft);..
5480: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
5490: 73 52 65 71 75 69 72 65 50 68 72 61 73 65 20 76  sRequirePhrase v
54a0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
54b0: 6f 20 74 72 75 65 20 69 66 20 61 20 70 68 72 61  o true if a phra
54c0: 73 65 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  se or.        **
54d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
54e0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 61 72 65  ontained in pare
54f0: 6e 74 68 65 73 69 73 20 69 73 20 72 65 71 75 69  nthesis is requi
5500: 72 65 64 2e 20 49 66 20 61 0a 20 20 20 20 20 20  red. If a.      
5510: 20 20 2a 2a 20 62 69 6e 61 72 79 20 6f 70 65 72    ** binary oper
5520: 61 74 6f 72 20 28 41 4e 44 2c 20 4f 52 2c 20 4e  ator (AND, OR, N
5530: 4f 54 20 6f 72 20 4e 45 41 52 29 20 69 73 20 65  OT or NEAR) is e
5540: 6e 63 6f 75 6e 74 65 64 20 77 68 65 6e 0a 20 20  ncounted when.  
5550: 20 20 20 20 20 20 2a 2a 20 69 73 52 65 71 75 69        ** isRequi
5560: 72 65 50 68 72 61 73 65 20 69 73 20 73 65 74 2c  rePhrase is set,
5570: 20 74 68 69 73 20 69 73 20 61 20 73 79 6e 74 61   this is a synta
5580: 78 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20  x error..       
5590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
55a0: 21 69 73 50 68 72 61 73 65 20 26 26 20 69 73 52  !isPhrase && isR
55b0: 65 71 75 69 72 65 50 68 72 61 73 65 20 29 7b 0a  equirePhrase ){.
55c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
55d0: 33 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29  3Fts3ExprFree(p)
55e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
55f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5600: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78           goto ex
5610: 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20  prparse_out;.   
5620: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
5630: 20 20 69 66 28 20 69 73 50 68 72 61 73 65 20 26    if( isPhrase &
5640: 26 20 21 69 73 52 65 71 75 69 72 65 50 68 72 61  & !isRequirePhra
5650: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
5660: 2f 2a 20 49 6e 73 65 72 74 20 61 6e 20 69 6d 70  /* Insert an imp
5670: 6c 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74  licit AND operat
5680: 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  or. */.         
5690: 20 46 74 73 33 45 78 70 72 20 2a 70 41 6e 64 3b   Fts3Expr *pAnd;
56a0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
56b0: 74 28 20 70 52 65 74 20 26 26 20 70 50 72 65 76  t( pRet && pPrev
56c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41   );.          pA
56d0: 6e 64 20 3d 20 66 74 73 33 4d 61 6c 6c 6f 63 5a  nd = fts3MallocZ
56e0: 65 72 6f 28 73 69 7a 65 6f 66 28 46 74 73 33 45  ero(sizeof(Fts3E
56f0: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  xpr));.         
5700: 20 69 66 28 20 21 70 41 6e 64 20 29 7b 0a 20 20   if( !pAnd ){.  
5710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5720: 33 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29  3Fts3ExprFree(p)
5730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
5740: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
5760: 6f 20 65 78 70 72 70 61 72 73 65 5f 6f 75 74 3b  o exprparse_out;
5770: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5780: 20 20 20 20 20 20 20 70 41 6e 64 2d 3e 65 54 79         pAnd->eTy
5790: 70 65 20 3d 20 46 54 53 51 55 45 52 59 5f 41 4e  pe = FTSQUERY_AN
57a0: 44 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 73  D;.          ins
57b0: 65 72 74 42 69 6e 61 72 79 4f 70 65 72 61 74 6f  ertBinaryOperato
57c0: 72 28 26 70 52 65 74 2c 20 70 50 72 65 76 2c 20  r(&pRet, pPrev, 
57d0: 70 41 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  pAnd);.         
57e0: 20 70 50 72 65 76 20 3d 20 70 41 6e 64 3b 0a 20   pPrev = pAnd;. 
57f0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
5800: 20 20 2f 2a 20 54 68 69 73 20 74 65 73 74 20 63    /* This test c
5810: 61 74 63 68 65 73 20 61 74 74 65 6d 70 74 73 20  atches attempts 
5820: 74 6f 20 6d 61 6b 65 20 65 69 74 68 65 72 20 6f  to make either o
5830: 70 65 72 61 6e 64 20 6f 66 20 61 20 4e 45 41 52  perand of a NEAR
5840: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 65 72  .        ** oper
5850: 61 74 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 6f  ator something o
5860: 74 68 65 72 20 74 68 61 6e 20 61 20 70 68 72 61  ther than a phra
5870: 73 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  se. For example,
5880: 20 65 69 74 68 65 72 20 6f 66 0a 20 20 20 20 20   either of.     
5890: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
58a0: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
58b0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 28 62          **    (b
58c0: 72 61 63 6b 65 74 65 64 20 65 78 70 72 65 73 73  racketed express
58d0: 69 6f 6e 29 20 4e 45 41 52 20 70 68 72 61 73 65  ion) NEAR phrase
58e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 70  .        **    p
58f0: 68 72 61 73 65 20 4e 45 41 52 20 28 62 72 61 63  hrase NEAR (brac
5900: 6b 65 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e  keted expression
5910: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
5920: 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61       ** Return a
5930: 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65  n error in eithe
5940: 72 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  r case..        
5950: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
5960: 50 72 65 76 20 26 26 20 28 0a 20 20 20 20 20 20  Prev && (.      
5970: 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 46 54        (eType==FT
5980: 53 51 55 45 52 59 5f 4e 45 41 52 20 26 26 20 21  SQUERY_NEAR && !
5990: 69 73 50 68 72 61 73 65 20 26 26 20 70 50 72 65  isPhrase && pPre
59a0: 76 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45  v->eType!=FTSQUE
59b0: 52 59 5f 50 48 52 41 53 45 29 0a 20 20 20 20 20  RY_PHRASE).     
59c0: 20 20 20 20 7c 7c 20 28 65 54 79 70 65 21 3d 46      || (eType!=F
59d0: 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 26  TSQUERY_PHRASE &
59e0: 26 20 69 73 50 68 72 61 73 65 20 26 26 20 70 50  & isPhrase && pP
59f0: 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  rev->eType==FTSQ
5a00: 55 45 52 59 5f 4e 45 41 52 29 0a 20 20 20 20 20  UERY_NEAR).     
5a10: 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 20     )){.         
5a20: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
5a30: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Free(p);.       
5a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5a50: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
5a60: 67 6f 74 6f 20 65 78 70 72 70 61 72 73 65 5f 6f  goto exprparse_o
5a70: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
5a80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
5a90: 68 72 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  hrase ){.       
5aa0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
5ab0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5ac0: 74 28 20 70 50 72 65 76 20 26 26 20 70 50 72 65  t( pPrev && pPre
5ad0: 76 2d 3e 70 4c 65 66 74 20 26 26 20 70 50 72 65  v->pLeft && pPre
5ae0: 76 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  v->pRight==0 );.
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
5b00: 76 2d 3e 70 52 69 67 68 74 20 3d 20 70 3b 0a 20  v->pRight = p;. 
5b10: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
5b20: 61 72 65 6e 74 20 3d 20 70 50 72 65 76 3b 0a 20  arent = pPrev;. 
5b30: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
5b50: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
5b60: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
5b70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72  .          inser
5b80: 74 42 69 6e 61 72 79 4f 70 65 72 61 74 6f 72 28  tBinaryOperator(
5b90: 26 70 52 65 74 2c 20 70 50 72 65 76 2c 20 70 29  &pRet, pPrev, p)
5ba0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5bb0: 20 20 20 20 69 73 52 65 71 75 69 72 65 50 68 72      isRequirePhr
5bc0: 61 73 65 20 3d 20 21 69 73 50 68 72 61 73 65 3b  ase = !isPhrase;
5bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
5be0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29  ssert( nByte>0 )
5bf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5c00: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
5c10: 4b 20 7c 7c 20 28 6e 42 79 74 65 3e 30 20 26 26  K || (nByte>0 &&
5c20: 20 6e 42 79 74 65 3c 3d 6e 49 6e 29 20 29 3b 0a   nByte<=nIn) );.
5c30: 20 20 20 20 6e 49 6e 20 2d 3d 20 6e 42 79 74 65      nIn -= nByte
5c40: 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 6e 42 79  ;.    zIn += nBy
5c50: 74 65 3b 0a 20 20 20 20 70 50 72 65 76 20 3d 20  te;.    pPrev = 
5c60: 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  p;.  }..  if( rc
5c70: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  ==SQLITE_DONE &&
5c80: 20 70 52 65 74 20 26 26 20 69 73 52 65 71 75 69   pRet && isRequi
5c90: 72 65 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20  rePhrase ){.    
5ca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5cb0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  R;.  }..  if( rc
5cc0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
5cd0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5ce0: 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21 73 71  _OK;.    if( !sq
5cf0: 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
5d00: 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20 26 26  e_parentheses &&
5d10: 20 70 4e 6f 74 42 72 61 6e 63 68 20 29 7b 0a 20   pNotBranch ){. 
5d20: 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20 29       if( !pRet )
5d30: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
5d40: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d60: 20 20 46 74 73 33 45 78 70 72 20 2a 70 49 74 65    Fts3Expr *pIte
5d70: 72 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68 3b 0a  r = pNotBranch;.
5d80: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
5d90: 49 74 65 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Iter->pLeft ){. 
5da0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 20 3d           pIter =
5db0: 20 70 49 74 65 72 2d 3e 70 4c 65 66 74 3b 0a 20   pIter->pLeft;. 
5dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5dd0: 20 70 49 74 65 72 2d 3e 70 4c 65 66 74 20 3d 20   pIter->pLeft = 
5de0: 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 70 52  pRet;.        pR
5df0: 65 74 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68 3b  et = pNotBranch;
5e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5e10: 20 7d 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64   }.  *pnConsumed
5e20: 20 3d 20 6e 20 2d 20 6e 49 6e 3b 0a 0a 65 78 70   = n - nIn;..exp
5e30: 72 70 61 72 73 65 5f 6f 75 74 3a 0a 20 20 69 66  rparse_out:.  if
5e40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
5e60: 73 33 45 78 70 72 46 72 65 65 28 70 52 65 74 29  s3ExprFree(pRet)
5e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
5e80: 33 45 78 70 72 46 72 65 65 28 70 4e 6f 74 42 72  3ExprFree(pNotBr
5e90: 61 6e 63 68 29 3b 0a 20 20 20 20 70 52 65 74 20  anch);.    pRet 
5ea0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78  = 0;.  }.  *ppEx
5eb0: 70 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  pr = pRet;.  ret
5ec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ed0: 20 50 61 72 61 6d 65 74 65 72 73 20 7a 20 61 6e   Parameters z an
5ee0: 64 20 6e 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  d n contain a po
5ef0: 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 6c 65 6e  inter to and len
5f00: 67 74 68 20 6f 66 20 61 20 62 75 66 66 65 72 20  gth of a buffer 
5f10: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
5f20: 20 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72   fts3 query expr
5f30: 65 73 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69  ession, respecti
5f40: 76 65 6c 79 2e 20 54 68 69 73 20 66 75 6e 63 74  vely. This funct
5f50: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
5f60: 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 71 75 65  parse the.** que
5f70: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ry expression an
5f80: 64 20 63 72 65 61 74 65 20 61 20 74 72 65 65 20  d create a tree 
5f90: 6f 66 20 46 74 73 33 45 78 70 72 20 73 74 72 75  of Fts3Expr stru
5fa0: 63 74 75 72 65 73 20 72 65 70 72 65 73 65 6e 74  ctures represent
5fb0: 69 6e 67 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  ing the.** parse
5fc0: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 66  d expression. If
5fd0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
5fe0: 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20 70  Expr is set to p
5ff0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 68 65 61 64  oint to the head
6000: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 73 65  .** of the parse
6010: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  d expression tre
6020: 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
6030: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
6040: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
6050: 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
6060: 45 5f 4e 4f 4d 45 4d 20 28 6f 75 74 2d 6f 66 2d  E_NOMEM (out-of-
6070: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 29 20 6f 72  memory error) or
6080: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 70   SQLITE_ERROR (p
6090: 61 72 73 65 0a 2a 2a 20 65 72 72 6f 72 29 20 69  arse.** error) i
60a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
60b0: 70 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f  ppExpr is set to
60c0: 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72   0..**.** If par
60d0: 61 6d 65 74 65 72 20 6e 20 69 73 20 61 20 6e 65  ameter n is a ne
60e0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 74  gative number, t
60f0: 68 65 6e 20 7a 20 69 73 20 61 73 73 75 6d 65 64  hen z is assumed
6100: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a   to point to a.*
6110: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
6120: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
6130: 6c 65 6e 67 74 68 20 69 73 20 64 65 74 65 72 6d  length is determ
6140: 69 6e 65 64 20 75 73 69 6e 67 20 73 74 72 6c 65  ined using strle
6150: 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  n()..**.** The f
6160: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 2c 20  irst parameter, 
6170: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 73 20 70  pTokenizer, is p
6180: 61 73 73 65 64 20 74 68 65 20 66 74 73 33 20 74  assed the fts3 t
6190: 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20  okenizer module 
61a0: 74 6f 0a 2a 2a 20 75 73 65 20 74 6f 20 6e 6f 72  to.** use to nor
61b0: 6d 61 6c 69 7a 65 20 71 75 65 72 79 20 74 6f 6b  malize query tok
61c0: 65 6e 73 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ens while parsin
61d0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
61e0: 2e 20 54 68 65 20 61 7a 43 6f 6c 5b 5d 0a 2a 2a  . The azCol[].**
61f0: 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
6200: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
6210: 61 69 6e 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  ain nCol entries
6220: 2c 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  , should contain
6230: 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66   the names.** of
6240: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
6250: 74 68 65 20 74 61 72 67 65 74 20 66 74 73 33 20  the target fts3 
6260: 74 61 62 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20  table, in order 
6270: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
6280: 68 74 2e 20 0a 2a 2a 20 43 6f 6c 75 6d 6e 20 6e  ht. .** Column n
6290: 61 6d 65 73 20 6d 75 73 74 20 62 65 20 6e 75 6c  ames must be nul
62a0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
62b0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ngs..**.** The i
62c0: 44 65 66 61 75 6c 74 43 6f 6c 20 70 61 72 61 6d  DefaultCol param
62d0: 65 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20 70  eter should be p
62e0: 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
62f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
6300: 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  umn.** that appe
6310: 61 72 73 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  ars on the left-
6320: 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
6330: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
6340: 28 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20  (the default.** 
6350: 63 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63 68 20  column to match 
6360: 61 67 61 69 6e 73 74 20 66 6f 72 20 74 6f 6b 65  against for toke
6370: 6e 73 20 66 6f 72 20 77 68 69 63 68 20 61 20 63  ns for which a c
6380: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f  olumn name is no
6390: 74 20 65 78 70 6c 69 63 69 74 6c 79 0a 2a 2a 20  t explicitly.** 
63a0: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
63b0: 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 73  t of the query s
63c0: 74 72 69 6e 67 29 2c 20 6f 72 20 2d 31 20 69 66  tring), or -1 if
63d0: 20 74 6f 6b 65 6e 73 20 6d 61 79 20 62 79 20 64   tokens may by d
63e0: 65 66 61 75 6c 74 0a 2a 2a 20 6d 61 74 63 68 20  efault.** match 
63f0: 61 6e 79 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  any table column
6400: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6410: 46 74 73 33 45 78 70 72 50 61 72 73 65 28 0a 20  Fts3ExprParse(. 
6420: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
6430: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 20  er *pTokenizer, 
6440: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65       /* Tokenize
6450: 72 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 69 6e  r module */.  in
6460: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
6490: 20 66 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 20 2a   for tokenizer *
64a0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
64b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
64d0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
64e0: 20 66 6f 72 20 66 74 73 33 20 74 61 62 6c 65 20   for fts3 table 
64f0: 2a 2f 0a 20 20 69 6e 74 20 62 46 74 73 34 2c 20  */.  int bFts4, 
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6520: 20 74 6f 20 61 6c 6c 6f 77 20 46 54 53 34 2d 6f   to allow FTS4-o
6530: 6e 6c 79 20 73 79 6e 74 61 78 20 2a 2f 0a 20 20  nly syntax */.  
6540: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6570: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 43 6f   entries in azCo
6580: 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65  l[] */.  int iDe
6590: 66 61 75 6c 74 43 6f 6c 2c 20 20 20 20 20 20 20  faultCol,       
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65b0: 44 65 66 61 75 6c 74 20 63 6f 6c 75 6d 6e 20 74  Default column t
65c0: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
65d0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
65e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
65f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 4d 41 54 43   /* Text of MATC
6600: 48 20 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73  H query */.  Fts
6610: 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20  3Expr **ppExpr  
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 2f 2a 20 4f 55 54 3a 20 50 61 72 73 65 64 20   /* OUT: Parsed 
6640: 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20  query structure 
6650: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 72  */.){.  int nPar
6660: 73 65 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sed;.  int rc;. 
6670: 20 50 61 72 73 65 43 6f 6e 74 65 78 74 20 73 50   ParseContext sP
6680: 61 72 73 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  arse;..  memset(
6690: 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65  &sParse, 0, size
66a0: 6f 66 28 50 61 72 73 65 43 6f 6e 74 65 78 74 29  of(ParseContext)
66b0: 29 3b 0a 20 20 73 50 61 72 73 65 2e 70 54 6f 6b  );.  sParse.pTok
66c0: 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69  enizer = pTokeni
66d0: 7a 65 72 3b 0a 20 20 73 50 61 72 73 65 2e 69 4c  zer;.  sParse.iL
66e0: 61 6e 67 69 64 20 3d 20 69 4c 61 6e 67 69 64 3b  angid = iLangid;
66f0: 0a 20 20 73 50 61 72 73 65 2e 61 7a 43 6f 6c 20  .  sParse.azCol 
6700: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  = (const char **
6710: 29 61 7a 43 6f 6c 3b 0a 20 20 73 50 61 72 73 65  )azCol;.  sParse
6720: 2e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  .nCol = nCol;.  
6730: 73 50 61 72 73 65 2e 69 44 65 66 61 75 6c 74 43  sParse.iDefaultC
6740: 6f 6c 20 3d 20 69 44 65 66 61 75 6c 74 43 6f 6c  ol = iDefaultCol
6750: 3b 0a 20 20 73 50 61 72 73 65 2e 62 46 74 73 34  ;.  sParse.bFts4
6760: 20 3d 20 62 46 74 73 34 3b 0a 20 20 69 66 28 20   = bFts4;.  if( 
6770: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 45  z==0 ){.    *ppE
6780: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  xpr = 0;.    ret
6790: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
67a0: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a   }.  if( n<0 ){.
67b0: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72      n = (int)str
67c0: 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 72 63  len(z);.  }.  rc
67d0: 20 3d 20 66 74 73 33 45 78 70 72 50 61 72 73 65   = fts3ExprParse
67e0: 28 26 73 50 61 72 73 65 2c 20 7a 2c 20 6e 2c 20  (&sParse, z, n, 
67f0: 70 70 45 78 70 72 2c 20 26 6e 50 61 72 73 65 64  ppExpr, &nParsed
6800: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  );..  /* Check f
6810: 6f 72 20 6d 69 73 6d 61 74 63 68 65 64 20 70 61  or mismatched pa
6820: 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a 20 20 69  renthesis */.  i
6830: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6840: 20 26 26 20 73 50 61 72 73 65 2e 6e 4e 65 73 74   && sParse.nNest
6850: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6860: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
6870: 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72  qlite3Fts3ExprFr
6880: 65 65 28 2a 70 70 45 78 70 72 29 3b 0a 20 20 20  ee(*ppExpr);.   
6890: 20 2a 70 70 45 78 70 72 20 3d 20 30 3b 0a 20 20   *ppExpr = 0;.  
68a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
68b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
68c0: 70 61 72 73 65 64 20 66 74 73 33 20 71 75 65 72  parsed fts3 quer
68d0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6c 6c  y expression all
68e0: 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ocated by sqlite
68f0: 33 46 74 73 33 45 78 70 72 50 61 72 73 65 28 29  3Fts3ExprParse()
6900: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6910: 33 46 74 73 33 45 78 70 72 46 72 65 65 28 46 74  3Fts3ExprFree(Ft
6920: 73 33 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  s3Expr *p){.  if
6930: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
6940: 74 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53  t( p->eType==FTS
6950: 51 55 45 52 59 5f 50 48 52 41 53 45 20 7c 7c 20  QUERY_PHRASE || 
6960: 70 2d 3e 70 50 68 72 61 73 65 3d 3d 30 20 29 3b  p->pPhrase==0 );
6970: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
6980: 45 78 70 72 46 72 65 65 28 70 2d 3e 70 4c 65 66  ExprFree(p->pLef
6990: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  t);.    sqlite3F
69a0: 74 73 33 45 78 70 72 46 72 65 65 28 70 2d 3e 70  ts3ExprFree(p->p
69b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69  Right);.    sqli
69c0: 74 65 33 46 74 73 33 45 76 61 6c 50 68 72 61 73  te3Fts3EvalPhras
69d0: 65 43 6c 65 61 6e 75 70 28 70 2d 3e 70 50 68 72  eCleanup(p->pPhr
69e0: 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
69f0: 33 5f 66 72 65 65 28 70 2d 3e 61 4d 49 29 3b 0a  3_free(p->aMI);.
6a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6a10: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a  (p);.  }.}../***
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ab0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79  *******.** Every
6ac0: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 69 73  thing after this
6ad0: 20 70 6f 69 6e 74 20 69 73 20 6a 75 73 74 20 74   point is just t
6ae0: 65 73 74 20 63 6f 64 65 2e 0a 2a 2f 0a 0a 23 69  est code..*/..#i
6af0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
6b00: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  ..#include <stdi
6b10: 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  o.h>../*.** Func
6b20: 74 69 6f 6e 20 74 6f 20 71 75 65 72 79 20 74 68  tion to query th
6b30: 65 20 68 61 73 68 2d 74 61 62 6c 65 20 6f 66 20  e hash-table of 
6b40: 74 6f 6b 65 6e 69 7a 65 72 73 20 28 73 65 65 20  tokenizers (see 
6b50: 52 45 41 44 4d 45 2e 74 6f 6b 65 6e 69 7a 65 72  README.tokenizer
6b60: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
6b70: 74 20 71 75 65 72 79 54 65 73 74 54 6f 6b 65 6e  t queryTestToken
6b80: 69 7a 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  izer(.  sqlite3 
6b90: 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
6ba0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 0a 20 20 63  ar *zName,  .  c
6bb0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b  onst sqlite3_tok
6bc0: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a  enizer_module **
6bd0: 70 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pp.){.  int rc;.
6be0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6bf0: 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 63  pStmt;.  const c
6c00: 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 53 45  har zSql[] = "SE
6c10: 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69  LECT fts3_tokeni
6c20: 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 2a 70 70 20  zer(?)";..  *pp 
6c30: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
6c40: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6c50: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
6c60: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6c70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6c80: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6c90: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6ca0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
6cb0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
6cc0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  ITE_STATIC);.  i
6cd0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
6ce0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
6cf0: 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  t) ){.    if( sq
6d00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
6d10: 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c  e(pStmt, 0)==SQL
6d20: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
6d30: 20 20 6d 65 6d 63 70 79 28 28 76 6f 69 64 20 2a    memcpy((void *
6d40: 29 70 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  )pp, sqlite3_col
6d50: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
6d60: 30 29 2c 20 73 69 7a 65 6f 66 28 2a 70 70 29 29  0), sizeof(*pp))
6d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
6d80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
6d90: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d  nalize(pStmt);.}
6da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6db0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
6dc0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
6dd0: 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  a text represent
6de0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
6df0: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
6e00: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
6e10: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 62 75 66  rgument. The buf
6e20: 66 65 72 20 69 73 20 6f 62 74 61 69 6e 65 64 20  fer is obtained 
6e30: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
6e40: 6d 61 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20  malloc(). It is 
6e50: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
6e60: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
6e70: 20 74 6f 20 75 73 65 20 0a 2a 2a 20 73 71 6c 69   to use .** sqli
6e80: 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65  te3_free() to re
6e90: 6c 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  lease the memory
6ea0: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64  . If an OOM cond
6eb0: 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74  ition is encount
6ec0: 65 72 65 64 2c 0a 2a 2a 20 4e 55 4c 4c 20 69 73  ered,.** NULL is
6ed0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
6ee0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
6ef0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
6f00: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ULL, then its co
6f10: 6e 74 65 6e 74 73 20 61 72 65 20 70 72 65 70 65  ntents are prepe
6f20: 6e 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 65 20  nded to .** the 
6f30: 72 65 74 75 72 6e 65 64 20 65 78 70 72 65 73 73  returned express
6f40: 69 6f 6e 20 74 65 78 74 20 61 6e 64 20 74 68 65  ion text and the
6f50: 6e 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  n freed using sq
6f60: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6f70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
6f80: 70 72 54 6f 53 74 72 69 6e 67 28 46 74 73 33 45  prToString(Fts3E
6f90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
6fa0: 20 2a 7a 42 75 66 29 7b 0a 20 20 73 77 69 74 63   *zBuf){.  switc
6fb0: 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20  h( pExpr->eType 
6fc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 51  ){.    case FTSQ
6fd0: 55 45 52 59 5f 50 48 52 41 53 45 3a 20 7b 0a 20  UERY_PHRASE: {. 
6fe0: 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20       Fts3Phrase 
6ff0: 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72  *pPhrase = pExpr
7000: 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20  ->pPhrase;.     
7010: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 7a 42   int i;.      zB
7020: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
7030: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
7040: 22 25 7a 50 48 52 41 53 45 20 25 64 20 30 22 2c  "%zPHRASE %d 0",
7050: 20 7a 42 75 66 2c 20 70 50 68 72 61 73 65 2d 3e   zBuf, pPhrase->
7060: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
7070: 66 6f 72 28 69 3d 30 3b 20 7a 42 75 66 20 26 26  for(i=0; zBuf &&
7080: 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b   i<pPhrase->nTok
7090: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
70a0: 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33    zBuf = sqlite3
70b0: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 25 2e 2a  _mprintf("%z %.*
70c0: 73 25 73 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20  s%s", zBuf, .   
70d0: 20 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65           pPhrase
70e0: 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 6e 2c 20 70  ->aToken[i].n, p
70f0: 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
7100: 5d 2e 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ].z,.           
7110: 20 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65   (pPhrase->aToke
7120: 6e 5b 69 5d 2e 69 73 50 72 65 66 69 78 3f 22 2b  n[i].isPrefix?"+
7130: 22 3a 22 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ":"").        );
7140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
7150: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 20 20 20 20  eturn zBuf;.    
7160: 7d 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53 51  }..    case FTSQ
7170: 55 45 52 59 5f 4e 45 41 52 3a 0a 20 20 20 20 20  UERY_NEAR:.     
7180: 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   zBuf = sqlite3_
7190: 6d 70 72 69 6e 74 66 28 22 25 7a 4e 45 41 52 2f  mprintf("%zNEAR/
71a0: 25 64 20 22 2c 20 7a 42 75 66 2c 20 70 45 78 70  %d ", zBuf, pExp
71b0: 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20  r->nNear);.     
71c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
71d0: 20 46 54 53 51 55 45 52 59 5f 4e 4f 54 3a 0a 20   FTSQUERY_NOT:. 
71e0: 20 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69       zBuf = sqli
71f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 4e  te3_mprintf("%zN
7200: 4f 54 20 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20  OT ", zBuf);.   
7210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7220: 73 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a  se FTSQUERY_AND:
7230: 0a 20 20 20 20 20 20 7a 42 75 66 20 3d 20 73 71  .      zBuf = sq
7240: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
7250: 7a 41 4e 44 20 22 2c 20 7a 42 75 66 29 3b 0a 20  zAND ", zBuf);. 
7260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7270: 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4f 52  case FTSQUERY_OR
7280: 3a 0a 20 20 20 20 20 20 7a 42 75 66 20 3d 20 73  :.      zBuf = s
7290: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
72a0: 25 7a 4f 52 20 22 2c 20 7a 42 75 66 29 3b 0a 20  %zOR ", zBuf);. 
72b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
72c0: 0a 20 20 69 66 28 20 7a 42 75 66 20 29 20 7a 42  .  if( zBuf ) zB
72d0: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
72e0: 69 6e 74 66 28 22 25 7a 7b 22 2c 20 7a 42 75 66  intf("%z{", zBuf
72f0: 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 20  );.  if( zBuf ) 
7300: 7a 42 75 66 20 3d 20 65 78 70 72 54 6f 53 74 72  zBuf = exprToStr
7310: 69 6e 67 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ing(pExpr->pLeft
7320: 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 7a  , zBuf);.  if( z
7330: 42 75 66 20 29 20 7a 42 75 66 20 3d 20 73 71 6c  Buf ) zBuf = sql
7340: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
7350: 7d 20 7b 22 2c 20 7a 42 75 66 29 3b 0a 0a 20 20  } {", zBuf);..  
7360: 69 66 28 20 7a 42 75 66 20 29 20 7a 42 75 66 20  if( zBuf ) zBuf 
7370: 3d 20 65 78 70 72 54 6f 53 74 72 69 6e 67 28 70  = exprToString(p
7380: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 7a 42  Expr->pRight, zB
7390: 75 66 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 20  uf);.  if( zBuf 
73a0: 29 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33  ) zBuf = sqlite3
73b0: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 7d 22 2c 20  _mprintf("%z}", 
73c0: 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e  zBuf);..  return
73d0: 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zBuf;.}../*.** 
73e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c  This is the impl
73f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20  ementation of a 
7400: 73 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74  scalar SQL funct
7410: 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 73 74  ion used to test
7420: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
7430: 69 6f 6e 20 70 61 72 73 65 72 2e 20 49 74 20 73  ion parser. It s
7440: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7450: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
7460: 2a 20 20 20 66 74 73 33 5f 65 78 70 72 74 65 73  *   fts3_exprtes
7470: 74 28 3c 74 6f 6b 65 6e 69 7a 65 72 3e 2c 20 3c  t(<tokenizer>, <
7480: 65 78 70 72 3e 2c 20 3c 63 6f 6c 75 6d 6e 20 31  expr>, <column 1
7490: 3e 2c 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  >, ...);.**.** T
74a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
74b0: 74 2c 20 3c 74 6f 6b 65 6e 69 7a 65 72 3e 2c 20  t, <tokenizer>, 
74c0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
74d0: 68 65 20 66 74 73 33 20 74 6f 6b 65 6e 69 7a 65  he fts3 tokenize
74e0: 72 20 75 73 65 64 0a 2a 2a 20 74 6f 20 70 61 72  r used.** to par
74f0: 73 65 20 74 68 65 20 71 75 65 72 79 20 65 78 70  se the query exp
7500: 72 65 73 73 69 6f 6e 20 28 73 65 65 20 52 45 41  ression (see REA
7510: 44 4d 45 2e 74 6f 6b 65 6e 69 7a 65 72 73 29 2e  DME.tokenizers).
7520: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
7530: 6d 65 6e 74 0a 2a 2a 20 69 73 20 74 68 65 20 71  ment.** is the q
7540: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
7550: 74 6f 20 70 61 72 73 65 2e 20 45 61 63 68 20 73  to parse. Each s
7560: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
7570: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 2a  nt is the name.*
7580: 2a 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  * of a column of
7590: 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 20   the fts3 table 
75a0: 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 65  that the query e
75b0: 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 72 65  xpression may re
75c0: 66 65 72 20 74 6f 2e 0a 2a 2a 20 46 6f 72 20 65  fer to..** For e
75d0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
75e0: 53 45 4c 45 43 54 20 66 74 73 33 5f 65 78 70 72  SELECT fts3_expr
75f0: 74 65 73 74 28 27 73 69 6d 70 6c 65 27 2c 20 27  test('simple', '
7600: 42 69 6c 6c 20 63 6f 6c 32 3a 42 6c 6f 67 67 73  Bill col2:Bloggs
7610: 27 2c 20 27 63 6f 6c 31 27 2c 20 27 63 6f 6c 32  ', 'col1', 'col2
7620: 27 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ');.*/.static vo
7630: 69 64 20 66 74 73 33 45 78 70 72 54 65 73 74 28  id fts3ExprTest(
7640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7650: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7660: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7670: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7680: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  ){.  sqlite3_tok
7690: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
76a0: 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 30  nst *pModule = 0
76b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
76c0: 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65  nizer *pTokenize
76d0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  r = 0;.  int rc;
76e0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20  .  char **azCol 
76f0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
7700: 72 20 2a 7a 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *zExpr;.  int 
7710: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e 43 6f  nExpr;.  int nCo
7720: 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 46  l;.  int ii;.  F
7730: 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  ts3Expr *pExpr;.
7740: 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30    char *zBuf = 0
7750: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7760: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
7770: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
7780: 65 78 74 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ext);..  if( arg
7790: 63 3c 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  c<3 ){.    sqlit
77a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
77b0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  context, .      
77c0: 20 20 22 55 73 61 67 65 3a 20 66 74 73 33 5f 65    "Usage: fts3_e
77d0: 78 70 72 74 65 73 74 28 74 6f 6b 65 6e 69 7a 65  xprtest(tokenize
77e0: 72 2c 20 65 78 70 72 2c 20 63 6f 6c 31 2c 20 2e  r, expr, col1, .
77f0: 2e 2e 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20  ..", -1.    );. 
7800: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
7810: 20 20 72 63 20 3d 20 71 75 65 72 79 54 65 73 74    rc = queryTest
7820: 54 6f 6b 65 6e 69 7a 65 72 28 64 62 2c 0a 20 20  Tokenizer(db,.  
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
7850: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
7860: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7870: 29 2c 20 26 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ), &pModule);.  
7880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
7890: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
78a0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
78b0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
78c0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 70 72 74 65  .    goto exprte
78d0: 73 74 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  st_out;.  }else 
78e0: 69 66 28 20 21 70 4d 6f 64 75 6c 65 20 29 7b 0a  if( !pModule ){.
78f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7900: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
7910: 2c 20 22 4e 6f 20 73 75 63 68 20 74 6f 6b 65 6e  , "No such token
7920: 69 7a 65 72 20 6d 6f 64 75 6c 65 22 2c 20 2d 31  izer module", -1
7930: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 70 72  );.    goto expr
7940: 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  test_out;.  }.. 
7950: 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
7960: 43 72 65 61 74 65 28 30 2c 20 30 2c 20 26 70 54  Create(0, 0, &pT
7970: 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20 61 73 73  okenizer);.  ass
7980: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
7990: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
79a0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
79b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
79c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
79d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
79e0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
79f0: 20 67 6f 74 6f 20 65 78 70 72 74 65 73 74 5f 6f   goto exprtest_o
7a00: 75 74 3b 0a 20 20 7d 0a 20 20 70 54 6f 6b 65 6e  ut;.  }.  pToken
7a10: 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20  izer->pModule = 
7a20: 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 7a 45 78 70  pModule;..  zExp
7a30: 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  r = (const char 
7a40: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7a50: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
7a60: 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   nExpr = sqlite3
7a70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
7a80: 76 5b 31 5d 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20  v[1]);.  nCol = 
7a90: 61 72 67 63 2d 32 3b 0a 20 20 61 7a 43 6f 6c 20  argc-2;.  azCol 
7aa0: 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
7ab0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 6f 6c 2a 73  e3_malloc(nCol*s
7ac0: 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a  izeof(char *));.
7ad0: 20 20 69 66 28 20 21 61 7a 43 6f 6c 20 29 7b 0a    if( !azCol ){.
7ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7af0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
7b00: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
7b10: 6f 20 65 78 70 72 74 65 73 74 5f 6f 75 74 3b 0a  o exprtest_out;.
7b20: 20 20 7d 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20    }.  for(ii=0; 
7b30: 69 69 3c 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a  ii<nCol; ii++){.
7b40: 20 20 20 20 61 7a 43 6f 6c 5b 69 69 5d 20 3d 20      azCol[ii] = 
7b50: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
7b60: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7b70: 69 69 2b 32 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72  ii+2]);.  }..  r
7b80: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45  c = sqlite3Fts3E
7b90: 78 70 72 50 61 72 73 65 28 0a 20 20 20 20 20 20  xprParse(.      
7ba0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 30 2c 20 61  pTokenizer, 0, a
7bb0: 7a 43 6f 6c 2c 20 30 2c 20 6e 43 6f 6c 2c 20 6e  zCol, 0, nCol, n
7bc0: 43 6f 6c 2c 20 7a 45 78 70 72 2c 20 6e 45 78 70  Col, zExpr, nExp
7bd0: 72 2c 20 26 70 45 78 70 72 0a 20 20 29 3b 0a 20  r, &pExpr.  );. 
7be0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7bf0: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
7c00: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
7c10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7c20: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 45 72 72  or(context, "Err
7c30: 6f 72 20 70 61 72 73 69 6e 67 20 65 78 70 72 65  or parsing expre
7c40: 73 73 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d  ssion", -1);.  }
7c50: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
7c60: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 21 28 7a  ITE_NOMEM || !(z
7c70: 42 75 66 20 3d 20 65 78 70 72 54 6f 53 74 72 69  Buf = exprToStri
7c80: 6e 67 28 70 45 78 70 72 2c 20 30 29 29 20 29 7b  ng(pExpr, 0)) ){
7c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
7ca0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
7cb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73  context);.  }els
7cc0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
7cd0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7ce0: 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
7cf0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7d10: 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 0a 20 20  e(zBuf);.  }..  
7d20: 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46  sqlite3Fts3ExprF
7d30: 72 65 65 28 70 45 78 70 72 29 3b 0a 0a 65 78 70  ree(pExpr);..exp
7d40: 72 74 65 73 74 5f 6f 75 74 3a 0a 20 20 69 66 28  rtest_out:.  if(
7d50: 20 70 4d 6f 64 75 6c 65 20 26 26 20 70 54 6f 6b   pModule && pTok
7d60: 65 6e 69 7a 65 72 20 29 7b 0a 20 20 20 20 72 63  enizer ){.    rc
7d70: 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73   = pModule->xDes
7d80: 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72 29  troy(pTokenizer)
7d90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7da0: 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
7db0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
7dc0: 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
7dd0: 69 6f 6e 20 70 61 72 73 65 72 20 74 65 73 74 20  ion parser test 
7de0: 66 75 6e 63 74 69 6f 6e 20 66 74 73 33 5f 65 78  function fts3_ex
7df0: 70 72 74 65 73 74 28 29 20 0a 2a 2a 20 77 69 74  prtest() .** wit
7e00: 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  h database conne
7e10: 63 74 69 6f 6e 20 64 62 2e 20 0a 2a 2f 0a 69 6e  ction db. .*/.in
7e20: 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70  t sqlite3Fts3Exp
7e30: 72 49 6e 69 74 54 65 73 74 49 6e 74 65 72 66 61  rInitTestInterfa
7e40: 63 65 28 73 71 6c 69 74 65 33 2a 20 64 62 29 7b  ce(sqlite3* db){
7e50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
7e60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7e70: 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
7e80: 73 33 5f 65 78 70 72 74 65 73 74 22 2c 20 2d 31  s3_exprtest", -1
7e90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
7ea0: 2c 20 66 74 73 33 45 78 70 72 54 65 73 74 2c 20  , fts3ExprTest, 
7eb0: 30 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a 23 65 6e  0, 0.  );.}..#en
7ec0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  dif.#endif /* !d
7ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
7ee0: 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  RE) || defined(S
7ef0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
7f00: 33 29 20 2a 2f 0a                                3) */.