/ Hex Artifact Content
Login

Artifact f4ff02ebe854e97ac03ff00b38b728a9ab57fd4b:


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 66 20 21 64 65  ded. .*/.#if !de
0270: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
0280: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
0290: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
02a0: 29 0a 0a 2f 2a 0a 2a 2a 20 42 79 20 64 65 66 61  )../*.** By defa
02b0: 75 6c 74 2c 20 74 68 69 73 20 6d 6f 64 75 6c 65  ult, this module
02c0: 20 70 61 72 73 65 73 20 74 68 65 20 6c 65 67 61   parses the lega
02d0: 63 79 20 73 79 6e 74 61 78 20 74 68 61 74 20 68  cy syntax that h
02e0: 61 73 20 62 65 65 6e 20 0a 2a 2a 20 74 72 61 64  as been .** trad
02f0: 69 74 69 6f 6e 61 6c 6c 79 20 75 73 65 64 20 62  itionally used b
0300: 79 20 66 74 73 33 2e 20 4f 72 2c 20 69 66 20 53  y fts3. Or, if S
0310: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
0320: 33 5f 50 41 52 45 4e 54 48 45 53 49 53 0a 2a 2a  3_PARENTHESIS.**
0330: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
0340: 6e 20 69 74 20 75 73 65 73 20 74 68 65 20 6e 65  n it uses the ne
0350: 77 20 73 79 6e 74 61 78 2e 20 54 68 65 20 64 69  w syntax. The di
0360: 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65  fferences betwee
0370: 6e 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6e 64  n.** the new and
0380: 20 74 68 65 20 6f 6c 64 20 73 79 6e 74 61 78 65   the old syntaxe
0390: 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 61 29  s are:.**.**  a)
03a0: 20 54 68 65 20 6e 65 77 20 73 79 6e 74 61 78 20   The new syntax 
03b0: 73 75 70 70 6f 72 74 73 20 70 61 72 65 6e 74 68  supports parenth
03c0: 65 73 69 73 2e 20 54 68 65 20 6f 6c 64 20 64 6f  esis. The old do
03d0: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 20 62  es not..**.**  b
03e0: 29 20 54 68 65 20 6e 65 77 20 73 79 6e 74 61 78  ) The new syntax
03f0: 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 41 4e   supports the AN
0400: 44 20 61 6e 64 20 4e 4f 54 20 6f 70 65 72 61 74  D and NOT operat
0410: 6f 72 73 2e 20 54 68 65 20 6f 6c 64 20 64 6f 65  ors. The old doe
0420: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 20 63 29  s not..**.**  c)
0430: 20 54 68 65 20 6f 6c 64 20 73 79 6e 74 61 78 20   The old syntax 
0440: 73 75 70 70 6f 72 74 73 20 74 68 65 20 22 2d 22  supports the "-"
0450: 20 74 6f 6b 65 6e 20 71 75 61 6c 69 66 69 65 72   token qualifier
0460: 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 0a 2a  . This is not .*
0470: 2a 20 20 20 20 20 73 75 70 70 6f 72 74 65 64 20  *     supported 
0480: 62 79 20 74 68 65 20 6e 65 77 20 73 79 6e 74 61  by the new synta
0490: 78 20 28 69 74 20 69 73 20 72 65 70 6c 61 63 65  x (it is replace
04a0: 64 20 62 79 20 74 68 65 20 4e 4f 54 20 6f 70 65  d by the NOT ope
04b0: 72 61 74 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 20 64  rator)..**.**  d
04c0: 29 20 57 68 65 6e 20 75 73 69 6e 67 20 74 68 65  ) When using the
04d0: 20 6f 6c 64 20 73 79 6e 74 61 78 2c 20 74 68 65   old syntax, the
04e0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 68 61 73   OR operator has
04f0: 20 61 20 67 72 65 61 74 65 72 20 70 72 65 63 65   a greater prece
0500: 64 65 6e 63 65 0a 2a 2a 20 20 20 20 20 74 68 61  dence.**     tha
0510: 6e 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e  n an implicit AN
0520: 44 2e 20 57 68 65 6e 20 75 73 69 6e 67 20 74 68  D. When using th
0530: 65 20 6e 65 77 2c 20 62 6f 74 68 20 69 6d 70 6c  e new, both impl
0540: 69 63 69 74 79 20 61 6e 64 20 65 78 70 6c 69 63  icity and explic
0550: 69 74 0a 2a 2a 20 20 20 20 20 41 4e 44 20 6f 70  it.**     AND op
0560: 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 20 68  erators have a h
0570: 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65  igher precedence
0580: 20 74 68 61 6e 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20   than OR..**.** 
0590: 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  If compiled with
05a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
05b0: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ined, then this 
05c0: 6d 6f 64 75 6c 65 20 65 78 70 6f 72 74 73 20 74  module exports t
05d0: 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 22 69 6e  he.** symbol "in
05e0: 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  t sqlite3_fts3_e
05f0: 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
0600: 73 22 2e 20 53 65 74 74 69 6e 67 20 74 68 69 73  s". Setting this
0610: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f 20   variable.** to 
0620: 7a 65 72 6f 20 63 61 75 73 65 73 20 74 68 65 20  zero causes the 
0630: 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 74 68  module to use th
0640: 65 20 6f 6c 64 20 73 79 6e 74 61 78 2e 20 49 66  e old syntax. If
0650: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 0a 2a   it is set to .*
0660: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 20 6e  * non-zero the n
0670: 65 77 20 73 79 6e 74 61 78 20 69 73 20 61 63 74  ew syntax is act
0680: 69 76 61 74 65 64 2e 20 54 68 69 73 20 69 73 20  ivated. This is 
0690: 73 6f 20 62 6f 74 68 20 73 79 6e 74 61 78 65 73  so both syntaxes
06a0: 20 63 61 6e 0a 2a 2a 20 62 65 20 74 65 73 74 65   can.** be teste
06b0: 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
06c0: 20 62 75 69 6c 64 20 6f 66 20 74 65 73 74 66 69   build of testfi
06d0: 78 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  xture..**.** The
06e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
06f0: 69 62 65 73 20 74 68 65 20 73 79 6e 74 61 78 20  ibes the syntax 
0700: 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65  supported by the
0710: 20 66 74 73 33 20 4d 41 54 43 48 0a 2a 2a 20 6f   fts3 MATCH.** o
0720: 70 65 72 61 74 6f 72 20 69 6e 20 61 20 73 69 6d  perator in a sim
0730: 69 6c 61 72 20 66 6f 72 6d 61 74 20 74 6f 20 74  ilar format to t
0740: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
0750: 6c 65 6d 6f 6e 20 70 61 72 73 65 72 0a 2a 2a 20  lemon parser.** 
0760: 67 65 6e 65 72 61 74 6f 72 2e 20 54 68 69 73 20  generator. This 
0770: 6d 6f 64 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20  module does not 
0780: 75 73 65 20 61 63 74 75 61 6c 6c 79 20 6c 65 6d  use actually lem
0790: 6f 6e 2c 20 69 74 20 75 73 65 73 20 61 0a 2a 2a  on, it uses a.**
07a0: 20 63 75 73 74 6f 6d 20 70 61 72 73 65 72 2e 0a   custom parser..
07b0: 2a 2a 0a 2a 2a 20 20 20 71 75 65 72 79 20 3a 3a  **.**   query ::
07c0: 3d 20 61 6e 64 65 78 70 72 20 28 4f 52 20 61 6e  = andexpr (OR an
07d0: 64 65 78 70 72 29 2a 2e 0a 2a 2a 0a 2a 2a 20 20  dexpr)*..**.**  
07e0: 20 61 6e 64 65 78 70 72 20 3a 3a 3d 20 6e 6f 74   andexpr ::= not
07f0: 65 78 70 72 20 28 41 4e 44 3f 20 6e 6f 74 65 78  expr (AND? notex
0800: 70 72 29 2a 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 6f  pr)*..**.**   no
0810: 74 65 78 70 72 20 3a 3a 3d 20 6e 65 61 72 65 78  texpr ::= nearex
0820: 70 72 20 28 4e 4f 54 20 6e 65 61 72 65 78 70 72  pr (NOT nearexpr
0830: 7c 2d 54 4f 4b 45 4e 29 2a 2e 0a 2a 2a 20 20 20  |-TOKEN)*..**   
0840: 6e 6f 74 65 78 70 72 20 3a 3a 3d 20 4c 50 20 71  notexpr ::= LP q
0850: 75 65 72 79 20 52 50 2e 0a 2a 2a 0a 2a 2a 20 20  uery RP..**.**  
0860: 20 6e 65 61 72 65 78 70 72 20 3a 3a 3d 20 70 68   nearexpr ::= ph
0870: 72 61 73 65 20 28 4e 45 41 52 20 64 69 73 74 61  rase (NEAR dista
0880: 6e 63 65 5f 6f 70 74 20 6e 65 61 72 65 78 70 72  nce_opt nearexpr
0890: 29 2a 2e 0a 2a 2a 0a 2a 2a 20 20 20 64 69 73 74  )*..**.**   dist
08a0: 61 6e 63 65 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 2a  ance_opt ::= ..*
08b0: 2a 20 20 20 64 69 73 74 61 6e 63 65 5f 6f 70 74  *   distance_opt
08c0: 20 3a 3a 3d 20 2f 20 49 4e 54 45 47 45 52 2e 0a   ::= / INTEGER..
08d0: 2a 2a 0a 2a 2a 20 20 20 70 68 72 61 73 65 20 3a  **.**   phrase :
08e0: 3a 3d 20 54 4f 4b 45 4e 2e 0a 2a 2a 20 20 20 70  := TOKEN..**   p
08f0: 68 72 61 73 65 20 3a 3a 3d 20 43 4f 4c 55 4d 4e  hrase ::= COLUMN
0900: 3a 54 4f 4b 45 4e 2e 0a 2a 2a 20 20 20 70 68 72  :TOKEN..**   phr
0910: 61 73 65 20 3a 3a 3d 20 22 54 4f 4b 45 4e 20 54  ase ::= "TOKEN T
0920: 4f 4b 45 4e 20 54 4f 4b 45 4e 2e 2e 2e 22 2e 0a  OKEN TOKEN..."..
0930: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
0950: 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  e3_fts3_enable_p
0960: 61 72 65 6e 74 68 65 73 65 73 20 3d 20 30 3b 0a  arentheses = 0;.
0970: 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 53 51  #else.# ifdef SQ
0980: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
0990: 5f 50 41 52 45 4e 54 48 45 53 49 53 20 0a 23 20  _PARENTHESIS .# 
09a0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
09b0: 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
09c0: 6e 74 68 65 73 65 73 20 31 0a 23 20 65 6c 73 65  ntheses 1.# else
09d0: 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c 69 74  .#  define sqlit
09e0: 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  e3_fts3_enable_p
09f0: 61 72 65 6e 74 68 65 73 65 73 20 30 0a 23 20 65  arentheses 0.# e
0a00: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a10: 2a 2a 20 44 65 66 61 75 6c 74 20 73 70 61 6e 20  ** Default span 
0a20: 66 6f 72 20 4e 45 41 52 20 6f 70 65 72 61 74 6f  for NEAR operato
0a30: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  rs..*/.#define S
0a40: 51 4c 49 54 45 5f 46 54 53 33 5f 44 45 46 41 55  QLITE_FTS3_DEFAU
0a50: 4c 54 5f 4e 45 41 52 5f 50 41 52 41 4d 20 31 30  LT_NEAR_PARAM 10
0a60: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33  ..#include "fts3
0a70: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0a80: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0a90: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0aa0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0ab0: 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  >..typedef struc
0ac0: 74 20 50 61 72 73 65 43 6f 6e 74 65 78 74 20 50  t ParseContext P
0ad0: 61 72 73 65 43 6f 6e 74 65 78 74 3b 0a 73 74 72  arseContext;.str
0ae0: 75 63 74 20 50 61 72 73 65 43 6f 6e 74 65 78 74  uct ParseContext
0af0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b   {.  sqlite3_tok
0b00: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
0b10: 65 72 3b 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  er;      /* Toke
0b20: 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a 2f 0a  nizer module */.
0b30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
0b40: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
0b50: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
0b60: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  f column names f
0b70: 6f 72 20 66 74 73 33 20 74 61 62 6c 65 20 2a 2f  or fts3 table */
0b80: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0bb0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
0bc0: 7a 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  zCol[] */.  int 
0bd0: 69 44 65 66 61 75 6c 74 43 6f 6c 3b 20 20 20 20  iDefaultCol;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 2f 2a 20 44 65 66 61 75 6c 74 20 63 6f 6c 75 6d  /* Default colum
0c00: 6e 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  n to query */.  
0c10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0c20: 2a 70 43 74 78 3b 20 20 20 20 20 20 20 20 20 20  *pCtx;          
0c30: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72      /* Write err
0c40: 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65 20  or message here 
0c50: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 73 74 3b 20  */.  int nNest; 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0c80: 65 72 20 6f 66 20 6e 65 73 74 65 64 20 62 72 61  er of nested bra
0c90: 63 6b 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ckets */.};../*.
0ca0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
0cb0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
0cc0: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  o the standard i
0cd0: 73 73 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f  sspace() functio
0ce0: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  n. .**.** The st
0cf0: 61 6e 64 61 72 64 20 69 73 73 70 61 63 65 28 29  andard isspace()
0d00: 20 63 61 6e 20 62 65 20 61 77 6b 77 61 72 64 20   can be awkward 
0d10: 74 6f 20 75 73 65 20 73 61 66 65 6c 79 2c 20 62  to use safely, b
0d20: 65 63 61 75 73 65 20 61 6c 74 68 6f 75 67 68 20  ecause although 
0d30: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
0d40: 20 74 6f 20 61 63 63 65 70 74 20 61 6e 20 61 72   to accept an ar
0d50: 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69  gument of type i
0d60: 6e 74 2c 20 69 74 73 20 62 65 68 61 76 69 6f 75  nt, its behaviou
0d70: 72 20 77 68 65 6e 20 70 61 73 73 65 64 0a 2a 2a  r when passed.**
0d80: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
0d90: 20 66 61 6c 6c 73 20 6f 75 74 73 69 64 65 20 6f   falls outside o
0da0: 66 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74  f the range of t
0db0: 68 65 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  he unsigned char
0dc0: 20 74 79 70 65 0a 2a 2a 20 69 73 20 75 6e 64 65   type.** is unde
0dd0: 66 69 6e 65 64 20 28 61 6e 64 20 73 6f 6d 65 74  fined (and somet
0de0: 69 6d 65 73 2c 20 22 75 6e 64 65 66 69 6e 65 64  imes, "undefined
0df0: 22 20 6d 65 61 6e 73 20 73 65 67 66 61 75 6c 74  " means segfault
0e00: 29 2e 20 54 68 69 73 20 77 72 61 70 70 65 72 0a  ). This wrapper.
0e10: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ** is defined to
0e20: 20 61 63 63 65 70 74 20 61 6e 20 61 72 67 75 6d   accept an argum
0e30: 65 6e 74 20 6f 66 20 74 79 70 65 20 63 68 61 72  ent of type char
0e40: 2c 20 61 6e 64 20 61 6c 77 61 79 73 20 72 65 74  , and always ret
0e50: 75 72 6e 73 20 30 20 66 6f 72 0a 2a 2a 20 61 6e  urns 0 for.** an
0e60: 79 20 76 61 6c 75 65 73 20 74 68 61 74 20 66 61  y values that fa
0e70: 6c 6c 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68  ll outside of th
0e80: 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 75  e range of the u
0e90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 79 70  nsigned char typ
0ea0: 65 20 28 69 2e 65 2e 0a 2a 2a 20 6e 65 67 61 74  e (i.e..** negat
0eb0: 69 76 65 20 76 61 6c 75 65 73 29 2e 0a 2a 2f 0a  ive values)..*/.
0ec0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 69  static int fts3i
0ed0: 73 73 70 61 63 65 28 63 68 61 72 20 63 29 7b 0a  sspace(char c){.
0ee0: 20 20 72 65 74 75 72 6e 20 28 63 26 30 78 38 30    return (c&0x80
0ef0: 29 3d 3d 30 20 3f 20 69 73 73 70 61 63 65 28 63  )==0 ? isspace(c
0f00: 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
0f10: 45 78 74 72 61 63 74 20 74 68 65 20 6e 65 78 74  Extract the next
0f20: 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 62 75 66 66   token from buff
0f30: 65 72 20 7a 20 28 6c 65 6e 67 74 68 20 6e 29 20  er z (length n) 
0f40: 75 73 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69  using the tokeni
0f50: 7a 65 72 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  zer.** and other
0f60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 63 6f   information (co
0f70: 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 74 63 2e 29  lumn names etc.)
0f80: 20 69 6e 20 70 50 61 72 73 65 2e 20 43 72 65 61   in pParse. Crea
0f90: 74 65 20 61 6e 20 46 74 73 33 45 78 70 72 0a 2a  te an Fts3Expr.*
0fa0: 2a 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74  * structure of t
0fb0: 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48 52  ype FTSQUERY_PHR
0fc0: 41 53 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ASE containing a
0fd0: 20 70 68 72 61 73 65 20 63 6f 6e 73 69 73 74 69   phrase consisti
0fe0: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 73 69  ng of this.** si
0ff0: 6e 67 6c 65 20 74 6f 6b 65 6e 20 61 6e 64 20 73  ngle token and s
1000: 65 74 20 2a 70 70 45 78 70 72 20 74 6f 20 70 6f  et *ppExpr to po
1010: 69 6e 74 20 74 6f 20 69 74 2e 20 49 66 20 74 68  int to it. If th
1020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
1030: 66 65 72 20 69 73 0a 2a 2a 20 72 65 61 63 68 65  fer is.** reache
1040: 64 20 62 65 66 6f 72 65 20 61 20 74 6f 6b 65 6e  d before a token
1050: 20 69 73 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a   is found, set *
1060: 70 70 45 78 70 72 20 74 6f 20 7a 65 72 6f 2e 20  ppExpr to zero. 
1070: 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  It is the.** res
1080: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1090: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
10a0: 6e 74 75 61 6c 6c 79 20 64 65 61 6c 6c 6f 63 61  ntually dealloca
10b0: 74 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  te the allocated
10c0: 20 0a 2a 2a 20 46 74 73 33 45 78 70 72 20 73 74   .** Fts3Expr st
10d0: 72 75 63 74 75 72 65 20 28 69 66 20 61 6e 79 29  ructure (if any)
10e0: 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
10f0: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
1100: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1110: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1120: 65 73 73 66 75 6c 2c 20 6f 72 20 53 51 4c 49 54  essful, or SQLIT
1130: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d  E_NOMEM if a mem
1140: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
1150: 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
1160: 69 63 20 69 6e 74 20 67 65 74 4e 65 78 74 54 6f  ic int getNextTo
1170: 6b 65 6e 28 0a 20 20 50 61 72 73 65 43 6f 6e 74  ken(.  ParseCont
1180: 65 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20  ext *pParse,    
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a0: 2a 20 66 74 73 33 20 71 75 65 72 79 20 70 61 72  * fts3 query par
11b0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
11c0: 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
11f0: 20 66 6f 72 20 46 74 73 33 50 68 72 61 73 65 2e   for Fts3Phrase.
1200: 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e  iColumn */.  con
1210: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1220: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1230: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74       /* Input st
1240: 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33 45 78  ring */.  Fts3Ex
1250: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70 72 65 73    /* OUT: expres
1280: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  sion */.  int *p
1290: 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20 20 20 20  nConsumed       
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
12c0: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
12d0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
12e0: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  e3_tokenizer *pT
12f0: 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 50 61 72 73  okenizer = pPars
1300: 65 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20  e->pTokenizer;. 
1310: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
1320: 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20  er_module const 
1330: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65  *pModule = pToke
1340: 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  nizer->pModule;.
1350: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1360: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75  te3_tokenizer_cu
1370: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b 0a 20  rsor *pCursor;. 
1380: 20 46 74 73 33 45 78 70 72 20 2a 70 52 65 74 20   Fts3Expr *pRet 
1390: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  = 0;.  int nCons
13a0: 75 6d 65 64 20 3d 20 30 3b 0a 0a 20 20 72 63 20  umed = 0;..  rc 
13b0: 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e  = pModule->xOpen
13c0: 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 7a 2c 20  (pTokenizer, z, 
13d0: 6e 2c 20 26 70 43 75 72 73 6f 72 29 3b 0a 20 20  n, &pCursor);.  
13e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13f0: 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
1400: 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 20  har *zToken;.   
1410: 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69 53 74   int nToken, iSt
1420: 61 72 74 2c 20 69 45 6e 64 2c 20 69 50 6f 73 69  art, iEnd, iPosi
1430: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 42  tion;.    int nB
1440: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 2f 2a 20 74 6f 74 61 6c 20 73 70 61 63     /* total spac
1470: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
1480: 0a 0a 20 20 20 20 70 43 75 72 73 6f 72 2d 3e 70  ..    pCursor->p
1490: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b  Tokenizer = pTok
14a0: 65 6e 69 7a 65 72 3b 0a 20 20 20 20 72 63 20 3d  enizer;.    rc =
14b0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28   pModule->xNext(
14c0: 70 43 75 72 73 6f 72 2c 20 26 7a 54 6f 6b 65 6e  pCursor, &zToken
14d0: 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61  , &nToken, &iSta
14e0: 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f 73  rt, &iEnd, &iPos
14f0: 69 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 69 66 28  ition);..    if(
1500: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1510: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  {.      nByte = 
1520: 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29  sizeof(Fts3Expr)
1530: 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 50 68   + sizeof(Fts3Ph
1540: 72 61 73 65 29 20 2b 20 6e 54 6f 6b 65 6e 3b 0a  rase) + nToken;.
1550: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
1560: 73 33 45 78 70 72 20 2a 29 73 71 6c 69 74 65 33  s3Expr *)sqlite3
1570: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
1580: 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20        if( !pRet 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c0: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
15d0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
15e0: 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d     pRet->eType =
15f0: 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
1600: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
1610: 70 50 68 72 61 73 65 20 3d 20 28 46 74 73 33 50  pPhrase = (Fts3P
1620: 68 72 61 73 65 20 2a 29 26 70 52 65 74 5b 31 5d  hrase *)&pRet[1]
1630: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
1640: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 20  pPhrase->nToken 
1650: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65  = 1;.        pRe
1660: 74 2d 3e 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c  t->pPhrase->iCol
1670: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
1680: 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73      pRet->pPhras
1690: 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 6e 20 3d  e->aToken[0].n =
16a0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20   nToken;.       
16b0: 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e   pRet->pPhrase->
16c0: 61 54 6f 6b 65 6e 5b 30 5d 2e 7a 20 3d 20 28 63  aToken[0].z = (c
16d0: 68 61 72 20 2a 29 26 70 52 65 74 2d 3e 70 50 68  har *)&pRet->pPh
16e0: 72 61 73 65 5b 31 5d 3b 0a 20 20 20 20 20 20 20  rase[1];.       
16f0: 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e 70 50   memcpy(pRet->pP
1700: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  hrase->aToken[0]
1710: 2e 7a 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  .z, zToken, nTok
1720: 65 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  en);..        if
1730: 28 20 69 45 6e 64 3c 6e 20 26 26 20 7a 5b 69 45  ( iEnd<n && z[iE
1740: 6e 64 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  nd]=='*' ){.    
1750: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72        pRet->pPhr
1760: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 69  ase->aToken[0].i
1770: 73 50 72 65 66 69 78 20 3d 20 31 3b 0a 20 20 20  sPrefix = 1;.   
1780: 20 20 20 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20         iEnd++;. 
1790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 66 74   if( !sqlite3_ft
17b0: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
17c0: 68 65 73 65 73 20 26 26 20 69 53 74 61 72 74 3e  heses && iStart>
17d0: 30 20 26 26 20 7a 5b 69 53 74 61 72 74 2d 31 5d  0 && z[iStart-1]
17e0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
17f0: 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65     pRet->pPhrase
1800: 2d 3e 69 73 4e 6f 74 20 3d 20 31 3b 0a 20 20 20  ->isNot = 1;.   
1810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1820: 20 20 20 20 20 6e 43 6f 6e 73 75 6d 65 64 20 3d       nConsumed =
1830: 20 69 45 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20   iEnd;.    }..  
1840: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
1850: 65 28 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  e(pCursor);.  }.
1860: 20 20 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64    .  *pnConsumed
1870: 20 3d 20 6e 43 6f 6e 73 75 6d 65 64 3b 0a 20 20   = nConsumed;.  
1880: 2a 70 70 45 78 70 72 20 3d 20 70 52 65 74 3b 0a  *ppExpr = pRet;.
1890: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18a0: 0a 2f 2a 0a 2a 2a 20 45 6e 6c 61 72 67 65 20 61  ./*.** Enlarge a
18b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18c0: 6f 6e 2e 20 20 49 66 20 61 6e 20 6f 75 74 2d 6f  on.  If an out-o
18d0: 66 2d 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f-memory allocat
18e0: 69 6f 6e 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 74  ion occurs,.** t
18f0: 68 65 6e 20 66 72 65 65 20 74 68 65 20 6f 6c 64  hen free the old
1900: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   allocation..*/.
1910: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
1920: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76  3ReallocOrFree(v
1930: 6f 69 64 20 2a 70 4f 72 69 67 2c 20 69 6e 74 20  oid *pOrig, int 
1940: 6e 4e 65 77 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nNew){.  void *p
1950: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Ret = sqlite3_re
1960: 61 6c 6c 6f 63 28 70 4f 72 69 67 2c 20 6e 4e 65  alloc(pOrig, nNe
1970: 77 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20  w);.  if( !pRet 
1980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1990: 72 65 65 28 70 4f 72 69 67 29 3b 0a 20 20 7d 0a  ree(pOrig);.  }.
19a0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
19b0: 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 7a  ../*.** Buffer z
19c0: 49 6e 70 75 74 2c 20 6c 65 6e 67 74 68 20 6e 49  Input, length nI
19d0: 6e 70 75 74 2c 20 63 6f 6e 74 61 69 6e 73 20 74  nput, contains t
19e0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
19f0: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 0a 2a   quoted string.*
1a00: 2a 20 74 68 61 74 20 61 70 70 65 61 72 65 64 20  * that appeared 
1a10: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 66 74  as part of an ft
1a20: 73 33 20 71 75 65 72 79 20 65 78 70 72 65 73 73  s3 query express
1a30: 69 6f 6e 2e 20 4e 65 69 74 68 65 72 20 71 75 6f  ion. Neither quo
1a40: 74 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  te character.** 
1a50: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
1a60: 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
1a70: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1a80: 73 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 74 68  s to tokenize th
1a90: 65 20 65 6e 74 69 72 65 0a 2a 2a 20 69 6e 70 75  e entire.** inpu
1aa0: 74 20 62 75 66 66 65 72 20 61 6e 64 20 63 72 65  t buffer and cre
1ab0: 61 74 65 20 61 6e 20 46 74 73 33 45 78 70 72 20  ate an Fts3Expr 
1ac0: 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 79 70  structure of typ
1ad0: 65 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  e FTSQUERY_PHRAS
1ae0: 45 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  E .** containing
1af0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a   the results..**
1b00: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1b10: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1b20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1b30: 45 78 70 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  Expr set to poin
1b40: 74 20 61 74 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  t at the.** allo
1b50: 63 61 74 65 64 20 46 74 73 33 45 78 70 72 20 73  cated Fts3Expr s
1b60: 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
1b70: 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49  ise, either SQLI
1b80: 54 45 5f 4e 4f 4d 45 4d 20 28 6f 75 74 20 6f 66  TE_NOMEM (out of
1b90: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 65 72 72 6f 72   memory.** error
1ba0: 29 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52 4f  ) or SQLITE_ERRO
1bb0: 52 20 28 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  R (tokenization 
1bc0: 65 72 72 6f 72 29 20 69 73 20 72 65 74 75 72 6e  error) is return
1bd0: 65 64 20 61 6e 64 20 2a 70 70 45 78 70 72 20 73  ed and *ppExpr s
1be0: 65 74 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73  et.** to 0..*/.s
1bf0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4e 65 78  tatic int getNex
1c00: 74 53 74 72 69 6e 67 28 0a 20 20 50 61 72 73 65  tString(.  Parse
1c10: 43 6f 6e 74 65 78 74 20 2a 70 50 61 72 73 65 2c  Context *pParse,
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 2f 2a 20 66 74 73 33 20 71 75 65 72 79     /* fts3 query
1c40: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   parse context *
1c50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1c60: 7a 49 6e 70 75 74 2c 20 69 6e 74 20 6e 49 6e 70  zInput, int nInp
1c70: 75 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ut,         /* I
1c80: 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
1c90: 20 46 74 73 33 45 78 70 72 20 2a 2a 70 70 45 78   Fts3Expr **ppEx
1ca0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pr              
1cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1cc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
1cd0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  {.  sqlite3_toke
1ce0: 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65  nizer *pTokenize
1cf0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 6f 6b  r = pParse->pTok
1d00: 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65  enizer;.  sqlite
1d10: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
1d20: 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c  le const *pModul
1d30: 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e  e = pTokenizer->
1d40: 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72  pModule;.  int r
1d50: 63 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  c;.  Fts3Expr *p
1d60: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1d70: 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
1d80: 20 2a 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20   *pCursor = 0;. 
1d90: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 30   char *zTemp = 0
1da0: 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 3d 20  ;.  int nTemp = 
1db0: 30 3b 0a 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  0;..  rc = pModu
1dc0: 6c 65 2d 3e 78 4f 70 65 6e 28 70 54 6f 6b 65 6e  le->xOpen(pToken
1dd0: 69 7a 65 72 2c 20 7a 49 6e 70 75 74 2c 20 6e 49  izer, zInput, nI
1de0: 6e 70 75 74 2c 20 26 70 43 75 72 73 6f 72 29 3b  nput, &pCursor);
1df0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
1e10: 69 69 3b 0a 20 20 20 20 70 43 75 72 73 6f 72 2d  ii;.    pCursor-
1e20: 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54  >pTokenizer = pT
1e30: 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 66 6f  okenizer;.    fo
1e40: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
1e50: 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
1e60: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e70: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 6e  zToken;.      in
1e80: 74 20 6e 54 6f 6b 65 6e 2c 20 69 42 65 67 69 6e  t nToken, iBegin
1e90: 2c 20 69 45 6e 64 2c 20 69 50 6f 73 3b 0a 20 20  , iEnd, iPos;.  
1ea0: 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
1eb0: 2d 3e 78 4e 65 78 74 28 70 43 75 72 73 6f 72 2c  ->xNext(pCursor,
1ec0: 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65   &zToken, &nToke
1ed0: 6e 2c 20 26 69 42 65 67 69 6e 2c 20 26 69 45 6e  n, &iBegin, &iEn
1ee0: 64 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20  d, &iPos);.     
1ef0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1f10: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1f20: 28 46 74 73 33 45 78 70 72 29 20 2b 20 73 69 7a  (Fts3Expr) + siz
1f30: 65 6f 66 28 46 74 73 33 50 68 72 61 73 65 29 3b  eof(Fts3Phrase);
1f40: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 74 73  .        p = fts
1f50: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  3ReallocOrFree(p
1f60: 2c 20 6e 42 79 74 65 2b 69 69 2a 73 69 7a 65 6f  , nByte+ii*sizeo
1f70: 66 28 73 74 72 75 63 74 20 50 68 72 61 73 65 54  f(struct PhraseT
1f80: 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  oken));.        
1f90: 7a 54 65 6d 70 20 3d 20 66 74 73 33 52 65 61 6c  zTemp = fts3Real
1fa0: 6c 6f 63 4f 72 46 72 65 65 28 7a 54 65 6d 70 2c  locOrFree(zTemp,
1fb0: 20 6e 54 65 6d 70 20 2b 20 6e 54 6f 6b 65 6e 29   nTemp + nToken)
1fc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1fd0: 20 7c 7c 20 21 7a 54 65 6d 70 20 29 7b 0a 20 20   || !zTemp ){.  
1fe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f          goto no_
1ff0: 6d 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mem;.        }. 
2000: 20 20 20 20 20 20 20 69 66 28 20 69 69 3d 3d 30         if( ii==0
2010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
2020: 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65  mset(p, 0, nByte
2030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
2040: 70 50 68 72 61 73 65 20 3d 20 28 46 74 73 33 50  pPhrase = (Fts3P
2050: 68 72 61 73 65 20 2a 29 26 70 5b 31 5d 3b 0a 20  hrase *)&p[1];. 
2060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2070: 20 70 2d 3e 70 50 68 72 61 73 65 20 3d 20 28 46   p->pPhrase = (F
2080: 74 73 33 50 68 72 61 73 65 20 2a 29 26 70 5b 31  ts3Phrase *)&p[1
2090: 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  ];.        p->pP
20a0: 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 20 3d 20  hrase->nToken = 
20b0: 69 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 2d  ii+1;.        p-
20c0: 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  >pPhrase->aToken
20d0: 5b 69 69 5d 2e 6e 20 3d 20 6e 54 6f 6b 65 6e 3b  [ii].n = nToken;
20e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
20f0: 26 7a 54 65 6d 70 5b 6e 54 65 6d 70 5d 2c 20 7a  &zTemp[nTemp], z
2100: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
2110: 20 20 20 20 20 20 20 20 6e 54 65 6d 70 20 2b 3d          nTemp +=
2120: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20   nToken;.       
2130: 20 69 66 28 20 69 45 6e 64 3c 6e 49 6e 70 75 74   if( iEnd<nInput
2140: 20 26 26 20 7a 49 6e 70 75 74 5b 69 45 6e 64 5d   && zInput[iEnd]
2150: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  =='*' ){.       
2160: 20 20 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e 61     p->pPhrase->a
2170: 54 6f 6b 65 6e 5b 69 69 5d 2e 69 73 50 72 65 66  Token[ii].isPref
2180: 69 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ix = 1;.        
2190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21a0: 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f   p->pPhrase->aTo
21b0: 6b 65 6e 5b 69 69 5d 2e 69 73 50 72 65 66 69 78  ken[ii].isPrefix
21c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
21d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21e0: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
21f0: 73 65 28 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  se(pCursor);.   
2200: 20 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20   pCursor = 0;.  
2210: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
2220: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2230: 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 63 68 61 72  int jj;.    char
2240: 20 2a 7a 4e 65 77 20 3d 20 4e 55 4c 4c 3b 0a 20   *zNew = NULL;. 
2250: 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b     int nNew = 0;
2260: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
2270: 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70 72   sizeof(Fts3Expr
2280: 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 50  ) + sizeof(Fts3P
2290: 68 72 61 73 65 29 3b 0a 20 20 20 20 6e 42 79 74  hrase);.    nByt
22a0: 65 20 2b 3d 20 28 70 3f 28 70 2d 3e 70 50 68 72  e += (p?(p->pPhr
22b0: 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2d 31 29 3a 30  ase->nToken-1):0
22c0: 29 20 2a 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ) * sizeof(struc
22d0: 74 20 50 68 72 61 73 65 54 6f 6b 65 6e 29 3b 0a  t PhraseToken);.
22e0: 20 20 20 20 70 20 3d 20 66 74 73 33 52 65 61 6c      p = fts3Real
22f0: 6c 6f 63 4f 72 46 72 65 65 28 70 2c 20 6e 42 79  locOrFree(p, nBy
2300: 74 65 20 2b 20 6e 54 65 6d 70 29 3b 0a 20 20 20  te + nTemp);.   
2310: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
2320: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
2330: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 6d    }.    if( zTem
2340: 70 20 29 7b 0a 20 20 20 20 20 20 7a 4e 65 77 20  p ){.      zNew 
2350: 3d 20 26 28 28 28 63 68 61 72 20 2a 29 70 29 5b  = &(((char *)p)[
2360: 6e 42 79 74 65 5d 29 3b 0a 20 20 20 20 20 20 6d  nByte]);.      m
2370: 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 54 65 6d  emcpy(zNew, zTem
2380: 70 2c 20 6e 54 65 6d 70 29 3b 0a 20 20 20 20 7d  p, nTemp);.    }
2390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
23a0: 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 2b 6e  et(p, 0, nByte+n
23b0: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Temp);.    }.   
23c0: 20 70 2d 3e 70 50 68 72 61 73 65 20 3d 20 28 46   p->pPhrase = (F
23d0: 74 73 33 50 68 72 61 73 65 20 2a 29 26 70 5b 31  ts3Phrase *)&p[1
23e0: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  ];.    for(jj=0;
23f0: 20 6a 6a 3c 70 2d 3e 70 50 68 72 61 73 65 2d 3e   jj<p->pPhrase->
2400: 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20  nToken; jj++){. 
2410: 20 20 20 20 20 70 2d 3e 70 50 68 72 61 73 65 2d       p->pPhrase-
2420: 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 7a 20 3d 20  >aToken[jj].z = 
2430: 26 7a 4e 65 77 5b 6e 4e 65 77 5d 3b 0a 20 20 20  &zNew[nNew];.   
2440: 20 20 20 6e 4e 65 77 20 2b 3d 20 70 2d 3e 70 50     nNew += p->pP
2450: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a  hrase->aToken[jj
2460: 5d 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ].n;.    }.    s
2470: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2480: 70 29 3b 0a 20 20 20 20 70 2d 3e 65 54 79 70 65  p);.    p->eType
2490: 20 3d 20 46 54 53 51 55 45 52 59 5f 50 48 52 41   = FTSQUERY_PHRA
24a0: 53 45 3b 0a 20 20 20 20 70 2d 3e 70 50 68 72 61  SE;.    p->pPhra
24b0: 73 65 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50  se->iColumn = pP
24c0: 61 72 73 65 2d 3e 69 44 65 66 61 75 6c 74 43 6f  arse->iDefaultCo
24d0: 6c 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  l;.    rc = SQLI
24e0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2a 70  TE_OK;.  }..  *p
24f0: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  pExpr = p;.  ret
2500: 75 72 6e 20 72 63 3b 0a 6e 6f 5f 6d 65 6d 3a 0a  urn rc;.no_mem:.
2510: 0a 20 20 69 66 28 20 70 43 75 72 73 6f 72 20 29  .  if( pCursor )
2520: 7b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  {.    pModule->x
2530: 43 6c 6f 73 65 28 70 43 75 72 73 6f 72 29 3b 0a  Close(pCursor);.
2540: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2550: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 73 71 6c  ee(zTemp);.  sql
2560: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
2570: 2a 70 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 72  *ppExpr = 0;.  r
2580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2590: 45 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  EM;.}../*.** Fun
25a0: 63 74 69 6f 6e 20 67 65 74 4e 65 78 74 4e 6f 64  ction getNextNod
25b0: 65 28 29 2c 20 77 68 69 63 68 20 69 73 20 63 61  e(), which is ca
25c0: 6c 6c 65 64 20 62 79 20 66 74 73 33 45 78 70 72  lled by fts3Expr
25d0: 50 61 72 73 65 28 29 2c 20 6d 61 79 20 69 74 73  Parse(), may its
25e0: 65 6c 66 0a 2a 2a 20 63 61 6c 6c 20 66 74 73 33  elf.** call fts3
25f0: 45 78 70 72 50 61 72 73 65 28 29 2e 20 53 6f 20  ExprParse(). So 
2600: 74 68 69 73 20 66 6f 72 77 61 72 64 20 64 65 63  this forward dec
2610: 6c 61 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75  laration is requ
2620: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
2630: 69 6e 74 20 66 74 73 33 45 78 70 72 50 61 72 73  int fts3ExprPars
2640: 65 28 50 61 72 73 65 43 6f 6e 74 65 78 74 20 2a  e(ParseContext *
2650: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  , const char *, 
2660: 69 6e 74 2c 20 46 74 73 33 45 78 70 72 20 2a 2a  int, Fts3Expr **
2670: 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  , int *);../*.**
2680: 20 54 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   The output vari
2690: 61 62 6c 65 20 2a 70 70 45 78 70 72 20 69 73 20  able *ppExpr is 
26a0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
26b0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33  n allocated Fts3
26c0: 45 78 70 72 20 0a 2a 2a 20 73 74 72 75 63 74 75  Expr .** structu
26d0: 72 65 2c 20 6f 72 20 73 65 74 20 74 6f 20 30 20  re, or set to 0 
26e0: 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  if the end of th
26f0: 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69  e input buffer i
2700: 73 20 72 65 61 63 68 65 64 2e 0a 2a 2a 0a 2a 2a  s reached..**.**
2710: 20 52 65 74 75 72 6e 73 20 61 6e 20 53 51 4c 69   Returns an SQLi
2720: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 53  te error code. S
2730: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2740: 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 53 51  ything works, SQ
2750: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 66  LITE_NOMEM.** if
2760: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
2770: 65 20 6f 63 63 75 72 73 2c 20 6f 72 20 53 51 4c  e occurs, or SQL
2780: 49 54 45 5f 45 52 52 4f 52 20 69 66 20 61 20 70  ITE_ERROR if a p
2790: 61 72 73 65 20 65 72 72 6f 72 20 69 73 20 65 6e  arse error is en
27a0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 49 66  countered..** If
27b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73   SQLITE_ERROR is
27c0: 20 72 65 74 75 72 6e 65 64 2c 20 70 43 6f 6e 74   returned, pCont
27d0: 65 78 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ext is populated
27e0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
27f0: 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
2800: 63 20 69 6e 74 20 67 65 74 4e 65 78 74 4e 6f 64  c int getNextNod
2810: 65 28 0a 20 20 50 61 72 73 65 43 6f 6e 74 65 78  e(.  ParseContex
2820: 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  t *pParse,      
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2840: 66 74 73 33 20 71 75 65 72 79 20 70 61 72 73 65  fts3 query parse
2850: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
2860: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2870: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
2880: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73        /* Input s
2890: 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33 45  tring */.  Fts3E
28a0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70 72 65     /* OUT: expre
28d0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ssion */.  int *
28e0: 70 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20 20 20  pnConsumed      
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
2910: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
2920: 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  med */.){.  stat
2930: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2940: 46 74 73 33 4b 65 79 77 6f 72 64 20 7b 0a 20 20  Fts3Keyword {.  
2950: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f          /* Keywo
2980: 72 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 75  rd text */.    u
2990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 3b 20  nsigned char n; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
29c0: 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 2a 2f  f the keyword */
29d0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
29e0: 61 72 20 70 61 72 65 6e 4f 6e 6c 79 3b 20 20 20  ar parenOnly;   
29f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2a00: 6c 79 20 76 61 6c 69 64 20 69 6e 20 70 61 72 65  ly valid in pare
2a10: 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 75 6e  n mode */.    un
2a20: 73 69 67 6e 65 64 20 63 68 61 72 20 65 54 79 70  signed char eTyp
2a30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a40: 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 63      /* Keyword c
2a50: 6f 64 65 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ode */.  } aKeyw
2a60: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ord[] = {.    { 
2a70: 22 4f 52 22 20 2c 20 20 32 2c 20 30 2c 20 46 54  "OR" ,  2, 0, FT
2a80: 53 51 55 45 52 59 5f 4f 52 20 20 20 7d 2c 0a 20  SQUERY_OR   },. 
2a90: 20 20 20 7b 20 22 41 4e 44 22 2c 20 20 33 2c 20     { "AND",  3, 
2aa0: 31 2c 20 46 54 53 51 55 45 52 59 5f 41 4e 44 20  1, FTSQUERY_AND 
2ab0: 20 7d 2c 0a 20 20 20 20 7b 20 22 4e 4f 54 22 2c   },.    { "NOT",
2ac0: 20 20 33 2c 20 31 2c 20 46 54 53 51 55 45 52 59    3, 1, FTSQUERY
2ad0: 5f 4e 4f 54 20 20 7d 2c 0a 20 20 20 20 7b 20 22  _NOT  },.    { "
2ae0: 4e 45 41 52 22 2c 20 34 2c 20 30 2c 20 46 54 53  NEAR", 4, 0, FTS
2af0: 51 55 45 52 59 5f 4e 45 41 52 20 7d 0a 20 20 7d  QUERY_NEAR }.  }
2b00: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
2b10: 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 43  t iCol;.  int iC
2b20: 6f 6c 4c 65 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  olLen;.  int rc;
2b30: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 65  .  Fts3Expr *pRe
2b40: 74 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74 20  t = 0;..  const 
2b50: 63 68 61 72 20 2a 7a 49 6e 70 75 74 20 3d 20 7a  char *zInput = z
2b60: 3b 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d  ;.  int nInput =
2b70: 20 6e 3b 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f   n;..  /* Skip o
2b80: 76 65 72 20 61 6e 79 20 77 68 69 74 65 73 70 61  ver any whitespa
2b90: 63 65 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69  ce before checki
2ba0: 6e 67 20 66 6f 72 20 61 20 6b 65 79 77 6f 72 64  ng for a keyword
2bb0: 2c 20 61 6e 20 6f 70 65 6e 20 6f 72 0a 20 20 2a  , an open or.  *
2bc0: 2a 20 63 6c 6f 73 65 20 62 72 61 63 6b 65 74 2c  * close bracket,
2bd0: 20 6f 72 20 61 20 71 75 6f 74 65 64 20 73 74 72   or a quoted str
2be0: 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  ing. .  */.  whi
2bf0: 6c 65 28 20 6e 49 6e 70 75 74 3e 30 20 26 26 20  le( nInput>0 && 
2c00: 66 74 73 33 69 73 73 70 61 63 65 28 2a 7a 49 6e  fts3isspace(*zIn
2c10: 70 75 74 29 20 29 7b 0a 20 20 20 20 6e 49 6e 70  put) ){.    nInp
2c20: 75 74 2d 2d 3b 0a 20 20 20 20 7a 49 6e 70 75 74  ut--;.    zInput
2c30: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 49  ++;.  }.  if( nI
2c40: 6e 70 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  nput==0 ){.    r
2c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2c60: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  E;.  }..  /* See
2c70: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
2c80: 6e 67 20 77 69 74 68 20 61 20 6b 65 79 77 6f 72  ng with a keywor
2c90: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  d. */.  for(ii=0
2ca0: 3b 20 69 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  ; ii<(int)(sizeo
2cb0: 66 28 61 4b 65 79 77 6f 72 64 29 2f 73 69 7a 65  f(aKeyword)/size
2cc0: 6f 66 28 73 74 72 75 63 74 20 46 74 73 33 4b 65  of(struct Fts3Ke
2cd0: 79 77 6f 72 64 29 29 3b 20 69 69 2b 2b 29 7b 0a  yword)); ii++){.
2ce0: 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
2cf0: 20 46 74 73 33 4b 65 79 77 6f 72 64 20 2a 70 4b   Fts3Keyword *pK
2d00: 65 79 20 3d 20 26 61 4b 65 79 77 6f 72 64 5b 69  ey = &aKeyword[i
2d10: 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4b  i];..    if( (pK
2d20: 65 79 2d 3e 70 61 72 65 6e 4f 6e 6c 79 20 26 20  ey->parenOnly & 
2d30: 7e 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  ~sqlite3_fts3_en
2d40: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
2d50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2d60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2d70: 20 20 20 69 66 28 20 6e 49 6e 70 75 74 3e 3d 70     if( nInput>=p
2d80: 4b 65 79 2d 3e 6e 20 26 26 20 30 3d 3d 6d 65 6d  Key->n && 0==mem
2d90: 63 6d 70 28 7a 49 6e 70 75 74 2c 20 70 4b 65 79  cmp(zInput, pKey
2da0: 2d 3e 7a 2c 20 70 4b 65 79 2d 3e 6e 29 20 29 7b  ->z, pKey->n) ){
2db0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 61 72  .      int nNear
2dc0: 20 3d 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 44   = SQLITE_FTS3_D
2dd0: 45 46 41 55 4c 54 5f 4e 45 41 52 5f 50 41 52 41  EFAULT_NEAR_PARA
2de0: 4d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  M;.      int nKe
2df0: 79 20 3d 20 70 4b 65 79 2d 3e 6e 3b 0a 20 20 20  y = pKey->n;.   
2e00: 20 20 20 63 68 61 72 20 63 4e 65 78 74 3b 0a 0a     char cNext;..
2e10: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2e20: 20 69 73 20 61 20 22 4e 45 41 52 22 20 6b 65 79   is a "NEAR" key
2e30: 77 6f 72 64 2c 20 63 68 65 63 6b 20 66 6f 72 20  word, check for 
2e40: 61 6e 20 65 78 70 6c 69 63 69 74 20 6e 65 61 72  an explicit near
2e50: 6e 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ness. */.      i
2e60: 66 28 20 70 4b 65 79 2d 3e 65 54 79 70 65 3d 3d  f( pKey->eType==
2e70: 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b  FTSQUERY_NEAR ){
2e80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e90: 20 6e 4b 65 79 3d 3d 34 20 29 3b 0a 20 20 20 20   nKey==4 );.    
2ea0: 20 20 20 20 69 66 28 20 7a 49 6e 70 75 74 5b 34      if( zInput[4
2eb0: 5d 3d 3d 27 2f 27 20 26 26 20 7a 49 6e 70 75 74  ]=='/' && zInput
2ec0: 5b 35 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 70  [5]>='0' && zInp
2ed0: 75 74 5b 35 5d 3c 3d 27 39 27 20 29 7b 0a 20 20  ut[5]<='9' ){.  
2ee0: 20 20 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20          nNear = 
2ef0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
2f00: 28 6e 4b 65 79 3d 35 3b 20 7a 49 6e 70 75 74 5b  (nKey=5; zInput[
2f10: 6e 4b 65 79 5d 3e 3d 27 30 27 20 26 26 20 7a 49  nKey]>='0' && zI
2f20: 6e 70 75 74 5b 6e 4b 65 79 5d 3c 3d 27 39 27 3b  nput[nKey]<='9';
2f30: 20 6e 4b 65 79 2b 2b 29 7b 0a 20 20 20 20 20 20   nKey++){.      
2f40: 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 6e 4e        nNear = nN
2f50: 65 61 72 20 2a 20 31 30 20 2b 20 28 7a 49 6e 70  ear * 10 + (zInp
2f60: 75 74 5b 6e 4b 65 79 5d 20 2d 20 27 30 27 29 3b  ut[nKey] - '0');
2f70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
2f90: 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
2fa0: 20 70 6f 69 6e 74 20 74 68 69 73 20 69 73 20 70   point this is p
2fb0: 72 6f 62 61 62 6c 79 20 61 20 6b 65 79 77 6f 72  robably a keywor
2fc0: 64 2e 20 42 75 74 20 66 6f 72 20 74 68 61 74 20  d. But for that 
2fd0: 74 6f 20 62 65 20 74 72 75 65 2c 0a 20 20 20 20  to be true,.    
2fe0: 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 62 79    ** the next by
2ff0: 74 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  te must contain 
3000: 65 69 74 68 65 72 20 77 68 69 74 65 73 70 61 63  either whitespac
3010: 65 2c 20 61 6e 20 6f 70 65 6e 20 6f 72 20 63 6c  e, an open or cl
3020: 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  ose.      ** par
3030: 65 6e 74 68 65 73 69 73 2c 20 61 20 71 75 6f 74  enthesis, a quot
3040: 65 20 63 68 61 72 61 63 74 65 72 2c 20 6f 72 20  e character, or 
3050: 45 4f 46 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  EOF. .      */. 
3060: 20 20 20 20 20 63 4e 65 78 74 20 3d 20 7a 49 6e       cNext = zIn
3070: 70 75 74 5b 6e 4b 65 79 5d 3b 0a 20 20 20 20 20  put[nKey];.     
3080: 20 69 66 28 20 66 74 73 33 69 73 73 70 61 63 65   if( fts3isspace
3090: 28 63 4e 65 78 74 29 20 0a 20 20 20 20 20 20 20  (cNext) .       
30a0: 7c 7c 20 63 4e 65 78 74 3d 3d 27 22 27 20 7c 7c  || cNext=='"' ||
30b0: 20 63 4e 65 78 74 3d 3d 27 28 27 20 7c 7c 20 63   cNext=='(' || c
30c0: 4e 65 78 74 3d 3d 27 29 27 20 7c 7c 20 63 4e 65  Next==')' || cNe
30d0: 78 74 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  xt==0.      ){. 
30e0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46         pRet = (F
30f0: 74 73 33 45 78 70 72 20 2a 29 73 71 6c 69 74 65  ts3Expr *)sqlite
3100: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
3110: 46 74 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20  Fts3Expr));.    
3120: 20 20 20 20 69 66 28 20 21 70 52 65 74 20 29 7b      if( !pRet ){
3130: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3140: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
3150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3160: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
3170: 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70  , sizeof(Fts3Exp
3180: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  r));.        pRe
3190: 74 2d 3e 65 54 79 70 65 20 3d 20 70 4b 65 79 2d  t->eType = pKey-
31a0: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  >eType;.        
31b0: 70 52 65 74 2d 3e 6e 4e 65 61 72 20 3d 20 6e 4e  pRet->nNear = nN
31c0: 65 61 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  ear;.        *pp
31d0: 45 78 70 72 20 3d 20 70 52 65 74 3b 0a 20 20 20  Expr = pRet;.   
31e0: 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64       *pnConsumed
31f0: 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75 74   = (int)((zInput
3200: 20 2d 20 7a 29 20 2b 20 6e 4b 65 79 29 3b 0a 20   - z) + nKey);. 
3210: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
3220: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
3230: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 75 72 6e 73  ..      /* Turns
3240: 20 6f 75 74 20 74 68 61 74 20 77 61 73 6e 27 74   out that wasn't
3250: 20 61 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72   a keyword after
3260: 20 61 6c 6c 2e 20 54 68 69 73 20 68 61 70 70 65   all. This happe
3270: 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ns if the.      
3280: 2a 2a 20 75 73 65 72 20 68 61 73 20 73 75 70 70  ** user has supp
3290: 6c 69 65 64 20 61 20 74 6f 6b 65 6e 20 73 75 63  lied a token suc
32a0: 68 20 61 73 20 22 4f 52 61 63 6c 65 22 2e 20 43  h as "ORacle". C
32b0: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 20 20 20 2a  ontinue..      *
32c0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  /.    }.  }..  /
32d0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 20 6f  * Check for an o
32e0: 70 65 6e 20 62 72 61 63 6b 65 74 2e 20 2a 2f 0a  pen bracket. */.
32f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 74    if( sqlite3_ft
3300: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
3310: 68 65 73 65 73 20 29 7b 0a 20 20 20 20 69 66 28  heses ){.    if(
3320: 20 2a 7a 49 6e 70 75 74 3d 3d 27 28 27 20 29 7b   *zInput=='(' ){
3330: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  .      int nCons
3340: 75 6d 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  umed;.      int 
3350: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  rc;.      pParse
3360: 2d 3e 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 20  ->nNest++;.     
3370: 20 72 63 20 3d 20 66 74 73 33 45 78 70 72 50 61   rc = fts3ExprPa
3380: 72 73 65 28 70 50 61 72 73 65 2c 20 26 7a 49 6e  rse(pParse, &zIn
3390: 70 75 74 5b 31 5d 2c 20 6e 49 6e 70 75 74 2d 31  put[1], nInput-1
33a0: 2c 20 70 70 45 78 70 72 2c 20 26 6e 43 6f 6e 73  , ppExpr, &nCons
33b0: 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 69 66 28  umed);.      if(
33c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33d0: 26 20 21 2a 70 70 45 78 70 72 20 29 7b 0a 20 20  & !*ppExpr ){.  
33e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33f0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
3400: 20 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65        *pnConsume
3410: 64 20 3d 20 28 69 6e 74 29 28 28 7a 49 6e 70 75  d = (int)((zInpu
3420: 74 20 2d 20 7a 29 20 2b 20 31 20 2b 20 6e 43 6f  t - z) + 1 + nCo
3430: 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 72  nsumed);.      r
3440: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
3450: 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
3460: 66 6f 72 20 61 20 63 6c 6f 73 65 20 62 72 61 63  for a close brac
3470: 6b 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ket. */.    if( 
3480: 2a 7a 49 6e 70 75 74 3d 3d 27 29 27 20 29 7b 0a  *zInput==')' ){.
3490: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4e        pParse->nN
34a0: 65 73 74 2d 2d 3b 0a 20 20 20 20 20 20 2a 70 6e  est--;.      *pn
34b0: 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74 29  Consumed = (int)
34c0: 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b 20  ((zInput - z) + 
34d0: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
34e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
34f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
3500: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
3510: 69 6e 67 20 77 69 74 68 20 61 20 71 75 6f 74 65  ing with a quote
3520: 64 20 70 68 72 61 73 65 2e 20 49 66 20 74 68 69  d phrase. If thi
3530: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
3540: 68 65 6e 0a 20 20 2a 2a 20 73 65 61 72 63 68 20  hen.  ** search 
3550: 66 6f 72 20 74 68 65 20 63 6c 6f 73 69 6e 67 20  for the closing 
3560: 71 75 6f 74 65 20 61 6e 64 20 70 61 73 73 20 74  quote and pass t
3570: 68 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 20  he whole string 
3580: 74 6f 20 67 65 74 4e 65 78 74 53 74 72 69 6e 67  to getNextString
3590: 28 29 0a 20 20 2a 2a 20 66 6f 72 20 70 72 6f 63  ().  ** for proc
35a0: 65 73 73 69 6e 67 2e 20 54 68 69 73 20 69 73 20  essing. This is 
35b0: 65 61 73 79 20 74 6f 20 64 6f 2c 20 61 73 20 66  easy to do, as f
35c0: 74 73 33 20 68 61 73 20 6e 6f 20 73 79 6e 74 61  ts3 has no synta
35d0: 78 20 66 6f 72 20 65 73 63 61 70 69 6e 67 0a 20  x for escaping. 
35e0: 20 2a 2a 20 61 20 71 75 6f 74 65 20 63 68 61 72   ** a quote char
35f0: 61 63 74 65 72 20 65 6d 62 65 64 64 65 64 20 69  acter embedded i
3600: 6e 20 61 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  n a string..  */
3610: 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d 3d  .  if( *zInput==
3620: 27 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  '"' ){.    for(i
3630: 69 3d 31 3b 20 69 69 3c 6e 49 6e 70 75 74 20 26  i=1; ii<nInput &
3640: 26 20 7a 49 6e 70 75 74 5b 69 69 5d 21 3d 27 22  & zInput[ii]!='"
3650: 27 3b 20 69 69 2b 2b 29 3b 0a 20 20 20 20 2a 70  '; ii++);.    *p
3660: 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 28 69 6e 74  nConsumed = (int
3670: 29 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20 2b  )((zInput - z) +
3680: 20 69 69 20 2b 20 31 29 3b 0a 20 20 20 20 69 66   ii + 1);.    if
3690: 28 20 69 69 3d 3d 6e 49 6e 70 75 74 20 29 7b 0a  ( ii==nInput ){.
36a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
36c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65 74 4e  .    return getN
36d0: 65 78 74 53 74 72 69 6e 67 28 70 50 61 72 73 65  extString(pParse
36e0: 2c 20 26 7a 49 6e 70 75 74 5b 31 5d 2c 20 69 69  , &zInput[1], ii
36f0: 2d 31 2c 20 70 70 45 78 70 72 29 3b 0a 20 20 7d  -1, ppExpr);.  }
3700: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
3710: 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
3720: 20 70 6f 69 6e 74 2c 20 74 68 69 73 20 6d 75 73   point, this mus
3730: 74 20 62 65 20 61 20 72 65 67 75 6c 61 72 20 74  t be a regular t
3740: 6f 6b 65 6e 2c 20 6f 72 20 0a 20 20 2a 2a 20 74  oken, or .  ** t
3750: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
3760: 70 75 74 2e 20 52 65 61 64 20 61 20 72 65 67 75  put. Read a regu
3770: 6c 61 72 20 74 6f 6b 65 6e 20 75 73 69 6e 67 20  lar token using 
3780: 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  the sqlite3_toke
3790: 6e 69 7a 65 72 0a 20 20 2a 2a 20 69 6e 74 65 72  nizer.  ** inter
37a0: 66 61 63 65 2e 20 42 65 66 6f 72 65 20 64 6f 69  face. Before doi
37b0: 6e 67 20 73 6f 2c 20 66 69 67 75 72 65 20 6f 75  ng so, figure ou
37c0: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  t if there is an
37d0: 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
37e0: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 65 72 20  olumn specifier 
37f0: 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 2e 20 0a  for the token. .
3800: 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
3810: 53 74 72 61 6e 67 65 6c 79 2c 20 69 74 20 69 73  Strangely, it is
3820: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
3830: 20 61 73 73 6f 63 69 61 74 65 20 61 20 63 6f 6c   associate a col
3840: 75 6d 6e 20 73 70 65 63 69 66 69 65 72 0a 20 20  umn specifier.  
3850: 2a 2a 20 77 69 74 68 20 61 20 71 75 6f 74 65 64  ** with a quoted
3860: 20 70 68 72 61 73 65 2c 20 6f 6e 6c 79 20 77 69   phrase, only wi
3870: 74 68 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  th a single toke
3880: 6e 2e 20 4e 6f 74 20 73 75 72 65 20 69 66 20 74  n. Not sure if t
3890: 68 69 73 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20  his was.  ** an 
38a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
38b0: 72 74 69 66 61 63 74 20 6f 72 20 61 6e 20 69 6e  rtifact or an in
38c0: 74 65 6e 74 69 6f 6e 61 6c 20 64 65 63 69 73 69  tentional decisi
38d0: 6f 6e 20 77 68 65 6e 20 66 74 73 33 20 77 61 73  on when fts3 was
38e0: 0a 20 20 2a 2a 20 66 69 72 73 74 20 69 6d 70 6c  .  ** first impl
38f0: 65 6d 65 6e 74 65 64 2e 20 57 68 69 63 68 65 76  emented. Whichev
3900: 65 72 20 69 74 20 77 61 73 2c 20 74 68 69 73 20  er it was, this 
3910: 6d 6f 64 75 6c 65 20 64 75 70 6c 69 63 61 74 65  module duplicate
3920: 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 69 6d 69  s the .  ** limi
3930: 74 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  tation..  */.  i
3940: 43 6f 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 44  Col = pParse->iD
3950: 65 66 61 75 6c 74 43 6f 6c 3b 0a 20 20 69 43 6f  efaultCol;.  iCo
3960: 6c 4c 65 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  lLen = 0;.  for(
3970: 69 69 3d 30 3b 20 69 69 3c 70 50 61 72 73 65 2d  ii=0; ii<pParse-
3980: 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nCol; ii++){.  
3990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
39a0: 74 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a 43  tr = pParse->azC
39b0: 6f 6c 5b 69 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ol[ii];.    int 
39c0: 6e 53 74 72 20 3d 20 28 69 6e 74 29 73 74 72 6c  nStr = (int)strl
39d0: 65 6e 28 7a 53 74 72 29 3b 0a 20 20 20 20 69 66  en(zStr);.    if
39e0: 28 20 6e 49 6e 70 75 74 3e 6e 53 74 72 20 26 26  ( nInput>nStr &&
39f0: 20 7a 49 6e 70 75 74 5b 6e 53 74 72 5d 3d 3d 27   zInput[nStr]=='
3a00: 3a 27 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  :' .     && sqli
3a10: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 53 74  te3_strnicmp(zSt
3a20: 72 2c 20 7a 49 6e 70 75 74 2c 20 6e 53 74 72 29  r, zInput, nStr)
3a30: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
3a40: 20 20 69 43 6f 6c 20 3d 20 69 69 3b 0a 20 20 20    iCol = ii;.   
3a50: 20 20 20 69 43 6f 6c 4c 65 6e 20 3d 20 28 69 6e     iColLen = (in
3a60: 74 29 28 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20  t)((zInput - z) 
3a70: 2b 20 6e 53 74 72 20 2b 20 31 29 3b 0a 20 20 20  + nStr + 1);.   
3a80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3a90: 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 4e 65    }.  rc = getNe
3aa0: 78 74 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  xtToken(pParse, 
3ab0: 69 43 6f 6c 2c 20 26 7a 5b 69 43 6f 6c 4c 65 6e  iCol, &z[iColLen
3ac0: 5d 2c 20 6e 2d 69 43 6f 6c 4c 65 6e 2c 20 70 70  ], n-iColLen, pp
3ad0: 45 78 70 72 2c 20 70 6e 43 6f 6e 73 75 6d 65 64  Expr, pnConsumed
3ae0: 29 3b 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64  );.  *pnConsumed
3af0: 20 2b 3d 20 69 43 6f 6c 4c 65 6e 3b 0a 20 20 72   += iColLen;.  r
3b00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3b10: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
3b20: 69 73 20 61 6e 20 46 74 73 33 45 78 70 72 20 73  is an Fts3Expr s
3b30: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 20 62  tructure for a b
3b40: 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 28  inary operator (
3b50: 61 6e 79 20 74 79 70 65 0a 2a 2a 20 65 78 63 65  any type.** exce
3b60: 70 74 20 61 6e 20 46 54 53 51 55 45 52 59 5f 50  pt an FTSQUERY_P
3b70: 48 52 41 53 45 29 2e 20 52 65 74 75 72 6e 20 61  HRASE). Return a
3b80: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n integer value 
3b90: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
3ba0: 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f  .** precedence o
3bb0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 20  f the operator. 
3bc0: 4c 6f 77 65 72 20 76 61 6c 75 65 73 20 68 61 76  Lower values hav
3bd0: 65 20 61 20 68 69 67 68 65 72 20 70 72 65 63 65  e a higher prece
3be0: 64 65 6e 63 65 20 28 69 2e 65 2e 0a 2a 2a 20 67  dence (i.e..** g
3bf0: 72 6f 75 70 20 6d 6f 72 65 20 74 69 67 68 74 6c  roup more tightl
3c00: 79 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  y). For example,
3c10: 20 69 6e 20 74 68 65 20 43 20 6c 61 6e 67 75 61   in the C langua
3c20: 67 65 2c 20 74 68 65 20 3d 3d 20 6f 70 65 72 61  ge, the == opera
3c30: 74 6f 72 0a 2a 2a 20 67 72 6f 75 70 73 20 6d 6f  tor.** groups mo
3c40: 72 65 20 74 69 67 68 74 6c 79 20 74 68 61 6e 20  re tightly than 
3c50: 7c 7c 2c 20 61 6e 64 20 77 6f 75 6c 64 20 74 68  ||, and would th
3c60: 65 72 65 66 6f 72 65 20 68 61 76 65 20 61 20 68  erefore have a h
3c70: 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65  igher precedence
3c80: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 75 73 69  ..**.** When usi
3c90: 6e 67 20 74 68 65 20 6e 65 77 20 66 74 73 33 20  ng the new fts3 
3ca0: 71 75 65 72 79 20 73 79 6e 74 61 78 20 28 77 68  query syntax (wh
3cb0: 65 6e 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  en SQLITE_ENABLE
3cc0: 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 45 53 49  _FTS3_PARENTHESI
3cd0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 29  S.** is defined)
3ce0: 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74  , the order of t
3cf0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  he operators in 
3d00: 70 72 65 63 65 64 65 6e 63 65 20 66 72 6f 6d 20  precedence from 
3d10: 68 69 67 68 65 73 74 20 74 6f 0a 2a 2a 20 6c 6f  highest to.** lo
3d20: 77 65 73 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  west is:.**.**  
3d30: 20 4e 45 41 52 0a 2a 2a 20 20 20 4e 4f 54 0a 2a   NEAR.**   NOT.*
3d40: 2a 20 20 20 41 4e 44 20 28 69 6e 63 6c 75 64 69  *   AND (includi
3d50: 6e 67 20 69 6d 70 6c 69 63 69 74 20 41 4e 44 73  ng implicit ANDs
3d60: 29 0a 2a 2a 20 20 20 4f 52 0a 2a 2a 0a 2a 2a 20  ).**   OR.**.** 
3d70: 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 75  Note that when u
3d80: 73 69 6e 67 20 74 68 65 20 6f 6c 64 20 71 75 65  sing the old que
3d90: 72 79 20 73 79 6e 74 61 78 2c 20 74 68 65 20 4f  ry syntax, the O
3da0: 52 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 61  R operator has a
3db0: 20 68 69 67 68 65 72 0a 2a 2a 20 70 72 65 63 65   higher.** prece
3dc0: 64 65 6e 63 65 20 74 68 61 6e 20 74 68 65 20 41  dence than the A
3dd0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  ND operator..*/.
3de0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 50 72 65  static int opPre
3df0: 63 65 64 65 6e 63 65 28 46 74 73 33 45 78 70 72  cedence(Fts3Expr
3e00: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
3e10: 70 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45  p->eType!=FTSQUE
3e20: 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 69  RY_PHRASE );.  i
3e30: 66 28 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  f( sqlite3_fts3_
3e40: 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
3e50: 65 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  es ){.    return
3e60: 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c   p->eType;.  }el
3e70: 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d  se if( p->eType=
3e80: 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29  =FTSQUERY_NEAR )
3e90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3ea0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
3eb0: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f  Type==FTSQUERY_O
3ec0: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
3ed0: 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  2;.  }.  assert(
3ee0: 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
3ef0: 45 52 59 5f 41 4e 44 20 29 3b 0a 20 20 72 65 74  ERY_AND );.  ret
3f00: 75 72 6e 20 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 3;.}../*.** 
3f10: 41 72 67 75 6d 65 6e 74 20 70 70 48 65 61 64 20  Argument ppHead 
3f20: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
3f30: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
3f40: 74 20 68 65 61 64 20 6f 66 20 61 20 71 75 65 72  t head of a quer
3f50: 79 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  y .** expression
3f60: 20 74 72 65 65 20 62 65 69 6e 67 20 70 61 72 73   tree being pars
3f70: 65 64 2e 20 70 50 72 65 76 20 69 73 20 74 68 65  ed. pPrev is the
3f80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
3f90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
3fa0: 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
3fb0: 74 68 65 20 74 72 65 65 2e 20 54 68 69 73 20 66  the tree. This f
3fc0: 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 70 4e 65  unction adds pNe
3fd0: 77 2c 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  w, which is alwa
3fe0: 79 73 20 61 20 62 69 6e 61 72 79 0a 2a 2a 20 6f  ys a binary.** o
3ff0: 70 65 72 61 74 6f 72 20 6e 6f 64 65 2c 20 69 6e  perator node, in
4000: 74 6f 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  to the expressio
4010: 6e 20 74 72 65 65 20 62 61 73 65 64 20 6f 6e 20  n tree based on 
4020: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
4030: 63 65 64 65 6e 63 65 0a 2a 2a 20 6f 66 20 70 4e  cedence.** of pN
4040: 65 77 20 61 6e 64 20 74 68 65 20 65 78 69 73 74  ew and the exist
4050: 69 6e 67 20 6e 6f 64 65 73 20 6f 66 20 74 68 65  ing nodes of the
4060: 20 74 72 65 65 2e 20 54 68 69 73 20 6d 61 79 20   tree. This may 
4070: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 68 65  result in the he
4080: 61 64 0a 2a 2a 20 6f 66 20 74 68 65 20 74 72 65  ad.** of the tre
4090: 65 20 63 68 61 6e 67 69 6e 67 2c 20 69 6e 20 77  e changing, in w
40a0: 68 69 63 68 20 63 61 73 65 20 2a 70 70 48 65 61  hich case *ppHea
40b0: 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
40c0: 6e 65 77 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a  new root node..*
40d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
40e0: 73 65 72 74 42 69 6e 61 72 79 4f 70 65 72 61 74  sertBinaryOperat
40f0: 6f 72 28 0a 20 20 46 74 73 33 45 78 70 72 20 2a  or(.  Fts3Expr *
4100: 2a 70 70 48 65 61 64 2c 20 20 20 20 20 20 20 2f  *ppHead,       /
4110: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4120: 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 20   root node of a 
4130: 74 72 65 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  tree */.  Fts3Ex
4140: 70 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  pr *pPrev,      
4150: 20 20 20 2f 2a 20 4e 6f 64 65 20 6d 6f 73 74 20     /* Node most 
4160: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
4170: 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65 65 20  d into the tree 
4180: 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
4190: 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
41a0: 20 4e 65 77 20 62 69 6e 61 72 79 20 6e 6f 64 65   New binary node
41b0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
41c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
41d0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 45 78 70 72  */.){.  Fts3Expr
41e0: 20 2a 70 53 70 6c 69 74 20 3d 20 70 50 72 65 76   *pSplit = pPrev
41f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 70 6c 69  ;.  while( pSpli
4200: 74 2d 3e 70 50 61 72 65 6e 74 20 26 26 20 6f 70  t->pParent && op
4210: 50 72 65 63 65 64 65 6e 63 65 28 70 53 70 6c 69  Precedence(pSpli
4220: 74 2d 3e 70 50 61 72 65 6e 74 29 3c 3d 6f 70 50  t->pParent)<=opP
4230: 72 65 63 65 64 65 6e 63 65 28 70 4e 65 77 29 20  recedence(pNew) 
4240: 29 7b 0a 20 20 20 20 70 53 70 6c 69 74 20 3d 20  ){.    pSplit = 
4250: 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74 3b  pSplit->pParent;
4260: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 70 6c  .  }..  if( pSpl
4270: 69 74 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20  it->pParent ){. 
4280: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 6c 69     assert( pSpli
4290: 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 52 69 67  t->pParent->pRig
42a0: 68 74 3d 3d 70 53 70 6c 69 74 20 29 3b 0a 20 20  ht==pSplit );.  
42b0: 20 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e    pSplit->pParen
42c0: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77  t->pRight = pNew
42d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72  ;.    pNew->pPar
42e0: 65 6e 74 20 3d 20 70 53 70 6c 69 74 2d 3e 70 50  ent = pSplit->pP
42f0: 61 72 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  arent;.  }else{.
4300: 20 20 20 20 2a 70 70 48 65 61 64 20 3d 20 70 4e      *ppHead = pN
4310: 65 77 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  ew;.  }.  pNew->
4320: 70 4c 65 66 74 20 3d 20 70 53 70 6c 69 74 3b 0a  pLeft = pSplit;.
4330: 20 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e    pSplit->pParen
4340: 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  t = pNew;.}../*.
4350: 2a 2a 20 50 61 72 73 65 20 74 68 65 20 66 74 73  ** Parse the fts
4360: 33 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  3 query expressi
4370: 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 62 75 66 66  on found in buff
4380: 65 72 20 7a 2c 20 6c 65 6e 67 74 68 20 6e 2e 20  er z, length n. 
4390: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
43a0: 20 72 65 74 75 72 6e 73 20 65 69 74 68 65 72 20   returns either 
43b0: 77 68 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  when the end of 
43c0: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65  the buffer is re
43d0: 61 63 68 65 64 20 6f 72 20 61 6e 20 75 6e 6d 61  ached or an unma
43e0: 74 63 68 65 64 20 0a 2a 2a 20 63 6c 6f 73 69 6e  tched .** closin
43f0: 67 20 62 72 61 63 6b 65 74 20 2d 20 27 29 27 20  g bracket - ')' 
4400: 2d 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  - is encountered
4410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
4420: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
4430: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 2a 70   is returned, *p
4440: 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20  pExpr is set to 
4450: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4460: 70 61 72 73 65 64 20 66 6f 72 6d 20 6f 66 20 74  parsed form of t
4470: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
4480: 64 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 69 73  d *pnConsumed is
4490: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
44a0: 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 72  er of.** bytes r
44b0: 65 61 64 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ead from buffer 
44c0: 7a 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70  z. Otherwise, *p
44d0: 70 45 78 70 72 20 69 73 20 73 65 74 20 74 6f 20  pExpr is set to 
44e0: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  0 and SQLITE_NOM
44f0: 45 4d 0a 2a 2a 20 28 6f 75 74 20 6f 66 20 6d 65  EM.** (out of me
4500: 6d 6f 72 79 20 65 72 72 6f 72 29 20 6f 72 20 53  mory error) or S
4510: 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 70 61 72  QLITE_ERROR (par
4520: 73 65 20 65 72 72 6f 72 29 20 69 73 20 72 65 74  se error) is ret
4530: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
4540: 20 69 6e 74 20 66 74 73 33 45 78 70 72 50 61 72   int fts3ExprPar
4550: 73 65 28 0a 20 20 50 61 72 73 65 43 6f 6e 74 65  se(.  ParseConte
4560: 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  xt *pParse,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4580: 20 66 74 73 33 20 71 75 65 72 79 20 70 61 72 73   fts3 query pars
4590: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
45a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
45b0: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
45c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
45d0: 66 20 4d 41 54 43 48 20 71 75 65 72 79 20 2a 2f  f MATCH query */
45e0: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 70 70  .  Fts3Expr **pp
45f0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4610: 54 3a 20 50 61 72 73 65 64 20 71 75 65 72 79 20  T: Parsed query 
4620: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
4630: 6e 74 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20  nt *pnConsumed  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
4660: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
4670: 6f 6e 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20  onsumed */.){.  
4680: 46 74 73 33 45 78 70 72 20 2a 70 52 65 74 20 3d  Fts3Expr *pRet =
4690: 20 30 3b 0a 20 20 46 74 73 33 45 78 70 72 20 2a   0;.  Fts3Expr *
46a0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 46 74 73  pPrev = 0;.  Fts
46b0: 33 45 78 70 72 20 2a 70 4e 6f 74 42 72 61 6e 63  3Expr *pNotBranc
46c0: 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  h = 0;          
46d0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 73 65       /* Only use
46e0: 64 20 69 6e 20 6c 65 67 61 63 79 20 70 61 72 73  d in legacy pars
46f0: 65 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  e mode */.  int 
4700: 6e 49 6e 20 3d 20 6e 3b 0a 20 20 63 6f 6e 73 74  nIn = n;.  const
4710: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 3b 0a   char *zIn = z;.
4720: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4730: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 52 65  E_OK;.  int isRe
4740: 71 75 69 72 65 50 68 72 61 73 65 20 3d 20 31 3b  quirePhrase = 1;
4750: 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
4760: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4770: 46 74 73 33 45 78 70 72 20 2a 70 20 3d 20 30 3b  Fts3Expr *p = 0;
4780: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
4790: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   0;.    rc = get
47a0: 4e 65 78 74 4e 6f 64 65 28 70 50 61 72 73 65 2c  NextNode(pParse,
47b0: 20 7a 49 6e 2c 20 6e 49 6e 2c 20 26 70 2c 20 26   zIn, nIn, &p, &
47c0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
47d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
47e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 68 72  .      int isPhr
47f0: 61 73 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ase;..      if( 
4800: 21 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  !sqlite3_fts3_en
4810: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
4820: 20 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 65   .       && p->e
4830: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
4840: 48 52 41 53 45 20 26 26 20 70 2d 3e 70 50 68 72  HRASE && p->pPhr
4850: 61 73 65 2d 3e 69 73 4e 6f 74 20 0a 20 20 20 20  ase->isNot .    
4860: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
4870: 43 72 65 61 74 65 20 61 6e 20 69 6d 70 6c 69 63  Create an implic
4880: 69 74 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 2e  it NOT operator.
4890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74 73 33   */.        Fts3
48a0: 45 78 70 72 20 2a 70 4e 6f 74 20 3d 20 73 71 6c  Expr *pNot = sql
48b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
48c0: 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b 0a 20  of(Fts3Expr));. 
48d0: 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 6f 74         if( !pNot
48e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
48f0: 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65  lite3Fts3ExprFre
4900: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
4910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4920: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
4930: 6f 20 65 78 70 72 70 61 72 73 65 5f 6f 75 74 3b  o exprparse_out;
4940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4950: 20 20 20 6d 65 6d 73 65 74 28 70 4e 6f 74 2c 20     memset(pNot, 
4960: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78  0, sizeof(Fts3Ex
4970: 70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  pr));.        pN
4980: 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 51  ot->eType = FTSQ
4990: 55 45 52 59 5f 4e 4f 54 3b 0a 20 20 20 20 20 20  UERY_NOT;.      
49a0: 20 20 70 4e 6f 74 2d 3e 70 52 69 67 68 74 20 3d    pNot->pRight =
49b0: 20 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   p;.        if( 
49c0: 70 4e 6f 74 42 72 61 6e 63 68 20 29 7b 0a 20 20  pNotBranch ){.  
49d0: 20 20 20 20 20 20 20 20 70 4e 6f 74 2d 3e 70 4c          pNot->pL
49e0: 65 66 74 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68  eft = pNotBranch
49f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a00: 20 20 20 20 70 4e 6f 74 42 72 61 6e 63 68 20 3d      pNotBranch =
4a10: 20 70 4e 6f 74 3b 0a 20 20 20 20 20 20 20 20 70   pNot;.        p
4a20: 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 20 20   = pPrev;.      
4a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
4a40: 6e 74 20 65 54 79 70 65 20 3d 20 70 2d 3e 65 54  nt eType = p->eT
4a50: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
4a60: 65 72 74 28 20 65 54 79 70 65 21 3d 46 54 53 51  ert( eType!=FTSQ
4a70: 55 45 52 59 5f 50 48 52 41 53 45 20 7c 7c 20 21  UERY_PHRASE || !
4a80: 70 2d 3e 70 50 68 72 61 73 65 2d 3e 69 73 4e 6f  p->pPhrase->isNo
4a90: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 50  t );.        isP
4aa0: 68 72 61 73 65 20 3d 20 28 65 54 79 70 65 3d 3d  hrase = (eType==
4ab0: 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20  FTSQUERY_PHRASE 
4ac0: 7c 7c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  || p->pLeft);.. 
4ad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73         /* The is
4ae0: 52 65 71 75 69 72 65 50 68 72 61 73 65 20 76 61  RequirePhrase va
4af0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
4b00: 20 74 72 75 65 20 69 66 20 61 20 70 68 72 61 73   true if a phras
4b10: 65 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  e or.        ** 
4b20: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  an expression co
4b30: 6e 74 61 69 6e 65 64 20 69 6e 20 70 61 72 65 6e  ntained in paren
4b40: 74 68 65 73 69 73 20 69 73 20 72 65 71 75 69 72  thesis is requir
4b50: 65 64 2e 20 49 66 20 61 0a 20 20 20 20 20 20 20  ed. If a.       
4b60: 20 2a 2a 20 62 69 6e 61 72 79 20 6f 70 65 72 61   ** binary opera
4b70: 74 6f 72 20 28 41 4e 44 2c 20 4f 52 2c 20 4e 4f  tor (AND, OR, NO
4b80: 54 20 6f 72 20 4e 45 41 52 29 20 69 73 20 65 6e  T or NEAR) is en
4b90: 63 6f 75 6e 74 65 64 20 77 68 65 6e 0a 20 20 20  counted when.   
4ba0: 20 20 20 20 20 2a 2a 20 69 73 52 65 71 75 69 72       ** isRequir
4bb0: 65 50 68 72 61 73 65 20 69 73 20 73 65 74 2c 20  ePhrase is set, 
4bc0: 74 68 69 73 20 69 73 20 61 20 73 79 6e 74 61 78  this is a syntax
4bd0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20   error..        
4be0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
4bf0: 69 73 50 68 72 61 73 65 20 26 26 20 69 73 52 65  isPhrase && isRe
4c00: 71 75 69 72 65 50 68 72 61 73 65 20 29 7b 0a 20  quirePhrase ){. 
4c10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4c20: 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29 3b  Fts3ExprFree(p);
4c30: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
4c40: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
4c50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70          goto exp
4c60: 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20  rparse_out;.    
4c70: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
4c80: 20 69 66 28 20 69 73 50 68 72 61 73 65 20 26 26   if( isPhrase &&
4c90: 20 21 69 73 52 65 71 75 69 72 65 50 68 72 61 73   !isRequirePhras
4ca0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
4cb0: 2a 20 49 6e 73 65 72 74 20 61 6e 20 69 6d 70 6c  * Insert an impl
4cc0: 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f  icit AND operato
4cd0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
4ce0: 46 74 73 33 45 78 70 72 20 2a 70 41 6e 64 3b 0a  Fts3Expr *pAnd;.
4cf0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
4d00: 28 20 70 52 65 74 20 26 26 20 70 50 72 65 76 20  ( pRet && pPrev 
4d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  );.          pAn
4d20: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
4d30: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 45 78  oc(sizeof(Fts3Ex
4d40: 70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr));.          
4d50: 69 66 28 20 21 70 41 6e 64 20 29 7b 0a 20 20 20  if( !pAnd ){.   
4d60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4d70: 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29 3b  Fts3ExprFree(p);
4d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
4d90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
4db0: 20 65 78 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a   exprparse_out;.
4dc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4dd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 41 6e        memset(pAn
4de0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  d, 0, sizeof(Fts
4df0: 33 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20 20  3Expr));.       
4e00: 20 20 20 70 41 6e 64 2d 3e 65 54 79 70 65 20 3d     pAnd->eType =
4e10: 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3b 0a 20   FTSQUERY_AND;. 
4e20: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 42           insertB
4e30: 69 6e 61 72 79 4f 70 65 72 61 74 6f 72 28 26 70  inaryOperator(&p
4e40: 52 65 74 2c 20 70 50 72 65 76 2c 20 70 41 6e 64  Ret, pPrev, pAnd
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
4e60: 65 76 20 3d 20 70 41 6e 64 3b 0a 20 20 20 20 20  ev = pAnd;.     
4e70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
4e80: 20 54 68 69 73 20 74 65 73 74 20 63 61 74 63 68   This test catch
4e90: 65 73 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6d  es attempts to m
4ea0: 61 6b 65 20 65 69 74 68 65 72 20 6f 70 65 72 61  ake either opera
4eb0: 6e 64 20 6f 66 20 61 20 4e 45 41 52 0a 20 20 20  nd of a NEAR.   
4ec0: 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72       ** operator
4ed0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
4ee0: 20 74 68 61 6e 20 61 20 70 68 72 61 73 65 2e 20   than a phrase. 
4ef0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 65 69 74  For example, eit
4f00: 68 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  her of.        *
4f10: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
4f20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
4f30: 20 20 20 20 2a 2a 20 20 20 20 28 62 72 61 63 6b      **    (brack
4f40: 65 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 29  eted expression)
4f50: 20 4e 45 41 52 20 70 68 72 61 73 65 0a 20 20 20   NEAR phrase.   
4f60: 20 20 20 20 20 2a 2a 20 20 20 20 70 68 72 61 73       **    phras
4f70: 65 20 4e 45 41 52 20 28 62 72 61 63 6b 65 74 65  e NEAR (brackete
4f80: 64 20 65 78 70 72 65 73 73 69 6f 6e 29 0a 20 20  d expression).  
4f90: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4fa0: 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72   ** Return an er
4fb0: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
4fc0: 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  se..        */. 
4fd0: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
4fe0: 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 20 20   && (.          
4ff0: 20 20 28 65 54 79 70 65 3d 3d 46 54 53 51 55 45    (eType==FTSQUE
5000: 52 59 5f 4e 45 41 52 20 26 26 20 21 69 73 50 68  RY_NEAR && !isPh
5010: 72 61 73 65 20 26 26 20 70 50 72 65 76 2d 3e 65  rase && pPrev->e
5020: 54 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 50  Type!=FTSQUERY_P
5030: 48 52 41 53 45 29 0a 20 20 20 20 20 20 20 20 20  HRASE).         
5040: 7c 7c 20 28 65 54 79 70 65 21 3d 46 54 53 51 55  || (eType!=FTSQU
5050: 45 52 59 5f 50 48 52 41 53 45 20 26 26 20 69 73  ERY_PHRASE && is
5060: 50 68 72 61 73 65 20 26 26 20 70 50 72 65 76 2d  Phrase && pPrev-
5070: 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
5080: 5f 4e 45 41 52 29 0a 20 20 20 20 20 20 20 20 29  _NEAR).        )
5090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
50a0: 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65  ite3Fts3ExprFree
50b0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
50c0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
50d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
50e0: 20 65 78 70 72 70 61 72 73 65 5f 6f 75 74 3b 0a   exprparse_out;.
50f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
5100: 20 20 20 20 20 69 66 28 20 69 73 50 68 72 61 73       if( isPhras
5110: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
5120: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
5130: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5140: 50 72 65 76 20 26 26 20 70 50 72 65 76 2d 3e 70  Prev && pPrev->p
5150: 4c 65 66 74 20 26 26 20 70 50 72 65 76 2d 3e 70  Left && pPrev->p
5160: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
5170: 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70          pPrev->p
5180: 52 69 67 68 74 20 3d 20 70 3b 0a 20 20 20 20 20  Right = p;.     
5190: 20 20 20 20 20 20 20 70 2d 3e 70 50 61 72 65 6e         p->pParen
51a0: 74 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 20  t = pPrev;.     
51b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
51c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
51d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
51e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
51f0: 20 20 20 20 20 20 20 69 6e 73 65 72 74 42 69 6e         insertBin
5200: 61 72 79 4f 70 65 72 61 74 6f 72 28 26 70 52 65  aryOperator(&pRe
5210: 74 2c 20 70 50 72 65 76 2c 20 70 29 3b 0a 20 20  t, pPrev, p);.  
5220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5230: 69 73 52 65 71 75 69 72 65 50 68 72 61 73 65 20  isRequirePhrase 
5240: 3d 20 21 69 73 50 68 72 61 73 65 3b 0a 20 20 20  = !isPhrase;.   
5250: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
5260: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
5270: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5280: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5290: 20 28 6e 42 79 74 65 3e 30 20 26 26 20 6e 42 79   (nByte>0 && nBy
52a0: 74 65 3c 3d 6e 49 6e 29 20 29 3b 0a 20 20 20 20  te<=nIn) );.    
52b0: 6e 49 6e 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  nIn -= nByte;.  
52c0: 20 20 7a 49 6e 20 2b 3d 20 6e 42 79 74 65 3b 0a    zIn += nByte;.
52d0: 20 20 20 20 70 50 72 65 76 20 3d 20 70 3b 0a 20      pPrev = p;. 
52e0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
52f0: 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 70 52 65  LITE_DONE && pRe
5300: 74 20 26 26 20 69 73 52 65 71 75 69 72 65 50 68  t && isRequirePh
5310: 72 61 73 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  rase ){.    rc =
5320: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5330: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
5340: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
5350: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5360: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
5370: 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
5380: 72 65 6e 74 68 65 73 65 73 20 26 26 20 70 4e 6f  rentheses && pNo
5390: 74 42 72 61 6e 63 68 20 29 7b 0a 20 20 20 20 20  tBranch ){.     
53a0: 20 69 66 28 20 21 70 52 65 74 20 29 7b 0a 20 20   if( !pRet ){.  
53b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
53c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
53d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74  else{.        Ft
53e0: 73 33 45 78 70 72 20 2a 70 49 74 65 72 20 3d 20  s3Expr *pIter = 
53f0: 70 4e 6f 74 42 72 61 6e 63 68 3b 0a 20 20 20 20  pNotBranch;.    
5400: 20 20 20 20 77 68 69 6c 65 28 20 70 49 74 65 72      while( pIter
5410: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
5420: 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 49 74       pIter = pIt
5430: 65 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  er->pLeft;.     
5440: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
5450: 65 72 2d 3e 70 4c 65 66 74 20 3d 20 70 52 65 74  er->pLeft = pRet
5460: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
5470: 20 70 4e 6f 74 42 72 61 6e 63 68 3b 0a 20 20 20   pNotBranch;.   
5480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5490: 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 6e   *pnConsumed = n
54a0: 20 2d 20 6e 49 6e 3b 0a 0a 65 78 70 72 70 61 72   - nIn;..exprpar
54b0: 73 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  se_out:.  if( rc
54c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
54d0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
54e0: 70 72 46 72 65 65 28 70 52 65 74 29 3b 0a 20 20  prFree(pRet);.  
54f0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70    sqlite3Fts3Exp
5500: 72 46 72 65 65 28 70 4e 6f 74 42 72 61 6e 63 68  rFree(pNotBranch
5510: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
5520: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
5530: 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
5540: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
5550: 61 6d 65 74 65 72 73 20 7a 20 61 6e 64 20 6e 20  ameters z and n 
5560: 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
5570: 72 20 74 6f 20 61 6e 64 20 6c 65 6e 67 74 68 20  r to and length 
5580: 6f 66 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  of a buffer cont
5590: 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 66 74 73  aining.** an fts
55a0: 33 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  3 query expressi
55b0: 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  on, respectively
55c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
55d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 70 61 72 73  attempts to pars
55e0: 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 65  e the.** query e
55f0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 63 72  xpression and cr
5600: 65 61 74 65 20 61 20 74 72 65 65 20 6f 66 20 46  eate a tree of F
5610: 74 73 33 45 78 70 72 20 73 74 72 75 63 74 75 72  ts3Expr structur
5620: 65 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  es representing 
5630: 74 68 65 0a 2a 2a 20 70 61 72 73 65 64 20 65 78  the.** parsed ex
5640: 70 72 65 73 73 69 6f 6e 2e 20 49 66 20 73 75 63  pression. If suc
5650: 63 65 73 73 66 75 6c 2c 20 2a 70 70 45 78 70 72  cessful, *ppExpr
5660: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
5670: 20 74 6f 20 74 68 65 20 68 65 61 64 0a 2a 2a 20   to the head.** 
5680: 6f 66 20 74 68 65 20 70 61 72 73 65 64 20 65 78  of the parsed ex
5690: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
56a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
56b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
56c0: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  rror.** occurs, 
56d0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
56e0: 4d 45 4d 20 28 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  MEM (out-of-memo
56f0: 72 79 20 65 72 72 6f 72 29 20 6f 72 20 53 51 4c  ry error) or SQL
5700: 49 54 45 5f 45 52 52 4f 52 20 28 70 61 72 73 65  ITE_ERROR (parse
5710: 0a 2a 2a 20 65 72 72 6f 72 29 20 69 73 20 72 65  .** error) is re
5720: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 45 78  turned and *ppEx
5730: 70 72 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  pr is set to 0..
5740: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
5750: 65 72 20 6e 20 69 73 20 61 20 6e 65 67 61 74 69  er n is a negati
5760: 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 6e 20  ve number, then 
5770: 7a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  z is assumed to 
5780: 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20 6e 75  point to a.** nu
5790: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
57a0: 69 6e 67 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ing and the leng
57b0: 74 68 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  th is determined
57c0: 20 75 73 69 6e 67 20 73 74 72 6c 65 6e 28 29 2e   using strlen().
57d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
57e0: 20 70 61 72 61 6d 65 74 65 72 2c 20 70 54 6f 6b   parameter, pTok
57f0: 65 6e 69 7a 65 72 2c 20 69 73 20 70 61 73 73 65  enizer, is passe
5800: 64 20 74 68 65 20 66 74 73 33 20 74 6f 6b 65 6e  d the fts3 token
5810: 69 7a 65 72 20 6d 6f 64 75 6c 65 20 74 6f 0a 2a  izer module to.*
5820: 2a 20 75 73 65 20 74 6f 20 6e 6f 72 6d 61 6c 69  * use to normali
5830: 7a 65 20 71 75 65 72 79 20 74 6f 6b 65 6e 73 20  ze query tokens 
5840: 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 74 68  while parsing th
5850: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  e expression. Th
5860: 65 20 61 7a 43 6f 6c 5b 5d 0a 2a 2a 20 61 72 72  e azCol[].** arr
5870: 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 73 73  ay, which is ass
5880: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
5890: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c 20 73 68  nCol entries, sh
58a0: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65  ould contain the
58b0: 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66 20 65 61 63   names.** of eac
58c0: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
58d0: 74 61 72 67 65 74 20 66 74 73 33 20 74 61 62 6c  target fts3 tabl
58e0: 65 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d  e, in order from
58f0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
5900: 0a 2a 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** Column names
5910: 20 6d 75 73 74 20 62 65 20 6e 75 6c 2d 74 65 72   must be nul-ter
5920: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 2e  minated strings.
5930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 44 65 66 61  .**.** The iDefa
5940: 75 6c 74 43 6f 6c 20 70 61 72 61 6d 65 74 65 72  ultCol parameter
5950: 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
5960: 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
5970: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
5980: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ** that appears 
5990: 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  on the left-hand
59a0: 2d 73 69 64 65 20 6f 66 20 74 68 65 20 4d 41 54  -side of the MAT
59b0: 43 48 20 6f 70 65 72 61 74 6f 72 20 28 74 68 65  CH operator (the
59c0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 63 6f 6c 75   default.** colu
59d0: 6d 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  mn to match agai
59e0: 6e 73 74 20 66 6f 72 20 74 6f 6b 65 6e 73 20 66  nst for tokens f
59f0: 6f 72 20 77 68 69 63 68 20 61 20 63 6f 6c 75 6d  or which a colum
5a00: 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 65 78  n name is not ex
5a10: 70 6c 69 63 69 74 6c 79 0a 2a 2a 20 73 70 65 63  plicitly.** spec
5a20: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
5a30: 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e   the query strin
5a40: 67 29 2c 20 6f 72 20 2d 31 20 69 66 20 74 6f 6b  g), or -1 if tok
5a50: 65 6e 73 20 6d 61 79 20 62 79 20 64 65 66 61 75  ens may by defau
5a60: 6c 74 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79 20  lt.** match any 
5a70: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  table column..*/
5a80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
5a90: 45 78 70 72 50 61 72 73 65 28 0a 20 20 73 71 6c  ExprParse(.  sql
5aa0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
5ab0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 20 20 20 20  pTokenizer,     
5ac0: 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 6d 6f   /* Tokenizer mo
5ad0: 64 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  dule */.  char *
5ae0: 2a 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *azCol,         
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b00: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
5b10: 20 6e 61 6d 65 73 20 66 6f 72 20 66 74 73 33 20   names for fts3 
5b20: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
5b30: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
5b60: 69 65 73 20 69 6e 20 61 7a 43 6f 6c 5b 5d 20 2a  ies in azCol[] *
5b70: 2f 0a 20 20 69 6e 74 20 69 44 65 66 61 75 6c 74  /.  int iDefault
5b80: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
5b90: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
5ba0: 6c 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 71 75 65  lt column to que
5bb0: 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ry */.  const ch
5bc0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20  ar *z, int n,   
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5be0: 65 78 74 20 6f 66 20 4d 41 54 43 48 20 71 75 65  ext of MATCH que
5bf0: 72 79 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  ry */.  Fts3Expr
5c00: 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20   **ppExpr       
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5c20: 55 54 3a 20 50 61 72 73 65 64 20 71 75 65 72 79  UT: Parsed query
5c30: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
5c40: 0a 20 20 69 6e 74 20 6e 50 61 72 73 65 64 3b 0a  .  int nParsed;.
5c50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 61 72 73    int rc;.  Pars
5c60: 65 43 6f 6e 74 65 78 74 20 73 50 61 72 73 65 3b  eContext sParse;
5c70: 0a 20 20 73 50 61 72 73 65 2e 70 54 6f 6b 65 6e  .  sParse.pToken
5c80: 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  izer = pTokenize
5c90: 72 3b 0a 20 20 73 50 61 72 73 65 2e 61 7a 43 6f  r;.  sParse.azCo
5ca0: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
5cb0: 2a 2a 29 61 7a 43 6f 6c 3b 0a 20 20 73 50 61 72  **)azCol;.  sPar
5cc0: 73 65 2e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  se.nCol = nCol;.
5cd0: 20 20 73 50 61 72 73 65 2e 69 44 65 66 61 75 6c    sParse.iDefaul
5ce0: 74 43 6f 6c 20 3d 20 69 44 65 66 61 75 6c 74 43  tCol = iDefaultC
5cf0: 6f 6c 3b 0a 20 20 73 50 61 72 73 65 2e 6e 4e 65  ol;.  sParse.nNe
5d00: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 3d  st = 0;.  if( z=
5d10: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  =0 ){.    *ppExp
5d20: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5d30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5d40: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
5d50: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
5d60: 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  n(z);.  }.  rc =
5d70: 20 66 74 73 33 45 78 70 72 50 61 72 73 65 28 26   fts3ExprParse(&
5d80: 73 50 61 72 73 65 2c 20 7a 2c 20 6e 2c 20 70 70  sParse, z, n, pp
5d90: 45 78 70 72 2c 20 26 6e 50 61 72 73 65 64 29 3b  Expr, &nParsed);
5da0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
5db0: 20 6d 69 73 6d 61 74 63 68 65 64 20 70 61 72 65   mismatched pare
5dc0: 6e 74 68 65 73 69 73 20 2a 2f 0a 20 20 69 66 28  nthesis */.  if(
5dd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5de0: 26 20 73 50 61 72 73 65 2e 6e 4e 65 73 74 20 29  & sParse.nNest )
5df0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5e00: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
5e10: 69 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65  ite3Fts3ExprFree
5e20: 28 2a 70 70 45 78 70 72 29 3b 0a 20 20 20 20 2a  (*ppExpr);.    *
5e30: 70 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 0a  ppExpr = 0;.  }.
5e40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5e50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 70 61  ./*.** Free a pa
5e60: 72 73 65 64 20 66 74 73 33 20 71 75 65 72 79 20  rsed fts3 query 
5e70: 65 78 70 72 65 73 73 69 6f 6e 20 61 6c 6c 6f 63  expression alloc
5e80: 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ated by sqlite3F
5e90: 74 73 33 45 78 70 72 50 61 72 73 65 28 29 2e 0a  ts3ExprParse()..
5ea0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
5eb0: 74 73 33 45 78 70 72 46 72 65 65 28 46 74 73 33  ts3ExprFree(Fts3
5ec0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5ed0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
5ee0: 46 74 73 33 45 78 70 72 46 72 65 65 28 70 2d 3e  Fts3ExprFree(p->
5ef0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
5f00: 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28  te3Fts3ExprFree(
5f10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
5f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
5f30: 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 73  aDoclist);.    s
5f40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
5f50: 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a    }.}../********
5f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fa0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
5fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67  **.** Everything
6000: 20 61 66 74 65 72 20 74 68 69 73 20 70 6f 69 6e   after this poin
6010: 74 20 69 73 20 6a 75 73 74 20 74 65 73 74 20 63  t is just test c
6020: 6f 64 65 2e 0a 2a 2f 0a 0a 23 69 66 64 65 66 20  ode..*/..#ifdef 
6030: 53 51 4c 49 54 45 5f 54 45 53 54 0a 0a 23 69 6e  SQLITE_TEST..#in
6040: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
6050: 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
6060: 74 6f 20 71 75 65 72 79 20 74 68 65 20 68 61 73  to query the has
6070: 68 2d 74 61 62 6c 65 20 6f 66 20 74 6f 6b 65 6e  h-table of token
6080: 69 7a 65 72 73 20 28 73 65 65 20 52 45 41 44 4d  izers (see READM
6090: 45 2e 74 6f 6b 65 6e 69 7a 65 72 73 29 2e 0a 2a  E.tokenizers)..*
60a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
60b0: 72 79 54 65 73 74 54 6f 6b 65 6e 69 7a 65 72 28  ryTestTokenizer(
60c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
60d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
60e0: 4e 61 6d 65 2c 20 20 0a 20 20 63 6f 6e 73 74 20  Name,  .  const 
60f0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
6100: 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 29 7b  r_module **pp.){
6110: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6120: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
6130: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  ;.  const char z
6140: 53 71 6c 5b 5d 20 3d 20 22 53 45 4c 45 43 54 20  Sql[] = "SELECT 
6150: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f  fts3_tokenizer(?
6160: 29 22 3b 0a 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  )";..  *pp = 0;.
6170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
6180: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
6190: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
61a0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
61b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
61c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
61d0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
61e0: 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61  xt(pStmt, 1, zNa
61f0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  me, -1, SQLITE_S
6200: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51  TATIC);.  if( SQ
6210: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
6220: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
6230: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
6240: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
6250: 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 42  mt, 0)==SQLITE_B
6260: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  LOB ){.      mem
6270: 63 70 79 28 28 76 6f 69 64 20 2a 29 70 70 2c 20  cpy((void *)pp, 
6280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
6290: 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 20 73  lob(pStmt, 0), s
62a0: 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20 20 20  izeof(*pp));.   
62b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
62c0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
62d0: 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pStmt);.}../*.
62e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
62f0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
6300: 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 20 66  test interface f
6310: 6f 72 20 74 68 65 20 71 75 65 72 79 20 70 61 72  or the query par
6320: 73 65 72 2e 20 49 74 0a 2a 2a 20 77 72 69 74 65  ser. It.** write
6330: 73 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65  s a text represe
6340: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71  ntation of the q
6350: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
6360: 70 45 78 70 72 20 69 6e 74 6f 20 74 68 65 0a 2a  pExpr into the.*
6370: 2a 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  * buffer pointed
6380: 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
6390: 7a 42 75 66 2e 20 49 74 20 69 73 20 61 73 73 75  zBuf. It is assu
63a0: 6d 65 64 20 74 68 61 74 20 7a 42 75 66 20 69 73  med that zBuf is
63b0: 20 6c 61 72 67 65 20 0a 2a 2a 20 65 6e 6f 75 67   large .** enoug
63c0: 68 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  h to store the r
63d0: 65 71 75 69 72 65 64 20 74 65 78 74 20 72 65 70  equired text rep
63e0: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  resentation..*/.
63f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
6400: 54 6f 53 74 72 69 6e 67 28 46 74 73 33 45 78 70  ToString(Fts3Exp
6410: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 2a  r *pExpr, char *
6420: 7a 42 75 66 29 7b 0a 20 20 73 77 69 74 63 68 28  zBuf){.  switch(
6430: 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20 29 7b   pExpr->eType ){
6440: 0a 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45  .    case FTSQUE
6450: 52 59 5f 50 48 52 41 53 45 3a 20 7b 0a 20 20 20  RY_PHRASE: {.   
6460: 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
6470: 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
6480: 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 69  pPhrase;.      i
6490: 6e 74 20 69 3b 0a 20 20 20 20 20 20 7a 42 75 66  nt i;.      zBuf
64a0: 20 2b 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66   += sprintf(zBuf
64b0: 2c 20 22 50 48 52 41 53 45 20 25 64 20 25 64 22  , "PHRASE %d %d"
64c0: 2c 20 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75  , pPhrase->iColu
64d0: 6d 6e 2c 20 70 50 68 72 61 73 65 2d 3e 69 73 4e  mn, pPhrase->isN
64e0: 6f 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ot);.      for(i
64f0: 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e  =0; i<pPhrase->n
6500: 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
6510: 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 73 70 72       zBuf += spr
6520: 69 6e 74 66 28 7a 42 75 66 2c 22 20 25 2e 2a 73  intf(zBuf," %.*s
6530: 22 2c 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ",pPhrase->aToke
6540: 6e 5b 69 5d 2e 6e 2c 70 50 68 72 61 73 65 2d 3e  n[i].n,pPhrase->
6550: 61 54 6f 6b 65 6e 5b 69 5d 2e 7a 29 3b 0a 20 20  aToken[i].z);.  
6560: 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 73 70        zBuf += sp
6570: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 73 22 2c  rintf(zBuf,"%s",
6580: 20 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65   (pPhrase->aToke
6590: 6e 5b 69 5d 2e 69 73 50 72 65 66 69 78 3f 22 2b  n[i].isPrefix?"+
65a0: 22 3a 22 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ":""));.      }.
65b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
65c0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 46 54    }..    case FT
65d0: 53 51 55 45 52 59 5f 4e 45 41 52 3a 0a 20 20 20  SQUERY_NEAR:.   
65e0: 20 20 20 7a 42 75 66 20 2b 3d 20 73 70 72 69 6e     zBuf += sprin
65f0: 74 66 28 7a 42 75 66 2c 20 22 4e 45 41 52 2f 25  tf(zBuf, "NEAR/%
6600: 64 20 22 2c 20 70 45 78 70 72 2d 3e 6e 4e 65 61  d ", pExpr->nNea
6610: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
6620: 0a 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45  .    case FTSQUE
6630: 52 59 5f 4e 4f 54 3a 0a 20 20 20 20 20 20 7a 42  RY_NOT:.      zB
6640: 75 66 20 2b 3d 20 73 70 72 69 6e 74 66 28 7a 42  uf += sprintf(zB
6650: 75 66 2c 20 22 4e 4f 54 20 22 29 3b 0a 20 20 20  uf, "NOT ");.   
6660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6670: 73 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a  se FTSQUERY_AND:
6680: 0a 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 73  .      zBuf += s
6690: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 41 4e  printf(zBuf, "AN
66a0: 44 20 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  D ");.      brea
66b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 46 54 53 51  k;.    case FTSQ
66c0: 55 45 52 59 5f 4f 52 3a 0a 20 20 20 20 20 20 7a  UERY_OR:.      z
66d0: 42 75 66 20 2b 3d 20 73 70 72 69 6e 74 66 28 7a  Buf += sprintf(z
66e0: 42 75 66 2c 20 22 4f 52 20 22 29 3b 0a 20 20 20  Buf, "OR ");.   
66f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6700: 20 7a 42 75 66 20 2b 3d 20 73 70 72 69 6e 74 66   zBuf += sprintf
6710: 28 7a 42 75 66 2c 20 22 7b 22 29 3b 0a 20 20 65  (zBuf, "{");.  e
6720: 78 70 72 54 6f 53 74 72 69 6e 67 28 70 45 78 70  xprToString(pExp
6730: 72 2d 3e 70 4c 65 66 74 2c 20 7a 42 75 66 29 3b  r->pLeft, zBuf);
6740: 0a 20 20 7a 42 75 66 20 2b 3d 20 73 74 72 6c 65  .  zBuf += strle
6750: 6e 28 7a 42 75 66 29 3b 0a 20 20 7a 42 75 66 20  n(zBuf);.  zBuf 
6760: 2b 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  += sprintf(zBuf,
6770: 20 22 7d 20 22 29 3b 0a 0a 20 20 7a 42 75 66 20   "} ");..  zBuf 
6780: 2b 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  += sprintf(zBuf,
6790: 20 22 7b 22 29 3b 0a 20 20 65 78 70 72 54 6f 53   "{");.  exprToS
67a0: 74 72 69 6e 67 28 70 45 78 70 72 2d 3e 70 52 69  tring(pExpr->pRi
67b0: 67 68 74 2c 20 7a 42 75 66 29 3b 0a 20 20 7a 42  ght, zBuf);.  zB
67c0: 75 66 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 42 75  uf += strlen(zBu
67d0: 66 29 3b 0a 20 20 7a 42 75 66 20 2b 3d 20 73 70  f);.  zBuf += sp
67e0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 7d 22 29  rintf(zBuf, "}")
67f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6800: 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
6810: 61 74 69 6f 6e 20 6f 66 20 61 20 73 63 61 6c 61  ation of a scala
6820: 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 75  r SQL function u
6830: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
6840: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
6850: 61 72 73 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  arser. It should
6860: 20 62 65 20 63 61 6c 6c 65 64 20 61 73 20 66 6f   be called as fo
6870: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66  llows:.**.**   f
6880: 74 73 33 5f 65 78 70 72 74 65 73 74 28 3c 74 6f  ts3_exprtest(<to
6890: 6b 65 6e 69 7a 65 72 3e 2c 20 3c 65 78 70 72 3e  kenizer>, <expr>
68a0: 2c 20 3c 63 6f 6c 75 6d 6e 20 31 3e 2c 20 2e 2e  , <column 1>, ..
68b0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  .);.**.** The fi
68c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 3c 74  rst argument, <t
68d0: 6f 6b 65 6e 69 7a 65 72 3e 2c 20 69 73 20 74 68  okenizer>, is th
68e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 74  e name of the ft
68f0: 73 33 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65  s3 tokenizer use
6900: 64 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20 74 68  d.** to parse th
6910: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
6920: 6f 6e 20 28 73 65 65 20 52 45 41 44 4d 45 2e 74  on (see README.t
6930: 6f 6b 65 6e 69 7a 65 72 73 29 2e 20 54 68 65 20  okenizers). The 
6940: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
6950: 2a 2a 20 69 73 20 74 68 65 20 71 75 65 72 79 20  ** is the query 
6960: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 70 61  expression to pa
6970: 72 73 65 2e 20 45 61 63 68 20 73 75 62 73 65 71  rse. Each subseq
6980: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 69 73  uent argument is
6990: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
69a0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
69b0: 66 74 73 33 20 74 61 62 6c 65 20 74 68 61 74 20  fts3 table that 
69c0: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
69d0: 73 69 6f 6e 20 6d 61 79 20 72 65 66 65 72 20 74  sion may refer t
69e0: 6f 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  o..** For exampl
69f0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6a00: 54 20 66 74 73 33 5f 65 78 70 72 74 65 73 74 28  T fts3_exprtest(
6a10: 27 73 69 6d 70 6c 65 27 2c 20 27 42 69 6c 6c 20  'simple', 'Bill 
6a20: 63 6f 6c 32 3a 42 6c 6f 67 67 73 27 2c 20 27 63  col2:Bloggs', 'c
6a30: 6f 6c 31 27 2c 20 27 63 6f 6c 32 27 29 3b 0a 2a  ol1', 'col2');.*
6a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6a50: 73 33 45 78 70 72 54 65 73 74 28 0a 20 20 73 71  s3ExprTest(.  sq
6a60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6a70: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6a80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6a90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6aa0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
6ab0: 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
6ac0: 70 4d 6f 64 75 6c 65 20 3d 20 30 3b 0a 20 20 73  pModule = 0;.  s
6ad0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
6ae0: 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 30   *pTokenizer = 0
6af0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
6b00: 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a  ar **azCol = 0;.
6b10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
6b20: 78 70 72 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  xpr;.  int nExpr
6b30: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
6b40: 69 6e 74 20 69 69 3b 0a 20 20 46 74 73 33 45 78  int ii;.  Fts3Ex
6b50: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 73 71 6c  pr *pExpr;.  sql
6b60: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
6b70: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
6b80: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a  ndle(context);..
6b90: 20 20 69 66 28 20 61 72 67 63 3c 33 20 29 7b 0a    if( argc<3 ){.
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6bb0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6bc0: 2c 20 0a 20 20 20 20 20 20 20 20 22 55 73 61 67  , .        "Usag
6bd0: 65 3a 20 66 74 73 33 5f 65 78 70 72 74 65 73 74  e: fts3_exprtest
6be0: 28 74 6f 6b 65 6e 69 7a 65 72 2c 20 65 78 70 72  (tokenizer, expr
6bf0: 2c 20 63 6f 6c 31 2c 20 2e 2e 2e 22 2c 20 2d 31  , col1, ...", -1
6c00: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
6c10: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rn;.  }..  rc = 
6c20: 71 75 65 72 79 54 65 73 74 54 6f 6b 65 6e 69 7a  queryTestTokeniz
6c30: 65 72 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  er(db,.         
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
6c60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6c70: 74 28 61 72 67 76 5b 30 5d 29 2c 20 26 70 4d 6f  t(argv[0]), &pMo
6c80: 64 75 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  dule);.  if( rc=
6c90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
6ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6cb0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6cc0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f  context);.    go
6cd0: 74 6f 20 65 78 70 72 74 65 73 74 5f 6f 75 74 3b  to exprtest_out;
6ce0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 4d  .  }else if( !pM
6cf0: 6f 64 75 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  odule ){.    sql
6d00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6d10: 72 28 63 6f 6e 74 65 78 74 2c 20 22 4e 6f 20 73  r(context, "No s
6d20: 75 63 68 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f  uch tokenizer mo
6d30: 64 75 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  dule", -1);.    
6d40: 67 6f 74 6f 20 65 78 70 72 74 65 73 74 5f 6f 75  goto exprtest_ou
6d50: 74 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  t;.  }..  rc = p
6d60: 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 28  Module->xCreate(
6d70: 30 2c 20 30 2c 20 26 70 54 6f 6b 65 6e 69 7a 65  0, 0, &pTokenize
6d80: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  r);.  assert( rc
6d90: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
6da0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
6db0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6dc0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
6dd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6de0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
6df0: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
6e00: 78 70 72 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d  xprtest_out;.  }
6e10: 0a 20 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70  .  pTokenizer->p
6e20: 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 75 6c 65  Module = pModule
6e30: 3b 0a 0a 20 20 7a 45 78 70 72 20 3d 20 28 63 6f  ;..  zExpr = (co
6e40: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
6e50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6e60: 67 76 5b 31 5d 29 3b 0a 20 20 6e 45 78 70 72 20  gv[1]);.  nExpr 
6e70: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6e80: 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a  bytes(argv[1]);.
6e90: 20 20 6e 43 6f 6c 20 3d 20 61 72 67 63 2d 32 3b    nCol = argc-2;
6ea0: 0a 20 20 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72  .  azCol = (char
6eb0: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   **)sqlite3_mall
6ec0: 6f 63 28 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63  oc(nCol*sizeof(c
6ed0: 68 61 72 20 2a 29 29 3b 0a 20 20 69 66 28 20 21  har *));.  if( !
6ee0: 61 7a 43 6f 6c 20 29 7b 0a 20 20 20 20 73 71 6c  azCol ){.    sql
6ef0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6f00: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
6f10: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 70 72 74  ;.    goto exprt
6f20: 65 73 74 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 66  est_out;.  }.  f
6f30: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 6f 6c  or(ii=0; ii<nCol
6f40: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61 7a 43  ; ii++){.    azC
6f50: 6f 6c 5b 69 69 5d 20 3d 20 28 63 68 61 72 20 2a  ol[ii] = (char *
6f60: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6f70: 65 78 74 28 61 72 67 76 5b 69 69 2b 32 5d 29 3b  ext(argv[ii+2]);
6f80: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
6f90: 69 74 65 33 46 74 73 33 45 78 70 72 50 61 72 73  ite3Fts3ExprPars
6fa0: 65 28 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69  e(.      pTokeni
6fb0: 7a 65 72 2c 20 61 7a 43 6f 6c 2c 20 6e 43 6f 6c  zer, azCol, nCol
6fc0: 2c 20 6e 43 6f 6c 2c 20 7a 45 78 70 72 2c 20 6e  , nCol, zExpr, n
6fd0: 45 78 70 72 2c 20 26 70 45 78 70 72 0a 20 20 29  Expr, &pExpr.  )
6fe0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6ff0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
7000: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7010: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
7020: 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  xt);.    goto ex
7030: 70 72 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d 65  prtest_out;.  }e
7040: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
7050: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61  TE_OK ){.    cha
7060: 72 20 7a 42 75 66 5b 34 30 39 36 5d 3b 0a 20 20  r zBuf[4096];.  
7070: 20 20 65 78 70 72 54 6f 53 74 72 69 6e 67 28 70    exprToString(p
7080: 45 78 70 72 2c 20 7a 42 75 66 29 3b 0a 20 20 20  Expr, zBuf);.   
7090: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
70a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
70b0: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
70c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
70d0: 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46 72  qlite3Fts3ExprFr
70e0: 65 65 28 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  ee(pExpr);.  }el
70f0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
7100: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
7110: 74 65 78 74 2c 20 22 45 72 72 6f 72 20 70 61 72  text, "Error par
7120: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 22  sing expression"
7130: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 65 78 70 72  , -1);.  }..expr
7140: 74 65 73 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20  test_out:.  if( 
7150: 70 4d 6f 64 75 6c 65 20 26 26 20 70 54 6f 6b 65  pModule && pToke
7160: 6e 69 7a 65 72 20 29 7b 0a 20 20 20 20 72 63 20  nizer ){.    rc 
7170: 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74  = pModule->xDest
7180: 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72 29 3b  roy(pTokenizer);
7190: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
71a0: 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f  ree(azCol);.}../
71b0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
71c0: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
71d0: 6f 6e 20 70 61 72 73 65 72 20 74 65 73 74 20 66  on parser test f
71e0: 75 6e 63 74 69 6f 6e 20 66 74 73 33 5f 65 78 70  unction fts3_exp
71f0: 72 74 65 73 74 28 29 20 0a 2a 2a 20 77 69 74 68  rtest() .** with
7200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7210: 74 69 6f 6e 20 64 62 2e 20 0a 2a 2f 0a 69 6e 74  tion db. .*/.int
7220: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
7230: 49 6e 69 74 54 65 73 74 49 6e 74 65 72 66 61 63  InitTestInterfac
7240: 65 28 73 71 6c 69 74 65 33 2a 20 64 62 29 7b 0a  e(sqlite3* db){.
7250: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
7280: 33 5f 65 78 70 72 74 65 73 74 22 2c 20 2d 31 2c  3_exprtest", -1,
7290: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
72a0: 20 66 74 73 33 45 78 70 72 54 65 73 74 2c 20 30   fts3ExprTest, 0
72b0: 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a 23 65 6e 64  , 0.  );.}..#end
72c0: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  if.#endif /* !de
72d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
72e0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
72f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
7300: 29 20 2a 2f 0a                                   ) */.