/ Hex Artifact Content
Login

Artifact 212548eb2dc50f8640fd0d6afb56d1c2aca59a73:


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 54 68 65 20 70 75 62 6c 69 63 20  ded. The public 
0270: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 69  interface to thi
0280: 73 20 6d 6f 64 75 6c 65 20 69 73 20 64 65 63 6c  s module is decl
0290: 61 72 65 64 20 69 6e 20 73 6f 75 72 63 65 0a 2a  ared in source.*
02a0: 2a 20 63 6f 64 65 20 66 69 6c 65 20 22 66 74 73  * code file "fts
02b0: 33 5f 65 78 70 72 2e 68 22 2e 0a 2a 2f 0a 23 69  3_expr.h"..*/.#i
02c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
02d0: 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
02e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
02f0: 5f 46 54 53 33 29 0a 0a 2f 2a 0a 2a 2a 20 42 79  _FTS3)../*.** By
0300: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6d   default, this m
0310: 6f 64 75 6c 65 20 70 61 72 73 65 73 20 74 68 65  odule parses the
0320: 20 6c 65 67 61 63 79 20 73 79 6e 74 61 78 20 74   legacy syntax t
0330: 68 61 74 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a  hat has been .**
0340: 20 74 72 61 64 69 74 69 6f 6e 61 6c 6c 79 20 75   traditionally u
0350: 73 65 64 20 62 79 20 66 74 73 33 2e 20 4f 72 2c  sed by fts3. Or,
0360: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
0370: 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 45 53  E_FTS3_PARENTHES
0380: 49 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  IS.** is defined
0390: 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73 20 74  , then it uses t
03a0: 68 65 20 6e 65 77 20 73 79 6e 74 61 78 2e 20 54  he new syntax. T
03b0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 62  he differences b
03c0: 65 74 77 65 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  etween.** the ne
03d0: 77 20 61 6e 64 20 74 68 65 20 6f 6c 64 20 73 79  w and the old sy
03e0: 6e 74 61 78 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ntaxes are:.**.*
03f0: 2a 20 20 61 29 20 54 68 65 20 6e 65 77 20 73 79  *  a) The new sy
0400: 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 70 61  ntax supports pa
0410: 72 65 6e 74 68 65 73 69 73 2e 20 54 68 65 20 6f  renthesis. The o
0420: 6c 64 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  ld does not..**.
0430: 2a 2a 20 20 62 29 20 54 68 65 20 6e 65 77 20 73  **  b) The new s
0440: 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 74  yntax supports t
0450: 68 65 20 41 4e 44 20 61 6e 64 20 4e 4f 54 20 6f  he AND and NOT o
0460: 70 65 72 61 74 6f 72 73 2e 20 54 68 65 20 6f 6c  perators. The ol
0470: 64 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a  d does not..**.*
0480: 2a 20 20 63 29 20 54 68 65 20 6f 6c 64 20 73 79  *  c) The old sy
0490: 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 74 68  ntax supports th
04a0: 65 20 22 2d 22 20 74 6f 6b 65 6e 20 71 75 61 6c  e "-" token qual
04b0: 69 66 69 65 72 2e 20 54 68 69 73 20 69 73 20 6e  ifier. This is n
04c0: 6f 74 20 0a 2a 2a 20 20 20 20 20 73 75 70 70 6f  ot .**     suppo
04d0: 72 74 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  rted by the new 
04e0: 73 79 6e 74 61 78 20 28 69 74 20 69 73 20 72 65  syntax (it is re
04f0: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 4e 4f  placed by the NO
0500: 54 20 6f 70 65 72 61 74 6f 72 29 2e 0a 2a 2a 0a  T operator)..**.
0510: 2a 2a 20 20 64 29 20 57 68 65 6e 20 75 73 69 6e  **  d) When usin
0520: 67 20 74 68 65 20 6f 6c 64 20 73 79 6e 74 61 78  g the old syntax
0530: 2c 20 74 68 65 20 4f 52 20 6f 70 65 72 61 74 6f  , the OR operato
0540: 72 20 68 61 73 20 61 20 67 72 65 61 74 65 72 20  r has a greater 
0550: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 20 20  precedence.**   
0560: 20 20 74 68 61 6e 20 61 6e 20 69 6d 70 6c 69 63    than an implic
0570: 69 74 20 41 4e 44 2e 20 57 68 65 6e 20 75 73 69  it AND. When usi
0580: 6e 67 20 74 68 65 20 6e 65 77 2c 20 62 6f 74 68  ng the new, both
0590: 20 69 6d 70 6c 69 63 69 74 79 20 61 6e 64 20 65   implicity and e
05a0: 78 70 6c 69 63 69 74 0a 2a 2a 20 20 20 20 20 41  xplicit.**     A
05b0: 4e 44 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76  ND operators hav
05c0: 65 20 61 20 68 69 67 68 65 72 20 70 72 65 63 65  e a higher prece
05d0: 64 65 6e 63 65 20 74 68 61 6e 20 4f 52 2e 0a 2a  dence than OR..*
05e0: 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
05f0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
0600: 54 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  T defined, then 
0610: 74 68 69 73 20 6d 6f 64 75 6c 65 20 65 78 70 6f  this module expo
0620: 72 74 73 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f  rts the.** symbo
0630: 6c 20 22 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  l "int sqlite3_f
0640: 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
0650: 74 68 65 73 65 73 22 2e 20 53 65 74 74 69 6e 67  theses". Setting
0660: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a   this variable.*
0670: 2a 20 74 6f 20 7a 65 72 6f 20 63 61 75 73 65 73  * to zero causes
0680: 20 74 68 65 20 6d 6f 64 75 6c 65 20 74 6f 20 75   the module to u
0690: 73 65 20 74 68 65 20 6f 6c 64 20 73 79 6e 74 61  se the old synta
06a0: 78 2e 20 49 66 20 69 74 20 69 73 20 73 65 74 20  x. If it is set 
06b0: 74 6f 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  to .** non-zero 
06c0: 74 68 65 20 6e 65 77 20 73 79 6e 74 61 78 20 69  the new syntax i
06d0: 73 20 61 63 74 69 76 61 74 65 64 2e 20 54 68 69  s activated. Thi
06e0: 73 20 69 73 20 73 6f 20 62 6f 74 68 20 73 79 6e  s is so both syn
06f0: 74 61 78 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  taxes can.** be 
0700: 74 65 73 74 65 64 20 75 73 69 6e 67 20 61 20 73  tested using a s
0710: 69 6e 67 6c 65 20 62 75 69 6c 64 20 6f 66 20 74  ingle build of t
0720: 65 73 74 66 69 78 74 75 72 65 2e 0a 2a 2f 0a 23  estfixture..*/.#
0730: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0740: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  T.int sqlite3_ft
0750: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
0760: 68 65 73 65 73 20 3d 20 30 3b 0a 23 65 6c 73 65  heses = 0;.#else
0770: 0a 23 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  .# ifdef SQLITE_
0780: 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45  ENABLE_FTS3_PARE
0790: 4e 54 48 45 53 49 53 20 0a 23 20 20 64 65 66 69  NTHESIS .#  defi
07a0: 6e 65 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  ne sqlite3_fts3_
07b0: 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
07c0: 65 73 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  es 1.# else.#  d
07d0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 66 74  efine sqlite3_ft
07e0: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
07f0: 68 65 73 65 73 20 30 0a 23 20 65 6e 64 69 66 0a  heses 0.# endif.
0800: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0810: 66 61 75 6c 74 20 73 70 61 6e 20 66 6f 72 20 4e  fault span for N
0820: 45 41 52 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  EAR operators..*
0830: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
0840: 5f 46 54 53 33 5f 44 45 46 41 55 4c 54 5f 4e 45  _FTS3_DEFAULT_NE
0850: 41 52 5f 50 41 52 41 4d 20 31 30 0a 0a 23 69 6e  AR_PARAM 10..#in
0860: 63 6c 75 64 65 20 22 66 74 73 33 5f 65 78 70 72  clude "fts3_expr
0870: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h".#include "sq
0880: 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64  lite3.h".#includ
0890: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
08a0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
08b0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
08c0: 2e 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .h>..typedef str
08d0: 75 63 74 20 50 61 72 73 65 43 6f 6e 74 65 78 74  uct ParseContext
08e0: 20 50 61 72 73 65 43 6f 6e 74 65 78 74 3b 0a 73   ParseContext;.s
08f0: 74 72 75 63 74 20 50 61 72 73 65 43 6f 6e 74 65  truct ParseConte
0900: 78 74 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  xt {.  sqlite3_t
0910: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
0920: 69 7a 65 72 3b 20 20 20 20 20 20 2f 2a 20 54 6f  izer;      /* To
0930: 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a  kenizer module *
0940: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0950: 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
0960: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
0970: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
0980: 20 66 6f 72 20 66 74 73 33 20 74 61 62 6c 65 20   for fts3 table 
0990: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
09c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
09d0: 20 61 7a 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 69 6e   azCol[] */.  in
09e0: 74 20 69 44 65 66 61 75 6c 74 43 6f 6c 3b 20 20  t iDefaultCol;  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 6f 6c    /* Default col
0a10: 75 6d 6e 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  umn to query */.
0a20: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0a30: 74 20 2a 70 43 74 78 3b 20 20 20 20 20 20 20 20  t *pCtx;        
0a40: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65        /* Write e
0a50: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72  rror message her
0a60: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 73 74  e */.  int nNest
0a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0a90: 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 62  mber of nested b
0aa0: 72 61 63 6b 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  rackets */.};../
0ab0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
0ac0: 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
0ad0: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
0ae0: 20 69 73 73 70 61 63 65 28 29 20 66 75 6e 63 74   isspace() funct
0af0: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion. .**.** The 
0b00: 73 74 61 6e 64 61 72 64 20 69 73 73 70 61 63 65  standard isspace
0b10: 28 29 20 63 61 6e 20 62 65 20 61 77 6b 77 61 72  () can be awkwar
0b20: 64 20 74 6f 20 75 73 65 20 73 61 66 65 6c 79 2c  d to use safely,
0b30: 20 62 65 63 61 75 73 65 20 61 6c 74 68 6f 75 67   because althoug
0b40: 68 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  h it.** is defin
0b50: 65 64 20 74 6f 20 61 63 63 65 70 74 20 61 6e 20  ed to accept an 
0b60: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
0b70: 20 69 6e 74 2c 20 69 74 73 20 62 65 68 61 76 69   int, its behavi
0b80: 6f 75 72 20 77 68 65 6e 20 70 61 73 73 65 64 0a  our when passed.
0b90: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  ** an integer th
0ba0: 61 74 20 66 61 6c 6c 73 20 6f 75 74 73 69 64 65  at falls outside
0bb0: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 6f 66   of the range of
0bc0: 20 74 68 65 20 75 6e 73 69 67 6e 65 64 20 63 68   the unsigned ch
0bd0: 61 72 20 74 79 70 65 0a 2a 2a 20 69 73 20 75 6e  ar type.** is un
0be0: 64 65 66 69 6e 65 64 20 28 61 6e 64 20 73 6f 6d  defined (and som
0bf0: 65 74 69 6d 65 73 2c 20 22 75 6e 64 65 66 69 6e  etimes, "undefin
0c00: 65 64 22 20 6d 65 61 6e 73 20 73 65 67 66 61 75  ed" means segfau
0c10: 6c 74 29 2e 20 54 68 69 73 20 77 72 61 70 70 65  lt). This wrappe
0c20: 72 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 20  r.** is defined 
0c30: 74 6f 20 61 63 63 65 70 74 20 61 6e 20 61 72 67  to accept an arg
0c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 63 68  ument of type ch
0c50: 61 72 2c 20 61 6e 64 20 61 6c 77 61 79 73 20 72  ar, and always r
0c60: 65 74 75 72 6e 73 20 30 20 66 6f 72 0a 2a 2a 20  eturns 0 for.** 
0c70: 61 6e 79 20 76 61 6c 75 65 73 20 74 68 61 74 20  any values that 
0c80: 66 61 6c 6c 20 6f 75 74 73 69 64 65 20 6f 66 20  fall outside of 
0c90: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65  the range of the
0ca0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
0cb0: 79 70 65 20 28 69 2e 65 2e 0a 2a 2a 20 6e 65 67  ype (i.e..** neg
0cc0: 61 74 69 76 65 20 76 61 6c 75 65 73 29 2e 0a 2a  ative values)..*
0cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
0ce0: 33 69 73 73 70 61 63 65 28 63 68 61 72 20 63 29  3isspace(char c)
0cf0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 26 30 78  {.  return (c&0x
0d00: 38 30 29 3d 3d 30 20 3f 20 69 73 73 70 61 63 65  80)==0 ? isspace
0d10: 28 63 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  (c) : 0;.}../*.*
0d20: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6e 65  * Extract the ne
0d30: 78 74 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 62 75  xt token from bu
0d40: 66 66 65 72 20 7a 20 28 6c 65 6e 67 74 68 20 6e  ffer z (length n
0d50: 29 20 75 73 69 6e 67 20 74 68 65 20 74 6f 6b 65  ) using the toke
0d60: 6e 69 7a 65 72 0a 2a 2a 20 61 6e 64 20 6f 74 68  nizer.** and oth
0d70: 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28  er information (
0d80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 74 63  column names etc
0d90: 2e 29 20 69 6e 20 70 50 61 72 73 65 2e 20 43 72  .) in pParse. Cr
0da0: 65 61 74 65 20 61 6e 20 46 74 73 33 45 78 70 72  eate an Fts3Expr
0db0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6f 66  .** structure of
0dc0: 20 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50   type FTSQUERY_P
0dd0: 48 52 41 53 45 20 63 6f 6e 74 61 69 6e 69 6e 67  HRASE containing
0de0: 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73 69 73   a phrase consis
0df0: 74 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ting of this.** 
0e00: 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 61 6e 64  single token and
0e10: 20 73 65 74 20 2a 70 70 45 78 70 72 20 74 6f 20   set *ppExpr to 
0e20: 70 6f 69 6e 74 20 74 6f 20 69 74 2e 20 49 66 20  point to it. If 
0e30: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
0e40: 75 66 66 65 72 20 69 73 0a 2a 2a 20 72 65 61 63  uffer is.** reac
0e50: 68 65 64 20 62 65 66 6f 72 65 20 61 20 74 6f 6b  hed before a tok
0e60: 65 6e 20 69 73 20 66 6f 75 6e 64 2c 20 73 65 74  en is found, set
0e70: 20 2a 70 70 45 78 70 72 20 74 6f 20 7a 65 72 6f   *ppExpr to zero
0e80: 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72  . It is the.** r
0e90: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
0ea0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
0eb0: 76 65 6e 74 75 61 6c 6c 79 20 64 65 61 6c 6c 6f  ventually deallo
0ec0: 63 61 74 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  cate the allocat
0ed0: 65 64 20 0a 2a 2a 20 46 74 73 33 45 78 70 72 20  ed .** Fts3Expr 
0ee0: 73 74 72 75 63 74 75 72 65 20 28 69 66 20 61 6e  structure (if an
0ef0: 79 29 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  y) by passing it
0f00: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
0f10: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ()..**.** Return
0f20: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
0f30: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 53 51 4c  ccessful, or SQL
0f40: 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
0f50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0f60: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
0f70: 61 74 69 63 20 69 6e 74 20 67 65 74 4e 65 78 74  atic int getNext
0f80: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 43 6f  Token(.  ParseCo
0f90: 6e 74 65 78 74 20 2a 70 50 61 72 73 65 2c 20 20  ntext *pParse,  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 2f 2a 20 66 74 73 33 20 71 75 65 72 79 20 70   /* fts3 query p
0fc0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
0fd0: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1000: 75 65 20 66 6f 72 20 46 74 73 33 50 68 72 61 73  ue for Fts3Phras
1010: 65 2e 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  e.iColumn */.  c
1020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1030: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
1040: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
1050: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33  string */.  Fts3
1060: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20  Expr **ppExpr,  
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70 72      /* OUT: expr
1090: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
10a0: 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20 20  *pnConsumed     
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
10d0: 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73  er of bytes cons
10e0: 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  umed */.){.  sql
10f0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
1100: 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 50 61  pTokenizer = pPa
1110: 72 73 65 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b  rse->pTokenizer;
1120: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
1130: 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
1140: 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f  t *pModule = pTo
1150: 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65  kenizer->pModule
1160: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
1170: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1180: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b  cursor *pCursor;
1190: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 65  .  Fts3Expr *pRe
11a0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43 6f  t = 0;.  int nCo
11b0: 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 0a 20 20 72  nsumed = 0;..  r
11c0: 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70  c = pModule->xOp
11d0: 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 7a  en(pTokenizer, z
11e0: 2c 20 6e 2c 20 26 70 43 75 72 73 6f 72 29 3b 0a  , n, &pCursor);.
11f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
1210: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b 0a 20   char *zToken;. 
1220: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69     int nToken, i
1230: 53 74 61 72 74 2c 20 69 45 6e 64 2c 20 69 50 6f  Start, iEnd, iPo
1240: 73 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  sition;.    int 
1250: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 2f 2a 20 74 6f 74 61 6c 20 73 70       /* total sp
1280: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
1290: 2a 2f 0a 0a 20 20 20 20 70 43 75 72 73 6f 72 2d  */..    pCursor-
12a0: 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54  >pTokenizer = pT
12b0: 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 72 63  okenizer;.    rc
12c0: 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78   = pModule->xNex
12d0: 74 28 70 43 75 72 73 6f 72 2c 20 26 7a 54 6f 6b  t(pCursor, &zTok
12e0: 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53  en, &nToken, &iS
12f0: 74 61 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50  tart, &iEnd, &iP
1300: 6f 73 69 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 69  osition);..    i
1310: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1320: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
1330: 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70  = sizeof(Fts3Exp
1340: 72 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33  r) + sizeof(Fts3
1350: 50 68 72 61 73 65 29 20 2b 20 6e 54 6f 6b 65 6e  Phrase) + nToken
1360: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28  ;.      pRet = (
1370: 46 74 73 33 45 78 70 72 20 2a 29 73 71 6c 69 74  Fts3Expr *)sqlit
1380: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
1390: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 52 65  ;.      if( !pRe
13a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
13b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
13e0: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
13f0: 20 20 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65       pRet->eType
1400: 20 3d 20 46 54 53 51 55 45 52 59 5f 50 48 52 41   = FTSQUERY_PHRA
1410: 53 45 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  SE;.        pRet
1420: 2d 3e 70 50 68 72 61 73 65 20 3d 20 28 46 74 73  ->pPhrase = (Fts
1430: 33 50 68 72 61 73 65 20 2a 29 26 70 52 65 74 5b  3Phrase *)&pRet[
1440: 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  1];.        pRet
1450: 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
1460: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
1470: 52 65 74 2d 3e 70 50 68 72 61 73 65 2d 3e 69 43  Ret->pPhrase->iC
1480: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
1490: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72        pRet->pPhr
14a0: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 6e  ase->aToken[0].n
14b0: 20 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20   = nToken;.     
14c0: 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61 73 65     pRet->pPhrase
14d0: 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 7a 20 3d 20  ->aToken[0].z = 
14e0: 28 63 68 61 72 20 2a 29 26 70 52 65 74 2d 3e 70  (char *)&pRet->p
14f0: 50 68 72 61 73 65 5b 31 5d 3b 0a 20 20 20 20 20  Phrase[1];.     
1500: 20 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e     memcpy(pRet->
1510: 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
1520: 30 5d 2e 7a 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  0].z, zToken, nT
1530: 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  oken);..        
1540: 69 66 28 20 69 45 6e 64 3c 6e 20 26 26 20 7a 5b  if( iEnd<n && z[
1550: 69 45 6e 64 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  iEnd]=='*' ){.  
1560: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 50          pRet->pP
1570: 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  hrase->aToken[0]
1580: 2e 69 73 50 72 65 66 69 78 20 3d 20 31 3b 0a 20  .isPrefix = 1;. 
1590: 20 20 20 20 20 20 20 20 20 69 45 6e 64 2b 2b 3b           iEnd++;
15a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15b0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
15c0: 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
15d0: 6e 74 68 65 73 65 73 20 26 26 20 69 53 74 61 72  ntheses && iStar
15e0: 74 3e 30 20 26 26 20 7a 5b 69 53 74 61 72 74 2d  t>0 && z[iStart-
15f0: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]=='-' ){.     
1600: 20 20 20 20 20 70 52 65 74 2d 3e 70 50 68 72 61       pRet->pPhra
1610: 73 65 2d 3e 69 73 4e 6f 74 20 3d 20 31 3b 0a 20  se->isNot = 1;. 
1620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1630: 0a 20 20 20 20 20 20 6e 43 6f 6e 73 75 6d 65 64  .      nConsumed
1640: 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20 7d 0a 0a   = iEnd;.    }..
1650: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
1660: 6f 73 65 28 70 43 75 72 73 6f 72 29 3b 0a 20 20  ose(pCursor);.  
1670: 7d 0a 20 20 0a 20 20 2a 70 6e 43 6f 6e 73 75 6d  }.  .  *pnConsum
1680: 65 64 20 3d 20 6e 43 6f 6e 73 75 6d 65 64 3b 0a  ed = nConsumed;.
1690: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 52 65 74    *ppExpr = pRet
16a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 6c 61 72 67 65  .../*.** Enlarge
16c0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
16d0: 74 69 6f 6e 2e 20 20 49 66 20 61 6e 20 6f 75 74  tion.  If an out
16e0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  -of-memory alloc
16f0: 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 0a 2a 2a  ation occurs,.**
1700: 20 74 68 65 6e 20 66 72 65 65 20 74 68 65 20 6f   then free the o
1710: 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ld allocation..*
1720: 2f 0a 76 6f 69 64 20 2a 66 74 73 33 52 65 61 6c  /.void *fts3Real
1730: 6c 6f 63 4f 72 46 72 65 65 28 76 6f 69 64 20 2a  locOrFree(void *
1740: 70 4f 72 69 67 2c 20 69 6e 74 20 6e 4e 65 77 29  pOrig, int nNew)
1750: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d  {.  void *pRet =
1760: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
1770: 28 70 4f 72 69 67 2c 20 6e 4e 65 77 29 3b 0a 20  (pOrig, nNew);. 
1780: 20 69 66 28 20 21 70 52 65 74 20 29 7b 0a 20 20   if( !pRet ){.  
1790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17a0: 4f 72 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Orig);.  }.  ret
17b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
17c0: 2a 2a 20 42 75 66 66 65 72 20 7a 49 6e 70 75 74  ** Buffer zInput
17d0: 2c 20 6c 65 6e 67 74 68 20 6e 49 6e 70 75 74 2c  , length nInput,
17e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
17f0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 71 75 6f 74  ntents of a quot
1800: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61  ed string.** tha
1810: 74 20 61 70 70 65 61 72 65 64 20 61 73 20 70 61  t appeared as pa
1820: 72 74 20 6f 66 20 61 6e 20 66 74 73 33 20 71 75  rt of an fts3 qu
1830: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ery expression. 
1840: 4e 65 69 74 68 65 72 20 71 75 6f 74 65 20 63 68  Neither quote ch
1850: 61 72 61 63 74 65 72 0a 2a 2a 20 69 73 20 69 6e  aracter.** is in
1860: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 62 75  cluded in the bu
1870: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
1880: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1890: 74 6f 6b 65 6e 69 7a 65 20 74 68 65 20 65 6e 74  tokenize the ent
18a0: 69 72 65 0a 2a 2a 20 69 6e 70 75 74 20 62 75 66  ire.** input buf
18b0: 66 65 72 20 61 6e 64 20 63 72 65 61 74 65 20 61  fer and create a
18c0: 6e 20 46 74 73 33 45 78 70 72 20 73 74 72 75 63  n Fts3Expr struc
18d0: 74 75 72 65 20 6f 66 20 74 79 70 65 20 46 54 53  ture of type FTS
18e0: 51 55 45 52 59 5f 50 48 52 41 53 45 20 0a 2a 2a  QUERY_PHRASE .**
18f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1900: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
1910: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
1920: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1930: 6e 65 64 20 61 6e 64 20 2a 70 70 45 78 70 72 20  ned and *ppExpr 
1940: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
1950: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  the.** allocated
1960: 20 46 74 73 33 45 78 70 72 20 73 74 72 75 63 74   Fts3Expr struct
1970: 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ure. Otherwise, 
1980: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
1990: 4d 45 4d 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  MEM (out of memo
19a0: 72 79 0a 2a 2a 20 65 72 72 6f 72 29 20 6f 72 20  ry.** error) or 
19b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 74 6f  SQLITE_ERROR (to
19c0: 6b 65 6e 69 7a 61 74 69 6f 6e 20 65 72 72 6f 72  kenization error
19d0: 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
19e0: 64 20 2a 70 70 45 78 70 72 20 73 65 74 0a 2a 2a  d *ppExpr set.**
19f0: 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
1a00: 20 69 6e 74 20 67 65 74 4e 65 78 74 53 74 72 69   int getNextStri
1a10: 6e 67 28 0a 20 20 50 61 72 73 65 43 6f 6e 74 65  ng(.  ParseConte
1a20: 78 74 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  xt *pParse,     
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 66 74 73 33 20 71 75 65 72 79 20 70 61 72 73   fts3 query pars
1a50: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
1a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75  onst char *zInpu
1a70: 74 2c 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20  t, int nInput,  
1a80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
1a90: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33  string */.  Fts3
1aa0: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 78 70 72      /* OUT: expr
1ad0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73  ession */.){.  s
1ae0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1af0: 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70   *pTokenizer = p
1b00: 50 61 72 73 65 2d 3e 70 54 6f 6b 65 6e 69 7a 65  Parse->pTokenize
1b10: 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  r;.  sqlite3_tok
1b20: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
1b30: 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  nst *pModule = p
1b40: 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75  Tokenizer->pModu
1b50: 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  le;.  int rc;.  
1b60: 46 74 73 33 45 78 70 72 20 2a 70 20 3d 20 30 3b  Fts3Expr *p = 0;
1b70: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
1b80: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75  izer_cursor *pCu
1b90: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  rsor = 0;.  char
1ba0: 20 2a 7a 54 65 6d 70 20 3d 20 30 3b 0a 20 20 69   *zTemp = 0;.  i
1bb0: 6e 74 20 6e 54 65 6d 70 20 3d 20 30 3b 0a 0a 20  nt nTemp = 0;.. 
1bc0: 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
1bd0: 4f 70 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c  Open(pTokenizer,
1be0: 20 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 2c   zInput, nInput,
1bf0: 20 26 70 43 75 72 73 6f 72 29 3b 0a 20 20 69 66   &pCursor);.  if
1c00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c10: 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
1c20: 20 20 20 70 43 75 72 73 6f 72 2d 3e 70 54 6f 6b     pCursor->pTok
1c30: 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69  enizer = pTokeni
1c40: 7a 65 72 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  zer;.    for(ii=
1c50: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1c60: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  ; ii++){.      c
1c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65  onst char *zToke
1c80: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  n;.      int nTo
1c90: 6b 65 6e 2c 20 69 42 65 67 69 6e 2c 20 69 45 6e  ken, iBegin, iEn
1ca0: 64 2c 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 72  d, iPos;.      r
1cb0: 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
1cc0: 78 74 28 70 43 75 72 73 6f 72 2c 20 26 7a 54 6f  xt(pCursor, &zTo
1cd0: 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69  ken, &nToken, &i
1ce0: 42 65 67 69 6e 2c 20 26 69 45 6e 64 2c 20 26 69  Begin, &iEnd, &i
1cf0: 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pos);.      if( 
1d00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
1d20: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
1d30: 45 78 70 72 29 20 2b 20 73 69 7a 65 6f 66 28 46  Expr) + sizeof(F
1d40: 74 73 33 50 68 72 61 73 65 29 3b 0a 20 20 20 20  ts3Phrase);.    
1d50: 20 20 20 20 70 20 3d 20 66 74 73 33 52 65 61 6c      p = fts3Real
1d60: 6c 6f 63 4f 72 46 72 65 65 28 70 2c 20 6e 42 79  locOrFree(p, nBy
1d70: 74 65 2b 69 69 2a 73 69 7a 65 6f 66 28 73 74 72  te+ii*sizeof(str
1d80: 75 63 74 20 50 68 72 61 73 65 54 6f 6b 65 6e 29  uct PhraseToken)
1d90: 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  );.        zTemp
1da0: 20 3d 20 66 74 73 33 52 65 61 6c 6c 6f 63 4f 72   = fts3ReallocOr
1db0: 46 72 65 65 28 7a 54 65 6d 70 2c 20 6e 54 65 6d  Free(zTemp, nTem
1dc0: 70 20 2b 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  p + nToken);.   
1dd0: 20 20 20 20 20 69 66 28 20 21 70 20 7c 7c 20 21       if( !p || !
1de0: 7a 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  zTemp ){.       
1df0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
1e00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e10: 20 20 69 66 28 20 69 69 3d 3d 30 20 29 7b 0a 20    if( ii==0 ){. 
1e20: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1e30: 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  p, 0, nByte);.  
1e40: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 68 72 61          p->pPhra
1e50: 73 65 20 3d 20 28 46 74 73 33 50 68 72 61 73 65  se = (Fts3Phrase
1e60: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20   *)&p[1];.      
1e70: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
1e80: 50 68 72 61 73 65 20 3d 20 28 46 74 73 33 50 68  Phrase = (Fts3Ph
1e90: 72 61 73 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  rase *)&p[1];.  
1ea0: 20 20 20 20 20 20 70 2d 3e 70 50 68 72 61 73 65        p->pPhrase
1eb0: 2d 3e 6e 54 6f 6b 65 6e 20 3d 20 69 69 2b 31 3b  ->nToken = ii+1;
1ec0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 68 72  .        p->pPhr
1ed0: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 69 5d 2e  ase->aToken[ii].
1ee0: 6e 20 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  n = nToken;.    
1ef0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
1f00: 70 5b 6e 54 65 6d 70 5d 2c 20 7a 54 6f 6b 65 6e  p[nTemp], zToken
1f10: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
1f20: 20 20 20 6e 54 65 6d 70 20 2b 3d 20 6e 54 6f 6b     nTemp += nTok
1f30: 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  en;.        if( 
1f40: 69 45 6e 64 3c 6e 49 6e 70 75 74 20 26 26 20 7a  iEnd<nInput && z
1f50: 49 6e 70 75 74 5b 69 45 6e 64 5d 3d 3d 27 2a 27  Input[iEnd]=='*'
1f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1f70: 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  >pPhrase->aToken
1f80: 5b 69 69 5d 2e 69 73 50 72 65 66 69 78 20 3d 20  [ii].isPrefix = 
1f90: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
1fb0: 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
1fc0: 69 5d 2e 69 73 50 72 65 66 69 78 20 3d 20 30 3b  i].isPrefix = 0;
1fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fe0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
1ff0: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43  odule->xClose(pC
2000: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 43 75 72  ursor);.    pCur
2010: 73 6f 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  sor = 0;.  }..  
2020: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
2030: 4f 4e 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ONE ){.    int j
2040: 6a 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  j;.    char *zNe
2050: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  w;.    int nNew 
2060: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  = 0;.    int nBy
2070: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
2080: 45 78 70 72 29 20 2b 20 73 69 7a 65 6f 66 28 46  Expr) + sizeof(F
2090: 74 73 33 50 68 72 61 73 65 29 3b 0a 20 20 20 20  ts3Phrase);.    
20a0: 6e 42 79 74 65 20 2b 3d 20 28 70 3f 28 70 2d 3e  nByte += (p?(p->
20b0: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2d  pPhrase->nToken-
20c0: 31 29 3a 30 29 20 2a 20 73 69 7a 65 6f 66 28 73  1):0) * sizeof(s
20d0: 74 72 75 63 74 20 50 68 72 61 73 65 54 6f 6b 65  truct PhraseToke
20e0: 6e 29 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 33  n);.    p = fts3
20f0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2c  ReallocOrFree(p,
2100: 20 6e 42 79 74 65 20 2b 20 6e 54 65 6d 70 29 3b   nByte + nTemp);
2110: 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20  .    if( !p ){. 
2120: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
2130: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2140: 7a 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a  zTemp ){.      z
2150: 4e 65 77 20 3d 20 26 28 28 28 63 68 61 72 20 2a  New = &(((char *
2160: 29 70 29 5b 6e 42 79 74 65 5d 29 3b 0a 20 20 20  )p)[nByte]);.   
2170: 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20     memcpy(zNew, 
2180: 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 29 3b 0a 20  zTemp, nTemp);. 
2190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79  memset(p, 0, nBy
21b0: 74 65 2b 6e 54 65 6d 70 29 3b 0a 20 20 20 20 7d  te+nTemp);.    }
21c0: 0a 20 20 20 20 70 2d 3e 70 50 68 72 61 73 65 20  .    p->pPhrase 
21d0: 3d 20 28 46 74 73 33 50 68 72 61 73 65 20 2a 29  = (Fts3Phrase *)
21e0: 26 70 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  &p[1];.    for(j
21f0: 6a 3d 30 3b 20 6a 6a 3c 70 2d 3e 70 50 68 72 61  j=0; jj<p->pPhra
2200: 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b  se->nToken; jj++
2210: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 68 72  ){.      p->pPhr
2220: 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e  ase->aToken[jj].
2230: 7a 20 3d 20 26 7a 4e 65 77 5b 6e 4e 65 77 5d 3b  z = &zNew[nNew];
2240: 0a 20 20 20 20 20 20 6e 4e 65 77 20 2b 3d 20 70  .      nNew += p
2250: 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  ->pPhrase->aToke
2260: 6e 5b 6a 6a 5d 2e 6e 3b 0a 20 20 20 20 7d 0a 20  n[jj].n;.    }. 
2270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2280: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 70 2d 3e 65  zTemp);.    p->e
2290: 54 79 70 65 20 3d 20 46 54 53 51 55 45 52 59 5f  Type = FTSQUERY_
22a0: 50 48 52 41 53 45 3b 0a 20 20 20 20 70 2d 3e 70  PHRASE;.    p->p
22b0: 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 20  Phrase->iColumn 
22c0: 3d 20 70 50 61 72 73 65 2d 3e 69 44 65 66 61 75  = pParse->iDefau
22d0: 6c 74 43 6f 6c 3b 0a 20 20 20 20 72 63 20 3d 20  ltCol;.    rc = 
22e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
22f0: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 3b 0a 20    *ppExpr = p;. 
2300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 6e 6f 5f 6d   return rc;.no_m
2310: 65 6d 3a 0a 0a 20 20 69 66 28 20 70 43 75 72 73  em:..  if( pCurs
2320: 6f 72 20 29 7b 0a 20 20 20 20 70 4d 6f 64 75 6c  or ){.    pModul
2330: 65 2d 3e 78 43 6c 6f 73 65 28 70 43 75 72 73 6f  e->xClose(pCurso
2340: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
2350: 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2370: 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 30 3b  ;.  *ppExpr = 0;
2380: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2390: 5f 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _NOMEM;.}../*.**
23a0: 20 46 75 6e 63 74 69 6f 6e 20 67 65 74 4e 65 78   Function getNex
23b0: 74 4e 6f 64 65 28 29 2c 20 77 68 69 63 68 20 69  tNode(), which i
23c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 66 74 73 33  s called by fts3
23d0: 45 78 70 72 50 61 72 73 65 28 29 2c 20 6d 61 79  ExprParse(), may
23e0: 20 69 74 73 65 6c 66 0a 2a 2a 20 63 61 6c 6c 20   itself.** call 
23f0: 66 74 73 33 45 78 70 72 50 61 72 73 65 28 29 2e  fts3ExprParse().
2400: 20 53 6f 20 74 68 69 73 20 66 6f 72 77 61 72 64   So this forward
2410: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20   declaration is 
2420: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
2430: 74 69 63 20 69 6e 74 20 66 74 73 33 45 78 70 72  tic int fts3Expr
2440: 50 61 72 73 65 28 50 61 72 73 65 43 6f 6e 74 65  Parse(ParseConte
2450: 78 74 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  xt *, const char
2460: 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33 45 78 70   *, int, Fts3Exp
2470: 72 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f  r **, int *);../
2480: 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20  *.** The output 
2490: 76 61 72 69 61 62 6c 65 20 2a 70 70 45 78 70 72  variable *ppExpr
24a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
24b0: 74 68 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  th an allocated 
24c0: 46 74 73 33 45 78 70 72 20 0a 2a 2a 20 73 74 72  Fts3Expr .** str
24d0: 75 63 74 75 72 65 2c 20 6f 72 20 73 65 74 20 74  ucture, or set t
24e0: 6f 20 30 20 69 66 20 74 68 65 20 65 6e 64 20 6f  o 0 if the end o
24f0: 66 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  f the input buff
2500: 65 72 20 69 73 20 72 65 61 63 68 65 64 2e 0a 2a  er is reached..*
2510: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 6e 20  *.** Returns an 
2520: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2530: 65 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  e. SQLITE_OK if 
2540: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
2550: 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  , SQLITE_NOMEM.*
2560: 2a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * if a malloc fa
2570: 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 6f 72  ilure occurs, or
2580: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2590: 20 61 20 70 61 72 73 65 20 65 72 72 6f 72 20 69   a parse error i
25a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
25b0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 52 52 4f  * If SQLITE_ERRO
25c0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 70  R is returned, p
25d0: 43 6f 6e 74 65 78 74 20 69 73 20 70 6f 70 75 6c  Context is popul
25e0: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
25f0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
2600: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4e 65 78  tatic int getNex
2610: 74 4e 6f 64 65 28 0a 20 20 50 61 72 73 65 43 6f  tNode(.  ParseCo
2620: 6e 74 65 78 74 20 2a 70 50 61 72 73 65 2c 20 20  ntext *pParse,  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 2f 2a 20 66 74 73 33 20 71 75 65 72 79 20 70   /* fts3 query p
2650: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2670: 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
2690: 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 46  ut string */.  F
26a0: 74 73 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72  ts3Expr **ppExpr
26b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65         /* OUT: e
26d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
26e0: 6e 74 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 20  nt *pnConsumed  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
2710: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
2720: 6f 6e 73 75 6d 65 64 20 2a 2f 0a 29 7b 0a 20 20  onsumed */.){.  
2730: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2740: 75 63 74 20 46 74 73 33 4b 65 79 77 6f 72 64 20  uct Fts3Keyword 
2750: 7b 0a 20 20 20 20 63 68 61 72 20 7a 5b 34 5d 3b  {.    char z[4];
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
2780: 65 79 77 6f 72 64 20 74 65 78 74 20 2a 2f 0a 20  eyword text */. 
2790: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
27a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
27b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
27c0: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
27d0: 64 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d */.    unsigne
27e0: 64 20 63 68 61 72 20 70 61 72 65 6e 4f 6e 6c 79  d char parenOnly
27f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2800: 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 6e 20  * Only valid in 
2810: 70 61 72 65 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  paren mode */.  
2820: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2830: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
2840: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f          /* Keywo
2850: 72 64 20 63 6f 64 65 20 2a 2f 0a 20 20 7d 20 61  rd code */.  } a
2860: 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20  Keyword[] = {.  
2870: 20 20 7b 20 22 4f 52 22 20 2c 20 20 32 2c 20 30    { "OR" ,  2, 0
2880: 2c 20 46 54 53 51 55 45 52 59 5f 4f 52 20 20 20  , FTSQUERY_OR   
2890: 7d 2c 0a 20 20 20 20 7b 20 22 41 4e 44 22 2c 20  },.    { "AND", 
28a0: 20 33 2c 20 31 2c 20 46 54 53 51 55 45 52 59 5f   3, 1, FTSQUERY_
28b0: 41 4e 44 20 20 7d 2c 0a 20 20 20 20 7b 20 22 4e  AND  },.    { "N
28c0: 4f 54 22 2c 20 20 33 2c 20 31 2c 20 46 54 53 51  OT",  3, 1, FTSQ
28d0: 55 45 52 59 5f 4e 4f 54 20 20 7d 2c 0a 20 20 20  UERY_NOT  },.   
28e0: 20 7b 20 22 4e 45 41 52 22 2c 20 34 2c 20 30 2c   { "NEAR", 4, 0,
28f0: 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7d   FTSQUERY_NEAR }
2900: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  .  };.  int ii;.
2910: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
2920: 74 20 69 43 6f 6c 4c 65 6e 3b 0a 20 20 69 6e 74  t iColLen;.  int
2930: 20 72 63 3b 0a 20 20 46 74 73 33 45 78 70 72 20   rc;.  Fts3Expr 
2940: 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20 63 6f  *pRet = 0;..  co
2950: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75 74  nst char *zInput
2960: 20 3d 20 7a 3b 0a 20 20 69 6e 74 20 6e 49 6e 70   = z;.  int nInp
2970: 75 74 20 3d 20 6e 3b 0a 0a 20 20 2f 2a 20 53 6b  ut = n;..  /* Sk
2980: 69 70 20 6f 76 65 72 20 61 6e 79 20 77 68 69 74  ip over any whit
2990: 65 73 70 61 63 65 20 62 65 66 6f 72 65 20 63 68  espace before ch
29a0: 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 6b 65 79  ecking for a key
29b0: 77 6f 72 64 2c 20 61 6e 20 6f 70 65 6e 20 6f 72  word, an open or
29c0: 0a 20 20 2a 2a 20 63 6c 6f 73 65 20 62 72 61 63  .  ** close brac
29d0: 6b 65 74 2c 20 6f 72 20 61 20 71 75 6f 74 65 64  ket, or a quoted
29e0: 20 73 74 72 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20   string. .  */. 
29f0: 20 77 68 69 6c 65 28 20 6e 49 6e 70 75 74 3e 30   while( nInput>0
2a00: 20 26 26 20 66 74 73 33 69 73 73 70 61 63 65 28   && fts3isspace(
2a10: 2a 7a 49 6e 70 75 74 29 20 29 7b 0a 20 20 20 20  *zInput) ){.    
2a20: 6e 49 6e 70 75 74 2d 2d 3b 0a 20 20 20 20 7a 49  nInput--;.    zI
2a30: 6e 70 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  nput++;.  }.  if
2a40: 28 20 6e 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20  ( nInput==0 ){. 
2a50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a60: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _DONE;.  }..  /*
2a70: 20 53 65 65 20 69 66 20 77 65 20 61 72 65 20 64   See if we are d
2a80: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 6b 65  ealing with a ke
2a90: 79 77 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  yword. */.  for(
2aa0: 69 69 3d 30 3b 20 69 69 3c 28 69 6e 74 29 28 73  ii=0; ii<(int)(s
2ab0: 69 7a 65 6f 66 28 61 4b 65 79 77 6f 72 64 29 2f  izeof(aKeyword)/
2ac0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74  sizeof(struct Ft
2ad0: 73 33 4b 65 79 77 6f 72 64 29 29 3b 20 69 69 2b  s3Keyword)); ii+
2ae0: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74  +){.    const st
2af0: 72 75 63 74 20 46 74 73 33 4b 65 79 77 6f 72 64  ruct Fts3Keyword
2b00: 20 2a 70 4b 65 79 20 3d 20 26 61 4b 65 79 77 6f   *pKey = &aKeywo
2b10: 72 64 5b 69 69 5d 3b 0a 0a 20 20 20 20 69 66 28  rd[ii];..    if(
2b20: 20 28 70 4b 65 79 2d 3e 70 61 72 65 6e 4f 6e 6c   (pKey->parenOnl
2b30: 79 20 26 20 7e 73 71 6c 69 74 65 33 5f 66 74 73  y & ~sqlite3_fts
2b40: 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
2b50: 65 73 65 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  eses)!=0 ){.    
2b60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2b70: 7d 0a 0a 20 20 20 20 69 66 28 20 6e 49 6e 70 75  }..    if( nInpu
2b80: 74 3e 3d 70 4b 65 79 2d 3e 6e 20 26 26 20 30 3d  t>=pKey->n && 0=
2b90: 3d 6d 65 6d 63 6d 70 28 7a 49 6e 70 75 74 2c 20  =memcmp(zInput, 
2ba0: 70 4b 65 79 2d 3e 7a 2c 20 70 4b 65 79 2d 3e 6e  pKey->z, pKey->n
2bb0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ) ){.      int n
2bc0: 4e 65 61 72 20 3d 20 53 51 4c 49 54 45 5f 46 54  Near = SQLITE_FT
2bd0: 53 33 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52 5f  S3_DEFAULT_NEAR_
2be0: 50 41 52 41 4d 3b 0a 20 20 20 20 20 20 69 6e 74  PARAM;.      int
2bf0: 20 6e 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 6e 3b   nKey = pKey->n;
2c00: 0a 20 20 20 20 20 20 63 68 61 72 20 63 4e 65 78  .      char cNex
2c10: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  t;..      /* If 
2c20: 74 68 69 73 20 69 73 20 61 20 22 4e 45 41 52 22  this is a "NEAR"
2c30: 20 6b 65 79 77 6f 72 64 2c 20 63 68 65 63 6b 20   keyword, check 
2c40: 66 6f 72 20 61 6e 20 65 78 70 6c 69 63 69 74 20  for an explicit 
2c50: 6e 65 61 72 6e 65 73 73 2e 20 2a 2f 0a 20 20 20  nearness. */.   
2c60: 20 20 20 69 66 28 20 70 4b 65 79 2d 3e 65 54 79     if( pKey->eTy
2c70: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
2c80: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  R ){.        ass
2c90: 65 72 74 28 20 6e 4b 65 79 3d 3d 34 20 29 3b 0a  ert( nKey==4 );.
2ca0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 70          if( zInp
2cb0: 75 74 5b 34 5d 3d 3d 27 2f 27 20 26 26 20 7a 49  ut[4]=='/' && zI
2cc0: 6e 70 75 74 5b 35 5d 3e 3d 27 30 27 20 26 26 20  nput[5]>='0' && 
2cd0: 7a 49 6e 70 75 74 5b 35 5d 3c 3d 27 39 27 20 29  zInput[5]<='9' )
2ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 61  {.          nNea
2cf0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
2d00: 20 66 6f 72 28 6e 4b 65 79 3d 35 3b 20 7a 49 6e   for(nKey=5; zIn
2d10: 70 75 74 5b 6e 4b 65 79 5d 3e 3d 27 30 27 20 26  put[nKey]>='0' &
2d20: 26 20 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 3c 3d  & zInput[nKey]<=
2d30: 27 39 27 3b 20 6e 4b 65 79 2b 2b 29 7b 0a 20 20  '9'; nKey++){.  
2d40: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 61 72 20            nNear 
2d50: 3d 20 6e 4e 65 61 72 20 2a 20 31 30 20 2b 20 28  = nNear * 10 + (
2d60: 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 20 2d 20 27  zInput[nKey] - '
2d70: 30 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0');.          }
2d80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   }..      /* At 
2da0: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 69 73 20  this point this 
2db0: 69 73 20 70 72 6f 62 61 62 6c 79 20 61 20 6b 65  is probably a ke
2dc0: 79 77 6f 72 64 2e 20 42 75 74 20 66 6f 72 20 74  yword. But for t
2dd0: 68 61 74 20 74 6f 20 62 65 20 74 72 75 65 2c 0a  hat to be true,.
2de0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78        ** the nex
2df0: 74 20 62 79 74 65 20 6d 75 73 74 20 63 6f 6e 74  t byte must cont
2e00: 61 69 6e 20 65 69 74 68 65 72 20 77 68 69 74 65  ain either white
2e10: 73 70 61 63 65 2c 20 61 6e 20 6f 70 65 6e 20 6f  space, an open o
2e20: 72 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a  r close.      **
2e30: 20 70 61 72 65 6e 74 68 65 73 69 73 2c 20 61 20   parenthesis, a 
2e40: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c  quote character,
2e50: 20 6f 72 20 45 4f 46 2e 20 0a 20 20 20 20 20 20   or EOF. .      
2e60: 2a 2f 0a 20 20 20 20 20 20 63 4e 65 78 74 20 3d  */.      cNext =
2e70: 20 7a 49 6e 70 75 74 5b 6e 4b 65 79 5d 3b 0a 20   zInput[nKey];. 
2e80: 20 20 20 20 20 69 66 28 20 66 74 73 33 69 73 73       if( fts3iss
2e90: 70 61 63 65 28 63 4e 65 78 74 29 20 0a 20 20 20  pace(cNext) .   
2ea0: 20 20 20 20 7c 7c 20 63 4e 65 78 74 3d 3d 27 22      || cNext=='"
2eb0: 27 20 7c 7c 20 63 4e 65 78 74 3d 3d 27 28 27 20  ' || cNext=='(' 
2ec0: 7c 7c 20 63 4e 65 78 74 3d 3d 27 29 27 20 7c 7c  || cNext==')' ||
2ed0: 20 63 4e 65 78 74 3d 3d 30 0a 20 20 20 20 20 20   cNext==0.      
2ee0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  ){.        pRet 
2ef0: 3d 20 28 46 74 73 33 45 78 70 72 20 2a 29 73 71  = (Fts3Expr *)sq
2f00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2f10: 65 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b 0a  eof(Fts3Expr));.
2f20: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
2f30: 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Ret, 0, sizeof(F
2f40: 74 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20 20  ts3Expr));.     
2f50: 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d     pRet->eType =
2f60: 20 70 4b 65 79 2d 3e 65 54 79 70 65 3b 0a 20 20   pKey->eType;.  
2f70: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 4e 65 61        pRet->nNea
2f80: 72 20 3d 20 6e 4e 65 61 72 3b 0a 20 20 20 20 20  r = nNear;.     
2f90: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 52 65     *ppExpr = pRe
2fa0: 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 43 6f  t;.        *pnCo
2fb0: 6e 73 75 6d 65 64 20 3d 20 28 7a 49 6e 70 75 74  nsumed = (zInput
2fc0: 20 2d 20 7a 29 20 2b 20 6e 4b 65 79 3b 0a 20 20   - z) + nKey;.  
2fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fe0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2ff0: 0a 20 20 20 20 20 20 2f 2a 20 54 75 72 6e 73 20  .      /* Turns 
3000: 6f 75 74 20 74 68 61 74 20 77 61 73 6e 27 74 20  out that wasn't 
3010: 61 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72 20  a keyword after 
3020: 61 6c 6c 2e 20 54 68 69 73 20 68 61 70 70 65 6e  all. This happen
3030: 73 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s if the.      *
3040: 2a 20 75 73 65 72 20 68 61 73 20 73 75 70 70 6c  * user has suppl
3050: 69 65 64 20 61 20 74 6f 6b 65 6e 20 73 75 63 68  ied a token such
3060: 20 61 73 20 22 4f 52 61 63 6c 65 22 2e 20 43 6f   as "ORacle". Co
3070: 6e 74 69 6e 75 65 2e 0a 20 20 20 20 20 20 2a 2f  ntinue..      */
3080: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3090: 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 20 6f 70   Check for an op
30a0: 65 6e 20 62 72 61 63 6b 65 74 2e 20 2a 2f 0a 20  en bracket. */. 
30b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 74 73   if( sqlite3_fts
30c0: 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
30d0: 65 73 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20  eses ){.    if( 
30e0: 2a 7a 49 6e 70 75 74 3d 3d 27 28 27 20 29 7b 0a  *zInput=='(' ){.
30f0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 75        int nConsu
3100: 6d 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  med;.      int r
3110: 63 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  c;.      pParse-
3120: 3e 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20  >nNest++;.      
3130: 72 63 20 3d 20 66 74 73 33 45 78 70 72 50 61 72  rc = fts3ExprPar
3140: 73 65 28 70 50 61 72 73 65 2c 20 26 7a 49 6e 70  se(pParse, &zInp
3150: 75 74 5b 31 5d 2c 20 6e 49 6e 70 75 74 2d 31 2c  ut[1], nInput-1,
3160: 20 70 70 45 78 70 72 2c 20 26 6e 43 6f 6e 73 75   ppExpr, &nConsu
3170: 6d 65 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  med);.      if( 
3180: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3190: 20 21 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20   !*ppExpr ){.   
31a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31b0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
31c0: 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64       *pnConsumed
31d0: 20 3d 20 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20   = (zInput - z) 
31e0: 2b 20 31 20 2b 20 6e 43 6f 6e 73 75 6d 65 64 3b  + 1 + nConsumed;
31f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
3200: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
3210: 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 63 6c  * Check for a cl
3220: 6f 73 65 20 62 72 61 63 6b 65 74 2e 20 2a 2f 0a  ose bracket. */.
3230: 20 20 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d      if( *zInput=
3240: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 70 50  =')' ){.      pP
3250: 61 72 73 65 2d 3e 6e 4e 65 73 74 2d 2d 3b 0a 20  arse->nNest--;. 
3260: 20 20 20 20 20 2a 70 6e 43 6f 6e 73 75 6d 65 64       *pnConsumed
3270: 20 3d 20 28 7a 49 6e 70 75 74 20 2d 20 7a 29 20   = (zInput - z) 
3280: 2b 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  + 1;.      retur
3290: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
32a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
32b0: 65 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ee if we are dea
32c0: 6c 69 6e 67 20 77 69 74 68 20 61 20 71 75 6f 74  ling with a quot
32d0: 65 64 20 70 68 72 61 73 65 2e 20 49 66 20 74 68  ed phrase. If th
32e0: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
32f0: 74 68 65 6e 0a 20 20 2a 2a 20 73 65 61 72 63 68  then.  ** search
3300: 20 66 6f 72 20 74 68 65 20 63 6c 6f 73 69 6e 67   for the closing
3310: 20 71 75 6f 74 65 20 61 6e 64 20 70 61 73 73 20   quote and pass 
3320: 74 68 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67  the whole string
3330: 20 74 6f 20 67 65 74 4e 65 78 74 53 74 72 69 6e   to getNextStrin
3340: 67 28 29 0a 20 20 2a 2a 20 66 6f 72 20 70 72 6f  g().  ** for pro
3350: 63 65 73 73 69 6e 67 2e 20 54 68 69 73 20 69 73  cessing. This is
3360: 20 65 61 73 79 20 74 6f 20 64 6f 2c 20 61 73 20   easy to do, as 
3370: 66 74 73 33 20 68 61 73 20 6e 6f 20 73 79 6e 74  fts3 has no synt
3380: 61 78 20 66 6f 72 20 65 73 63 61 70 69 6e 67 0a  ax for escaping.
3390: 20 20 2a 2a 20 61 20 71 75 6f 74 65 20 63 68 61    ** a quote cha
33a0: 72 61 63 74 65 72 20 65 6d 62 65 64 64 65 64 20  racter embedded 
33b0: 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 20 20 2a  in a string..  *
33c0: 2f 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d  /.  if( *zInput=
33d0: 3d 27 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28  ='"' ){.    for(
33e0: 69 69 3d 31 3b 20 69 69 3c 6e 49 6e 70 75 74 20  ii=1; ii<nInput 
33f0: 26 26 20 7a 49 6e 70 75 74 5b 69 69 5d 21 3d 27  && zInput[ii]!='
3400: 22 27 3b 20 69 69 2b 2b 29 3b 0a 20 20 20 20 2a  "'; ii++);.    *
3410: 70 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 28 7a 49  pnConsumed = (zI
3420: 6e 70 75 74 20 2d 20 7a 29 20 2b 20 69 69 20 2b  nput - z) + ii +
3430: 20 31 3b 0a 20 20 20 20 69 66 28 20 69 69 3d 3d   1;.    if( ii==
3440: 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
3450: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
3460: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
3470: 65 74 75 72 6e 20 67 65 74 4e 65 78 74 53 74 72  eturn getNextStr
3480: 69 6e 67 28 70 50 61 72 73 65 2c 20 26 7a 49 6e  ing(pParse, &zIn
3490: 70 75 74 5b 31 5d 2c 20 69 69 2d 31 2c 20 70 70  put[1], ii-1, pp
34a0: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  Expr);.  }...  /
34b0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
34c0: 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
34d0: 2c 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61  , this must be a
34e0: 20 72 65 67 75 6c 61 72 20 74 6f 6b 65 6e 2c 20   regular token, 
34f0: 6f 72 20 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64  or .  ** the end
3500: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 2e 20 52   of the input. R
3510: 65 61 64 20 61 20 72 65 67 75 6c 61 72 20 74 6f  ead a regular to
3520: 6b 65 6e 20 75 73 69 6e 67 20 74 68 65 20 73 71  ken using the sq
3530: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 0a  lite3_tokenizer.
3540: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20    ** interface. 
3550: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c  Before doing so,
3560: 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20 74   figure out if t
3570: 68 65 72 65 20 69 73 20 61 6e 20 65 78 70 6c 69  here is an expli
3580: 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  cit.  ** column 
3590: 73 70 65 63 69 66 69 65 72 20 66 6f 72 20 74 68  specifier for th
35a0: 65 20 74 6f 6b 65 6e 2e 20 0a 20 20 2a 2a 0a 20  e token. .  **. 
35b0: 20 2a 2a 20 54 4f 44 4f 3a 20 53 74 72 61 6e 67   ** TODO: Strang
35c0: 65 6c 79 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  ely, it is not p
35d0: 6f 73 73 69 62 6c 65 20 74 6f 20 61 73 73 6f 63  ossible to assoc
35e0: 69 61 74 65 20 61 20 63 6f 6c 75 6d 6e 20 73 70  iate a column sp
35f0: 65 63 69 66 69 65 72 0a 20 20 2a 2a 20 77 69 74  ecifier.  ** wit
3600: 68 20 61 20 71 75 6f 74 65 64 20 70 68 72 61 73  h a quoted phras
3610: 65 2c 20 6f 6e 6c 79 20 77 69 74 68 20 61 20 73  e, only with a s
3620: 69 6e 67 6c 65 20 74 6f 6b 65 6e 2e 20 4e 6f 74  ingle token. Not
3630: 20 73 75 72 65 20 69 66 20 74 68 69 73 20 77 61   sure if this wa
3640: 73 0a 20 20 2a 2a 20 61 6e 20 69 6d 70 6c 65 6d  s.  ** an implem
3650: 65 6e 74 61 74 69 6f 6e 20 61 72 74 69 66 61 63  entation artifac
3660: 74 20 6f 72 20 61 6e 20 69 6e 74 65 6e 74 69 6f  t or an intentio
3670: 6e 61 6c 20 64 65 63 69 73 69 6f 6e 20 77 68 65  nal decision whe
3680: 6e 20 66 74 73 33 20 77 61 73 0a 20 20 2a 2a 20  n fts3 was.  ** 
3690: 66 69 72 73 74 20 69 6d 70 6c 65 6d 65 6e 74 65  first implemente
36a0: 64 2e 20 57 68 69 63 68 65 76 65 72 20 69 74 20  d. Whichever it 
36b0: 77 61 73 2c 20 74 68 69 73 20 6d 6f 64 75 6c 65  was, this module
36c0: 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 65 20   duplicates the 
36d0: 0a 20 20 2a 2a 20 6c 69 6d 69 74 61 74 69 6f 6e  .  ** limitation
36e0: 2e 0a 20 20 2a 2f 0a 20 20 69 43 6f 6c 20 3d 20  ..  */.  iCol = 
36f0: 70 50 61 72 73 65 2d 3e 69 44 65 66 61 75 6c 74  pParse->iDefault
3700: 43 6f 6c 3b 0a 20 20 69 43 6f 6c 4c 65 6e 20 3d  Col;.  iColLen =
3710: 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
3720: 69 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 3b  ii<pParse->nCol;
3730: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73   ii++){.    cons
3740: 74 20 63 68 61 72 20 2a 7a 53 74 72 20 3d 20 70  t char *zStr = p
3750: 50 61 72 73 65 2d 3e 61 7a 43 6f 6c 5b 69 69 5d  Parse->azCol[ii]
3760: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d  ;.    int nStr =
3770: 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0a 20   strlen(zStr);. 
3780: 20 20 20 69 66 28 20 6e 49 6e 70 75 74 3e 6e 53     if( nInput>nS
3790: 74 72 20 26 26 20 7a 49 6e 70 75 74 5b 6e 53 74  tr && zInput[nSt
37a0: 72 5d 3d 3d 27 3a 27 20 26 26 20 6d 65 6d 63 6d  r]==':' && memcm
37b0: 70 28 7a 53 74 72 2c 20 7a 49 6e 70 75 74 2c 20  p(zStr, zInput, 
37c0: 6e 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nStr)==0 ){.    
37d0: 20 20 69 43 6f 6c 20 3d 20 69 69 3b 0a 20 20 20    iCol = ii;.   
37e0: 20 20 20 69 43 6f 6c 4c 65 6e 20 3d 20 28 28 7a     iColLen = ((z
37f0: 49 6e 70 75 74 20 2d 20 7a 29 20 2b 20 6e 53 74  Input - z) + nSt
3800: 72 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 62 72  r + 1);.      br
3810: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3820: 20 72 63 20 3d 20 67 65 74 4e 65 78 74 54 6f 6b   rc = getNextTok
3830: 65 6e 28 70 50 61 72 73 65 2c 20 69 43 6f 6c 2c  en(pParse, iCol,
3840: 20 26 7a 5b 69 43 6f 6c 4c 65 6e 5d 2c 20 6e 2d   &z[iColLen], n-
3850: 69 43 6f 6c 4c 65 6e 2c 20 70 70 45 78 70 72 2c  iColLen, ppExpr,
3860: 20 70 6e 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20   pnConsumed);.  
3870: 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 2b 3d 20 69  *pnConsumed += i
3880: 43 6f 6c 4c 65 6e 3b 0a 20 20 72 65 74 75 72 6e  ColLen;.  return
3890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
38a0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
38b0: 20 46 74 73 33 45 78 70 72 20 73 74 72 75 63 74   Fts3Expr struct
38c0: 75 72 65 20 66 6f 72 20 61 20 62 69 6e 61 72 79  ure for a binary
38d0: 20 6f 70 65 72 61 74 6f 72 20 28 61 6e 79 20 74   operator (any t
38e0: 79 70 65 0a 2a 2a 20 65 78 63 65 70 74 20 61 6e  ype.** except an
38f0: 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
3900: 29 2e 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ). Return an int
3910: 65 67 65 72 20 76 61 6c 75 65 20 72 65 70 72 65  eger value repre
3920: 73 65 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 70  senting the.** p
3930: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65  recedence of the
3940: 20 6f 70 65 72 61 74 6f 72 2e 20 4c 6f 77 65 72   operator. Lower
3950: 20 76 61 6c 75 65 73 20 68 61 76 65 20 61 20 68   values have a h
3960: 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65  igher precedence
3970: 20 28 69 2e 65 2e 0a 2a 2a 20 67 72 6f 75 70 20   (i.e..** group 
3980: 6d 6f 72 65 20 74 69 67 68 74 6c 79 29 2e 20 46  more tightly). F
3990: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
39a0: 68 65 20 43 20 6c 61 6e 67 75 61 67 65 2c 20 74  he C language, t
39b0: 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 0a 2a  he == operator.*
39c0: 2a 20 67 72 6f 75 70 73 20 6d 6f 72 65 20 74 69  * groups more ti
39d0: 67 68 74 6c 79 20 74 68 61 6e 20 7c 7c 2c 20 61  ghtly than ||, a
39e0: 6e 64 20 77 6f 75 6c 64 20 74 68 65 72 65 66 6f  nd would therefo
39f0: 72 65 20 68 61 76 65 20 61 20 68 69 67 68 65 72  re have a higher
3a00: 20 70 72 65 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a   precedence..**.
3a10: 2a 2a 20 57 68 65 6e 20 75 73 69 6e 67 20 74 68  ** When using th
3a20: 65 20 6e 65 77 20 66 74 73 33 20 71 75 65 72 79  e new fts3 query
3a30: 20 73 79 6e 74 61 78 20 28 77 68 65 6e 20 53 51   syntax (when SQ
3a40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
3a50: 5f 50 41 52 45 4e 54 48 45 53 49 53 0a 2a 2a 20  _PARENTHESIS.** 
3a60: 69 73 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  is defined), the
3a70: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 6f 70   order of the op
3a80: 65 72 61 74 6f 72 73 20 69 6e 20 70 72 65 63 65  erators in prece
3a90: 64 65 6e 63 65 20 66 72 6f 6d 20 68 69 67 68 65  dence from highe
3aa0: 73 74 20 74 6f 0a 2a 2a 20 6c 6f 77 65 73 74 20  st to.** lowest 
3ab0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4e 45 41 52  is:.**.**   NEAR
3ac0: 0a 2a 2a 20 20 20 4e 4f 54 0a 2a 2a 20 20 20 41  .**   NOT.**   A
3ad0: 4e 44 20 28 69 6e 63 6c 75 64 69 6e 67 20 69 6d  ND (including im
3ae0: 70 6c 69 63 69 74 20 41 4e 44 73 29 0a 2a 2a 20  plicit ANDs).** 
3af0: 20 20 4f 52 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20    OR.**.** Note 
3b00: 74 68 61 74 20 77 68 65 6e 20 75 73 69 6e 67 20  that when using 
3b10: 74 68 65 20 6f 6c 64 20 71 75 65 72 79 20 73 79  the old query sy
3b20: 6e 74 61 78 2c 20 74 68 65 20 4f 52 20 6f 70 65  ntax, the OR ope
3b30: 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67 68  rator has a high
3b40: 65 72 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  er.** precedence
3b50: 20 74 68 61 6e 20 74 68 65 20 41 4e 44 20 6f 70   than the AND op
3b60: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
3b70: 63 20 69 6e 74 20 6f 70 50 72 65 63 65 64 65 6e  c int opPreceden
3b80: 63 65 28 46 74 73 33 45 78 70 72 20 2a 70 29 7b  ce(Fts3Expr *p){
3b90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 54  .  assert( p->eT
3ba0: 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 50 48  ype!=FTSQUERY_PH
3bb0: 52 41 53 45 20 29 3b 0a 20 20 69 66 28 20 73 71  RASE );.  if( sq
3bc0: 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
3bd0: 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20 29 7b  e_parentheses ){
3be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 65  .    return p->e
3bf0: 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Type;.  }else if
3c00: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  ( p->eType==FTSQ
3c10: 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20  UERY_NEAR ){.   
3c20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
3c30: 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d  se if( p->eType=
3c40: 3d 46 54 53 51 55 45 52 59 5f 4f 52 20 29 7b 0a  =FTSQUERY_OR ){.
3c50: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
3c60: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  }.  assert( p->e
3c70: 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 41  Type==FTSQUERY_A
3c80: 4e 44 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 33  ND );.  return 3
3c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3ca0: 65 6e 74 20 70 70 48 65 61 64 20 63 6f 6e 74 61  ent ppHead conta
3cb0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
3cc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 68 65 61   the current hea
3cd0: 64 20 6f 66 20 61 20 71 75 65 72 79 20 0a 2a 2a  d of a query .**
3ce0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3cf0: 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 70   being parsed. p
3d00: 50 72 65 76 20 69 73 20 74 68 65 20 65 78 70 72  Prev is the expr
3d10: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 6d 6f 73 74  ession node most
3d20: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 69 6e 73   recently.** ins
3d30: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74  erted into the t
3d40: 72 65 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ree. This functi
3d50: 6f 6e 20 61 64 64 73 20 70 4e 65 77 2c 20 77 68  on adds pNew, wh
3d60: 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 61 20  ich is always a 
3d70: 62 69 6e 61 72 79 0a 2a 2a 20 6f 70 65 72 61 74  binary.** operat
3d80: 6f 72 20 6e 6f 64 65 2c 20 69 6e 74 6f 20 74 68  or node, into th
3d90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
3da0: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  e based on the r
3db0: 65 6c 61 74 69 76 65 20 70 72 65 63 65 64 65 6e  elative preceden
3dc0: 63 65 0a 2a 2a 20 6f 66 20 70 4e 65 77 20 61 6e  ce.** of pNew an
3dd0: 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6e  d the existing n
3de0: 6f 64 65 73 20 6f 66 20 74 68 65 20 74 72 65 65  odes of the tree
3df0: 2e 20 54 68 69 73 20 6d 61 79 20 72 65 73 75 6c  . This may resul
3e00: 74 20 69 6e 20 74 68 65 20 68 65 61 64 0a 2a 2a  t in the head.**
3e10: 20 6f 66 20 74 68 65 20 74 72 65 65 20 63 68 61   of the tree cha
3e20: 6e 67 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  nging, in which 
3e30: 63 61 73 65 20 2a 70 70 48 65 61 64 20 69 73 20  case *ppHead is 
3e40: 73 65 74 20 74 6f 20 74 68 65 20 6e 65 77 20 72  set to the new r
3e50: 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  oot node..*/.sta
3e60: 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 42  tic void insertB
3e70: 69 6e 61 72 79 4f 70 65 72 61 74 6f 72 28 0a 20  inaryOperator(. 
3e80: 20 46 74 73 33 45 78 70 72 20 2a 2a 70 70 48 65   Fts3Expr **ppHe
3e90: 61 64 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ad,       /* Poi
3ea0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  nter to the root
3eb0: 20 6e 6f 64 65 20 6f 66 20 61 20 74 72 65 65 20   node of a tree 
3ec0: 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
3ed0: 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 2f 2a  Prev,         /*
3ee0: 20 4e 6f 64 65 20 6d 6f 73 74 20 72 65 63 65 6e   Node most recen
3ef0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 74  tly inserted int
3f00: 6f 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20  o the tree */.  
3f10: 46 74 73 33 45 78 70 72 20 2a 70 4e 65 77 20 20  Fts3Expr *pNew  
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
3f30: 62 69 6e 61 72 79 20 6e 6f 64 65 20 74 6f 20 69  binary node to i
3f40: 6e 73 65 72 74 20 69 6e 74 6f 20 65 78 70 72 65  nsert into expre
3f50: 73 73 69 6f 6e 20 74 72 65 65 20 2a 2f 0a 29 7b  ssion tree */.){
3f60: 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 53 70  .  Fts3Expr *pSp
3f70: 6c 69 74 20 3d 20 70 50 72 65 76 3b 0a 20 20 77  lit = pPrev;.  w
3f80: 68 69 6c 65 28 20 70 53 70 6c 69 74 2d 3e 70 50  hile( pSplit->pP
3f90: 61 72 65 6e 74 20 26 26 20 6f 70 50 72 65 63 65  arent && opPrece
3fa0: 64 65 6e 63 65 28 70 53 70 6c 69 74 2d 3e 70 50  dence(pSplit->pP
3fb0: 61 72 65 6e 74 29 3c 3d 6f 70 50 72 65 63 65 64  arent)<=opPreced
3fc0: 65 6e 63 65 28 70 4e 65 77 29 20 29 7b 0a 20 20  ence(pNew) ){.  
3fd0: 20 20 70 53 70 6c 69 74 20 3d 20 70 53 70 6c 69    pSplit = pSpli
3fe0: 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  t->pParent;.  }.
3ff0: 0a 20 20 69 66 28 20 70 53 70 6c 69 74 2d 3e 70  .  if( pSplit->p
4000: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  Parent ){.    as
4010: 73 65 72 74 28 20 70 53 70 6c 69 74 2d 3e 70 50  sert( pSplit->pP
4020: 61 72 65 6e 74 2d 3e 70 52 69 67 68 74 3d 3d 70  arent->pRight==p
4030: 53 70 6c 69 74 20 29 3b 0a 20 20 20 20 70 53 70  Split );.    pSp
4040: 6c 69 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 52  lit->pParent->pR
4050: 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ight = pNew;.   
4060: 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
4070: 20 70 53 70 6c 69 74 2d 3e 70 50 61 72 65 6e 74   pSplit->pParent
4080: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
4090: 70 70 48 65 61 64 20 3d 20 70 4e 65 77 3b 0a 20  ppHead = pNew;. 
40a0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74   }.  pNew->pLeft
40b0: 20 3d 20 70 53 70 6c 69 74 3b 0a 20 20 70 53 70   = pSplit;.  pSp
40c0: 6c 69 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  lit->pParent = p
40d0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  New;.}../*.** Pa
40e0: 72 73 65 20 74 68 65 20 66 74 73 33 20 71 75 65  rse the fts3 que
40f0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  ry expression fo
4100: 75 6e 64 20 69 6e 20 62 75 66 66 65 72 20 7a 2c  und in buffer z,
4110: 20 6c 65 6e 67 74 68 20 6e 2e 20 54 68 69 73 20   length n. This 
4120: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  function.** retu
4130: 72 6e 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  rns either when 
4140: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
4150: 75 66 66 65 72 20 69 73 20 72 65 61 63 68 65 64  uffer is reached
4160: 20 6f 72 20 61 6e 20 75 6e 6d 61 74 63 68 65 64   or an unmatched
4170: 20 0a 2a 2a 20 63 6c 6f 73 69 6e 67 20 62 72 61   .** closing bra
4180: 63 6b 65 74 20 2d 20 27 29 27 20 2d 20 69 73 20  cket - ')' - is 
4190: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
41a0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
41b0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
41c0: 65 74 75 72 6e 65 64 2c 20 2a 70 70 45 78 70 72  eturned, *ppExpr
41d0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
41e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   to the.** parse
41f0: 64 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 65 78  d form of the ex
4200: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 2a 70 6e  pression and *pn
4210: 43 6f 6e 73 75 6d 65 64 20 69 73 20 73 65 74 20  Consumed is set 
4220: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4230: 0a 2a 2a 20 62 79 74 65 73 20 72 65 61 64 20 66  .** bytes read f
4240: 72 6f 6d 20 62 75 66 66 65 72 20 7a 2e 20 4f 74  rom buffer z. Ot
4250: 68 65 72 77 69 73 65 2c 20 2a 70 70 45 78 70 72  herwise, *ppExpr
4260: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
4280: 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20   (out of memory 
4290: 65 72 72 6f 72 29 20 6f 72 20 53 51 4c 49 54 45  error) or SQLITE
42a0: 5f 45 52 52 4f 52 20 28 70 61 72 73 65 20 65 72  _ERROR (parse er
42b0: 72 6f 72 29 20 69 73 20 72 65 74 75 72 6e 65 64  ror) is returned
42c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42d0: 66 74 73 33 45 78 70 72 50 61 72 73 65 28 0a 20  fts3ExprParse(. 
42e0: 20 50 61 72 73 65 43 6f 6e 74 65 78 74 20 2a 70   ParseContext *p
42f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4300: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 74 73 33           /* fts3
4310: 20 71 75 65 72 79 20 70 61 72 73 65 20 63 6f 6e   query parse con
4320: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
4330: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 4d 41 54    /* Text of MAT
4360: 43 48 20 71 75 65 72 79 20 2a 2f 0a 20 20 46 74  CH query */.  Ft
4370: 73 33 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c  s3Expr **ppExpr,
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
43a0: 72 73 65 64 20 71 75 65 72 79 20 73 74 72 75 63  rsed query struc
43b0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ture */.  int *p
43c0: 6e 43 6f 6e 73 75 6d 65 64 20 20 20 20 20 20 20  nConsumed       
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
43f0: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
4400: 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 45  ed */.){.  Fts3E
4410: 78 70 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  xpr *pRet = 0;. 
4420: 20 46 74 73 33 45 78 70 72 20 2a 70 50 72 65 76   Fts3Expr *pPrev
4430: 20 3d 20 30 3b 0a 20 20 46 74 73 33 45 78 70 72   = 0;.  Fts3Expr
4440: 20 2a 70 4e 6f 74 42 72 61 6e 63 68 20 3d 20 30   *pNotBranch = 0
4450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4460: 2f 2a 20 4f 6e 6c 79 20 75 73 65 64 20 69 6e 20  /* Only used in 
4470: 6c 65 67 61 63 79 20 70 61 72 73 65 20 6d 6f 64  legacy parse mod
4480: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 20 3d  e */.  int nIn =
4490: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
44a0: 20 2a 7a 49 6e 20 3d 20 7a 3b 0a 20 20 69 6e 74   *zIn = z;.  int
44b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
44c0: 0a 20 20 69 6e 74 20 69 73 52 65 71 75 69 72 65  .  int isRequire
44d0: 50 68 72 61 73 65 20 3d 20 31 3b 0a 0a 20 20 77  Phrase = 1;..  w
44e0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
44f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 33 45  _OK ){.    Fts3E
4500: 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20  xpr *p = 0;.    
4510: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
4520: 20 20 20 72 63 20 3d 20 67 65 74 4e 65 78 74 4e     rc = getNextN
4530: 6f 64 65 28 70 50 61 72 73 65 2c 20 7a 49 6e 2c  ode(pParse, zIn,
4540: 20 6e 49 6e 2c 20 26 70 2c 20 26 6e 42 79 74 65   nIn, &p, &nByte
4550: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4560: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4570: 20 20 69 6e 74 20 69 73 50 68 72 61 73 65 3b 0a    int isPhrase;.
4580: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
4590: 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
45a0: 70 61 72 65 6e 74 68 65 73 65 73 20 0a 20 20 20  parentheses .   
45b0: 20 20 20 20 26 26 20 70 2d 3e 65 54 79 70 65 3d      && p->eType=
45c0: 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
45d0: 20 26 26 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e   && p->pPhrase->
45e0: 69 73 4e 6f 74 20 0a 20 20 20 20 20 20 29 7b 0a  isNot .      ){.
45f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74          /* Creat
4600: 65 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 4e 4f  e an implicit NO
4610: 54 20 6f 70 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  T operator. */. 
4620: 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
4630: 2a 70 4e 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  *pNot = sqlite3_
4640: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
4650: 73 33 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  s3Expr));.      
4660: 20 20 69 66 28 20 21 70 4e 6f 74 20 29 7b 0a 20    if( !pNot ){. 
4670: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4680: 46 74 73 33 45 78 70 72 46 72 65 65 28 70 29 3b  Fts3ExprFree(p);
4690: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
46a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
46b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70          goto exp
46c0: 72 70 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20  rparse_out;.    
46d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
46e0: 6d 73 65 74 28 70 4e 6f 74 2c 20 30 2c 20 73 69  mset(pNot, 0, si
46f0: 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b  zeof(Fts3Expr));
4700: 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 2d 3e 65  .        pNot->e
4710: 54 79 70 65 20 3d 20 46 54 53 51 55 45 52 59 5f  Type = FTSQUERY_
4720: 4e 4f 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  NOT;.        pNo
4730: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 3b 0a 20  t->pRight = p;. 
4740: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 74 42         if( pNotB
4750: 72 61 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  ranch ){.       
4760: 20 20 20 70 4e 6f 74 42 72 61 6e 63 68 2d 3e 70     pNotBranch->p
4770: 4c 65 66 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Left = p;.      
4780: 20 20 20 20 70 4e 6f 74 2d 3e 70 52 69 67 68 74      pNot->pRight
4790: 20 3d 20 70 4e 6f 74 42 72 61 6e 63 68 3b 0a 20   = pNotBranch;. 
47a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47b0: 20 70 4e 6f 74 42 72 61 6e 63 68 20 3d 20 70 4e   pNotBranch = pN
47c0: 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ot;.      }else{
47d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79  .        int eTy
47e0: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
47f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
4800: 54 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 50  Type!=FTSQUERY_P
4810: 48 52 41 53 45 20 7c 7c 20 21 70 2d 3e 70 50 68  HRASE || !p->pPh
4820: 72 61 73 65 2d 3e 69 73 4e 6f 74 20 29 3b 0a 20  rase->isNot );. 
4830: 20 20 20 20 20 20 20 69 73 50 68 72 61 73 65 20         isPhrase 
4840: 3d 20 28 65 54 79 70 65 3d 3d 46 54 53 51 55 45  = (eType==FTSQUE
4850: 52 59 5f 50 48 52 41 53 45 20 7c 7c 20 70 2d 3e  RY_PHRASE || p->
4860: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20  pLeft);..       
4870: 20 2f 2a 20 54 68 65 20 69 73 52 65 71 75 69 72   /* The isRequir
4880: 65 50 68 72 61 73 65 20 76 61 72 69 61 62 6c 65  ePhrase variable
4890: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
48a0: 69 66 20 61 20 70 68 72 61 73 65 20 6f 72 0a 20  if a phrase or. 
48b0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 65 78 70         ** an exp
48c0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 65  ression containe
48d0: 64 20 69 6e 20 70 61 72 65 6e 74 68 65 73 69 73  d in parenthesis
48e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   is required. If
48f0: 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 69   a.        ** bi
4900: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 28 41  nary operator (A
4910: 4e 44 2c 20 4f 52 2c 20 4e 4f 54 20 6f 72 20 4e  ND, OR, NOT or N
4920: 45 41 52 29 20 69 73 20 65 6e 63 6f 75 6e 74 65  EAR) is encounte
4930: 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  d when.        *
4940: 2a 20 69 73 52 65 71 75 69 72 65 50 68 72 61 73  * isRequirePhras
4950: 65 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 69  e is set, this i
4960: 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  s a syntax error
4970: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4980: 20 20 20 20 20 69 66 28 20 21 69 73 50 68 72 61       if( !isPhra
4990: 73 65 20 26 26 20 69 73 52 65 71 75 69 72 65 50  se && isRequireP
49a0: 68 72 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  hrase ){.       
49b0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
49c0: 70 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  prFree(p);.     
49d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
49e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
49f0: 20 20 67 6f 74 6f 20 65 78 70 72 70 61 72 73 65    goto exprparse
4a00: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
4a10: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 69    .        if( i
4a20: 73 50 68 72 61 73 65 20 26 26 20 21 69 73 52 65  sPhrase && !isRe
4a30: 71 75 69 72 65 50 68 72 61 73 65 20 29 7b 0a 20  quirePhrase ){. 
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
4a50: 72 74 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41  rt an implicit A
4a60: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 2a 2f 0a  ND operator. */.
4a70: 20 20 20 20 20 20 20 20 20 20 46 74 73 33 45 78            Fts3Ex
4a80: 70 72 20 2a 70 41 6e 64 3b 0a 20 20 20 20 20 20  pr *pAnd;.      
4a90: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
4aa0: 20 26 26 20 70 50 72 65 76 20 29 3b 0a 20 20 20   && pPrev );.   
4ab0: 20 20 20 20 20 20 20 70 41 6e 64 20 3d 20 73 71         pAnd = sq
4ac0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
4ad0: 65 6f 66 28 46 74 73 33 45 78 70 72 29 29 3b 0a  eof(Fts3Expr));.
4ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
4af0: 41 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  And ){.         
4b00: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
4b10: 70 72 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  prFree(p);.     
4b20: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
4b30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
4b40: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72 70        goto exprp
4b50: 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  arse_out;.      
4b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4b70: 6d 65 6d 73 65 74 28 70 41 6e 64 2c 20 30 2c 20  memset(pAnd, 0, 
4b80: 73 69 7a 65 6f 66 28 46 74 73 33 45 78 70 72 29  sizeof(Fts3Expr)
4b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  );.          pAn
4ba0: 64 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 51 55  d->eType = FTSQU
4bb0: 45 52 59 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20  ERY_AND;.       
4bc0: 20 20 20 69 6e 73 65 72 74 42 69 6e 61 72 79 4f     insertBinaryO
4bd0: 70 65 72 61 74 6f 72 28 26 70 52 65 74 2c 20 70  perator(&pRet, p
4be0: 50 72 65 76 2c 20 70 41 6e 64 29 3b 0a 20 20 20  Prev, pAnd);.   
4bf0: 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70         pPrev = p
4c00: 41 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  And;.        }..
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
4c20: 74 65 73 74 20 63 61 74 63 68 65 73 20 61 74 74  test catches att
4c30: 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 65 69  empts to make ei
4c40: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 6f 66 20  ther operand of 
4c50: 61 20 4e 45 41 52 0a 20 20 20 20 20 20 20 20 2a  a NEAR.        *
4c60: 2a 20 6f 70 65 72 61 74 6f 72 20 73 6f 6d 65 74  * operator somet
4c70: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
4c80: 61 20 70 68 72 61 73 65 2e 20 46 6f 72 20 65 78  a phrase. For ex
4c90: 61 6d 70 6c 65 2c 20 65 69 74 68 65 72 20 6f 66  ample, either of
4ca0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
4cb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
4cc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
4cd0: 20 20 20 20 28 62 72 61 63 6b 65 74 65 64 20 65      (bracketed e
4ce0: 78 70 72 65 73 73 69 6f 6e 29 20 4e 45 41 52 20  xpression) NEAR 
4cf0: 70 68 72 61 73 65 0a 20 20 20 20 20 20 20 20 2a  phrase.        *
4d00: 2a 20 20 20 20 70 68 72 61 73 65 20 4e 45 41 52  *    phrase NEAR
4d10: 20 28 62 72 61 63 6b 65 74 65 64 20 65 78 70 72   (bracketed expr
4d20: 65 73 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 20  ession).        
4d30: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  **.        ** Re
4d40: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
4d50: 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a 20 20   either case..  
4d60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
4d70: 20 69 66 28 20 70 50 72 65 76 20 26 26 20 28 0a   if( pPrev && (.
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 54 79              (eTy
4d90: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
4da0: 52 20 26 26 20 21 69 73 50 68 72 61 73 65 20 26  R && !isPhrase &
4db0: 26 20 70 50 72 65 76 2d 3e 65 54 79 70 65 21 3d  & pPrev->eType!=
4dc0: 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 29  FTSQUERY_PHRASE)
4dd0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 65 54  .         || (eT
4de0: 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 50 48  ype!=FTSQUERY_PH
4df0: 52 41 53 45 20 26 26 20 69 73 50 68 72 61 73 65  RASE && isPhrase
4e00: 20 26 26 20 70 50 72 65 76 2d 3e 65 54 79 70 65   && pPrev->eType
4e10: 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 29  ==FTSQUERY_NEAR)
4e20: 0a 20 20 20 20 20 20 20 20 29 29 7b 0a 20 20 20  .        )){.   
4e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
4e40: 73 33 45 78 70 72 46 72 65 65 28 70 29 3b 0a 20  s3ExprFree(p);. 
4e50: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
4e60: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
4e70: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72 70        goto exprp
4e80: 61 72 73 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  arse_out;.      
4e90: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69    }.  .        i
4ea0: 66 28 20 69 73 50 68 72 61 73 65 20 29 7b 0a 20  f( isPhrase ){. 
4eb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
4ec0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
4ed0: 20 61 73 73 65 72 74 28 20 70 50 72 65 76 20 26   assert( pPrev &
4ee0: 26 20 70 50 72 65 76 2d 3e 70 4c 65 66 74 20 26  & pPrev->pLeft &
4ef0: 26 20 70 50 72 65 76 2d 3e 70 52 69 67 68 74 3d  & pPrev->pRight=
4f00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4f10: 20 20 70 50 72 65 76 2d 3e 70 52 69 67 68 74 20    pPrev->pRight 
4f20: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = p;.           
4f30: 20 70 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50   p->pParent = pP
4f40: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rev;.          }
4f50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4f60: 20 20 70 52 65 74 20 3d 20 70 3b 0a 20 20 20 20    pRet = p;.    
4f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4f90: 20 69 6e 73 65 72 74 42 69 6e 61 72 79 4f 70 65   insertBinaryOpe
4fa0: 72 61 74 6f 72 28 26 70 52 65 74 2c 20 70 50 72  rator(&pRet, pPr
4fb0: 65 76 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  ev, p);.        
4fc0: 7d 0a 20 20 20 20 20 20 20 20 69 73 52 65 71 75  }.        isRequ
4fd0: 69 72 65 50 68 72 61 73 65 20 3d 20 21 69 73 50  irePhrase = !isP
4fe0: 68 72 61 73 65 3b 0a 20 20 20 20 20 20 7d 0a 20  hrase;.      }. 
4ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 79       assert( nBy
5000: 74 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  te>0 );.    }.  
5010: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
5020: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 6e 42 79 74  LITE_OK || (nByt
5030: 65 3e 30 20 26 26 20 6e 42 79 74 65 3c 3d 6e 49  e>0 && nByte<=nI
5040: 6e 29 20 29 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d  n) );.    nIn -=
5050: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7a 49 6e 20   nByte;.    zIn 
5060: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 70 50  += nByte;.    pP
5070: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  rev = p;.  }..  
5080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
5090: 4f 4e 45 20 26 26 20 70 52 65 74 20 26 26 20 69  ONE && pRet && i
50a0: 73 52 65 71 75 69 72 65 50 68 72 61 73 65 20 29  sRequirePhrase )
50b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
50c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
50d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
50e0: 4f 4e 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ONE ){.    rc = 
50f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
5100: 66 28 20 21 73 71 6c 69 74 65 33 5f 66 74 73 33  f( !sqlite3_fts3
5110: 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
5120: 73 65 73 20 26 26 20 70 4e 6f 74 42 72 61 6e 63  ses && pNotBranc
5130: 68 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  h ){.      if( !
5140: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
5150: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5160: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
5170: 20 20 20 20 20 20 20 20 70 4e 6f 74 42 72 61 6e          pNotBran
5180: 63 68 2d 3e 70 4c 65 66 74 20 3d 20 70 52 65 74  ch->pLeft = pRet
5190: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
51a0: 20 70 4e 6f 74 42 72 61 6e 63 68 3b 0a 20 20 20   pNotBranch;.   
51b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
51c0: 20 2a 70 6e 43 6f 6e 73 75 6d 65 64 20 3d 20 6e   *pnConsumed = n
51d0: 20 2d 20 6e 49 6e 3b 0a 0a 65 78 70 72 70 61 72   - nIn;..exprpar
51e0: 73 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  se_out:.  if( rc
51f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5200: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
5210: 70 72 46 72 65 65 28 70 52 65 74 29 3b 0a 20 20  prFree(pRet);.  
5220: 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70    sqlite3Fts3Exp
5230: 72 46 72 65 65 28 70 4e 6f 74 42 72 61 6e 63 68  rFree(pNotBranch
5240: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
5250: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
5260: 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
5270: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
5280: 61 6d 65 74 65 72 73 20 7a 20 61 6e 64 20 6e 20  ameters z and n 
5290: 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
52a0: 72 20 74 6f 20 61 6e 64 20 6c 65 6e 67 74 68 20  r to and length 
52b0: 6f 66 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  of a buffer cont
52c0: 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 66 74 73  aining.** an fts
52d0: 33 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  3 query expressi
52e0: 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  on, respectively
52f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
5300: 61 74 74 65 6d 70 74 73 20 74 6f 20 70 61 72 73  attempts to pars
5310: 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 65  e the.** query e
5320: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 63 72  xpression and cr
5330: 65 61 74 65 20 61 20 74 72 65 65 20 6f 66 20 46  eate a tree of F
5340: 74 73 33 45 78 70 72 20 73 74 72 75 63 74 75 72  ts3Expr structur
5350: 65 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  es representing 
5360: 74 68 65 0a 2a 2a 20 70 61 72 73 65 64 20 65 78  the.** parsed ex
5370: 70 72 65 73 73 69 6f 6e 2e 20 49 66 20 73 75 63  pression. If suc
5380: 63 65 73 73 66 75 6c 2c 20 2a 70 70 45 78 70 72  cessful, *ppExpr
5390: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
53a0: 20 74 6f 20 74 68 65 20 68 65 61 64 0a 2a 2a 20   to the head.** 
53b0: 6f 66 20 74 68 65 20 70 61 72 73 65 64 20 65 78  of the parsed ex
53c0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
53d0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
53e0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
53f0: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  rror.** occurs, 
5400: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
5410: 4d 45 4d 20 28 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  MEM (out-of-memo
5420: 72 79 20 65 72 72 6f 72 29 20 6f 72 20 53 51 4c  ry error) or SQL
5430: 49 54 45 5f 45 52 52 4f 52 20 28 70 61 72 73 65  ITE_ERROR (parse
5440: 0a 2a 2a 20 65 72 72 6f 72 29 20 69 73 20 72 65  .** error) is re
5450: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 45 78  turned and *ppEx
5460: 70 72 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  pr is set to 0..
5470: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
5480: 65 72 20 6e 20 69 73 20 61 20 6e 65 67 61 74 69  er n is a negati
5490: 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 6e 20  ve number, then 
54a0: 7a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  z is assumed to 
54b0: 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20 6e 75  point to a.** nu
54c0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
54d0: 69 6e 67 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ing and the leng
54e0: 74 68 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  th is determined
54f0: 20 75 73 69 6e 67 20 73 74 72 6c 65 6e 28 29 2e   using strlen().
5500: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
5510: 20 70 61 72 61 6d 65 74 65 72 2c 20 70 54 6f 6b   parameter, pTok
5520: 65 6e 69 7a 65 72 2c 20 69 73 20 70 61 73 73 65  enizer, is passe
5530: 64 20 74 68 65 20 66 74 73 33 20 74 6f 6b 65 6e  d the fts3 token
5540: 69 7a 65 72 20 6d 6f 64 75 6c 65 20 74 6f 0a 2a  izer module to.*
5550: 2a 20 75 73 65 20 74 6f 20 6e 6f 72 6d 61 6c 69  * use to normali
5560: 7a 65 20 71 75 65 72 79 20 74 6f 6b 65 6e 73 20  ze query tokens 
5570: 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 74 68  while parsing th
5580: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  e expression. Th
5590: 65 20 61 7a 43 6f 6c 5b 5d 0a 2a 2a 20 61 72 72  e azCol[].** arr
55a0: 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 73 73  ay, which is ass
55b0: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
55c0: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c 20 73 68  nCol entries, sh
55d0: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65  ould contain the
55e0: 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66 20 65 61 63   names.** of eac
55f0: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
5600: 74 61 72 67 65 74 20 66 74 73 33 20 74 61 62 6c  target fts3 tabl
5610: 65 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d  e, in order from
5620: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
5630: 0a 2a 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** Column names
5640: 20 6d 75 73 74 20 62 65 20 6e 75 6c 2d 74 65 72   must be nul-ter
5650: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 2e  minated strings.
5660: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 44 65 66 61  .**.** The iDefa
5670: 75 6c 74 43 6f 6c 20 70 61 72 61 6d 65 74 65 72  ultCol parameter
5680: 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
5690: 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
56a0: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
56b0: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ** that appears 
56c0: 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  on the left-hand
56d0: 2d 73 69 64 65 20 6f 66 20 74 68 65 20 4d 41 54  -side of the MAT
56e0: 43 48 20 6f 70 65 72 61 74 6f 72 20 28 74 68 65  CH operator (the
56f0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 63 6f 6c 75   default.** colu
5700: 6d 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  mn to match agai
5710: 6e 73 74 20 66 6f 72 20 74 6f 6b 65 6e 73 20 66  nst for tokens f
5720: 6f 72 20 77 68 69 63 68 20 61 20 63 6f 6c 75 6d  or which a colum
5730: 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 65 78  n name is not ex
5740: 70 6c 69 63 69 74 6c 79 0a 2a 2a 20 73 70 65 63  plicitly.** spec
5750: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
5760: 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e   the query strin
5770: 67 29 2c 20 6f 72 20 2d 31 20 69 66 20 74 6f 6b  g), or -1 if tok
5780: 65 6e 73 20 6d 61 79 20 62 79 20 64 65 66 61 75  ens may by defau
5790: 6c 74 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79 20  lt.** match any 
57a0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  table column..*/
57b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
57c0: 45 78 70 72 50 61 72 73 65 28 0a 20 20 73 71 6c  ExprParse(.  sql
57d0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
57e0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 20 20 20 20  pTokenizer,     
57f0: 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 6d 6f   /* Tokenizer mo
5800: 64 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  dule */.  char *
5810: 2a 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *azCol,         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5830: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
5840: 20 6e 61 6d 65 73 20 66 6f 72 20 66 74 73 33 20   names for fts3 
5850: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
5860: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5880: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
5890: 69 65 73 20 69 6e 20 61 7a 43 6f 6c 5b 5d 20 2a  ies in azCol[] *
58a0: 2f 0a 20 20 69 6e 74 20 69 44 65 66 61 75 6c 74  /.  int iDefault
58b0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
58c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
58d0: 6c 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 71 75 65  lt column to que
58e0: 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ry */.  const ch
58f0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20  ar *z, int n,   
5900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5910: 65 78 74 20 6f 66 20 4d 41 54 43 48 20 71 75 65  ext of MATCH que
5920: 72 79 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  ry */.  Fts3Expr
5930: 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20   **ppExpr       
5940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5950: 55 54 3a 20 50 61 72 73 65 64 20 71 75 65 72 79  UT: Parsed query
5960: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
5970: 0a 20 20 69 6e 74 20 6e 50 61 72 73 65 64 3b 0a  .  int nParsed;.
5980: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 61 72 73    int rc;.  Pars
5990: 65 43 6f 6e 74 65 78 74 20 73 50 61 72 73 65 3b  eContext sParse;
59a0: 0a 20 20 73 50 61 72 73 65 2e 70 54 6f 6b 65 6e  .  sParse.pToken
59b0: 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  izer = pTokenize
59c0: 72 3b 0a 20 20 73 50 61 72 73 65 2e 61 7a 43 6f  r;.  sParse.azCo
59d0: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
59e0: 2a 2a 29 61 7a 43 6f 6c 3b 0a 20 20 73 50 61 72  **)azCol;.  sPar
59f0: 73 65 2e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  se.nCol = nCol;.
5a00: 20 20 73 50 61 72 73 65 2e 69 44 65 66 61 75 6c    sParse.iDefaul
5a10: 74 43 6f 6c 20 3d 20 69 44 65 66 61 75 6c 74 43  tCol = iDefaultC
5a20: 6f 6c 3b 0a 20 20 73 50 61 72 73 65 2e 6e 4e 65  ol;.  sParse.nNe
5a30: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 3d  st = 0;.  if( z=
5a40: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  =0 ){.    *ppExp
5a50: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5a60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5a70: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
5a80: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b    n = strlen(z);
5a90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33  .  }.  rc = fts3
5aa0: 45 78 70 72 50 61 72 73 65 28 26 73 50 61 72 73  ExprParse(&sPars
5ab0: 65 2c 20 7a 2c 20 6e 2c 20 70 70 45 78 70 72 2c  e, z, n, ppExpr,
5ac0: 20 26 6e 50 61 72 73 65 64 29 3b 0a 0a 20 20 2f   &nParsed);..  /
5ad0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 6d 69 73 6d  * Check for mism
5ae0: 61 74 63 68 65 64 20 70 61 72 65 6e 74 68 65 73  atched parenthes
5af0: 69 73 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  is */.  if( rc==
5b00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 50 61  SQLITE_OK && sPa
5b10: 72 73 65 2e 6e 4e 65 73 74 20 29 7b 0a 20 20 20  rse.nNest ){.   
5b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5b30: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  OR;.    sqlite3F
5b40: 74 73 33 45 78 70 72 46 72 65 65 28 2a 70 70 45  ts3ExprFree(*ppE
5b50: 78 70 72 29 3b 0a 20 20 20 20 2a 70 70 45 78 70  xpr);.    *ppExp
5b60: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = 0;.  }..  re
5b70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5b80: 2a 20 46 72 65 65 20 61 20 70 61 72 73 65 64 20  * Free a parsed 
5b90: 66 74 73 33 20 71 75 65 72 79 20 65 78 70 72 65  fts3 query expre
5ba0: 73 73 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64 20  ssion allocated 
5bb0: 62 79 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  by sqlite3Fts3Ex
5bc0: 70 72 50 61 72 73 65 28 29 2e 0a 2a 2f 0a 76 6f  prParse()..*/.vo
5bd0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  id sqlite3Fts3Ex
5be0: 70 72 46 72 65 65 28 46 74 73 33 45 78 70 72 20  prFree(Fts3Expr 
5bf0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
5c00: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45      sqlite3Fts3E
5c10: 78 70 72 46 72 65 65 28 70 2d 3e 70 4c 65 66 74  xprFree(p->pLeft
5c20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
5c30: 73 33 45 78 70 72 46 72 65 65 28 70 2d 3e 70 52  s3ExprFree(p->pR
5c40: 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ight);.    sqlit
5c50: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
5c60: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
5c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cb0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
5cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5d00: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 66 74  * Everything aft
5d10: 65 72 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  er this point is
5d20: 20 6a 75 73 74 20 74 65 73 74 20 63 6f 64 65 2e   just test code.
5d30: 0a 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .*/..#ifdef SQLI
5d40: 54 45 5f 54 45 53 54 0a 0a 23 69 6e 63 6c 75 64  TE_TEST..#includ
5d50: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 2f 2a 0a  e <stdio.h>../*.
5d60: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 71  ** Function to q
5d70: 75 65 72 79 20 74 68 65 20 68 61 73 68 2d 74 61  uery the hash-ta
5d80: 62 6c 65 20 6f 66 20 74 6f 6b 65 6e 69 7a 65 72  ble of tokenizer
5d90: 73 20 28 73 65 65 20 52 45 41 44 4d 45 2e 74 6f  s (see README.to
5da0: 6b 65 6e 69 7a 65 72 73 29 2e 0a 2a 2f 0a 73 74  kenizers)..*/.st
5db0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54 65  atic int queryTe
5dc0: 73 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 73  stTokenizer(.  s
5dd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
5de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5df0: 2c 20 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ,  .  const sqli
5e00: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
5e10: 64 75 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69  dule **pp.){.  i
5e20: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
5e30: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
5e40: 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b  const char zSql[
5e50: 5d 20 3d 20 22 53 45 4c 45 43 54 20 66 74 73 33  ] = "SELECT fts3
5e60: 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 29 22 3b 0a  _tokenizer(?)";.
5e70: 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 72 63  .  *pp = 0;.  rc
5e80: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
5e90: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
5ea0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
5eb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5ec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
5ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  n rc;.  }..  sql
5ee0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
5ef0: 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20  Stmt, 1, zName, 
5f00: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
5f10: 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  C);.  if( SQLITE
5f20: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
5f30: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
5f40: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
5f50: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
5f60: 30 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  0)==SQLITE_BLOB 
5f70: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
5f80: 70 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  pp, sqlite3_colu
5f90: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30  mn_blob(pStmt, 0
5fa0: 29 2c 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b  ), sizeof(*pp));
5fb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
5fc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e  turn sqlite3_fin
5fd0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
5fe0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5ff0: 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
6000: 74 68 65 20 74 65 73 74 20 69 6e 74 65 72 66 61  the test interfa
6010: 63 65 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ce for the query
6020: 20 70 61 72 73 65 72 2e 20 49 74 0a 2a 2a 20 77   parser. It.** w
6030: 72 69 74 65 73 20 61 20 74 65 78 74 20 72 65 70  rites a text rep
6040: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
6050: 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
6060: 69 6f 6e 20 70 45 78 70 72 20 69 6e 74 6f 20 74  ion pExpr into t
6070: 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 70 6f 69  he.** buffer poi
6080: 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
6090: 65 6e 74 20 7a 42 75 66 2e 20 49 74 20 69 73 20  ent zBuf. It is 
60a0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 7a 42 75  assumed that zBu
60b0: 66 20 69 73 20 6c 61 72 67 65 20 0a 2a 2a 20 65  f is large .** e
60c0: 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20 74  nough to store t
60d0: 68 65 20 72 65 71 75 69 72 65 64 20 74 65 78 74  he required text
60e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
60f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6100: 65 78 70 72 54 6f 53 74 72 69 6e 67 28 46 74 73  exprToString(Fts
6110: 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  3Expr *pExpr, ch
6120: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 77 69  ar *zBuf){.  swi
6130: 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70  tch( pExpr->eTyp
6140: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54  e ){.    case FT
6150: 53 51 55 45 52 59 5f 50 48 52 41 53 45 3a 20 7b  SQUERY_PHRASE: {
6160: 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73  .      Fts3Phras
6170: 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78  e *pPhrase = pEx
6180: 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20  pr->pPhrase;.   
6190: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
61a0: 7a 42 75 66 20 2b 3d 20 73 70 72 69 6e 74 66 28  zBuf += sprintf(
61b0: 7a 42 75 66 2c 20 22 50 48 52 41 53 45 20 25 64  zBuf, "PHRASE %d
61c0: 20 25 64 22 2c 20 70 50 68 72 61 73 65 2d 3e 69   %d", pPhrase->i
61d0: 43 6f 6c 75 6d 6e 2c 20 70 50 68 72 61 73 65 2d  Column, pPhrase-
61e0: 3e 69 73 4e 6f 74 29 3b 0a 20 20 20 20 20 20 66  >isNot);.      f
61f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73  or(i=0; i<pPhras
6200: 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b  e->nToken; i++){
6210: 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d  .        zBuf +=
6220: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 20   sprintf(zBuf," 
6230: 25 2e 2a 73 22 2c 70 50 68 72 61 73 65 2d 3e 61  %.*s",pPhrase->a
6240: 54 6f 6b 65 6e 5b 69 5d 2e 6e 2c 70 50 68 72 61  Token[i].n,pPhra
6250: 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 7a 29  se->aToken[i].z)
6260: 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b  ;.        zBuf +
6270: 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22  = sprintf(zBuf,"
6280: 25 73 22 2c 20 28 70 50 68 72 61 73 65 2d 3e 61  %s", (pPhrase->a
6290: 54 6f 6b 65 6e 5b 69 5d 2e 69 73 50 72 65 66 69  Token[i].isPrefi
62a0: 78 3f 22 2b 22 3a 22 22 29 29 3b 0a 20 20 20 20  x?"+":""));.    
62b0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
62c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
62d0: 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3a  e FTSQUERY_NEAR:
62e0: 0a 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 73  .      zBuf += s
62f0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 4e 45  printf(zBuf, "NE
6300: 41 52 2f 25 64 20 22 2c 20 70 45 78 70 72 2d 3e  AR/%d ", pExpr->
6310: 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20 20 62 72  nNear);.      br
6320: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 46 54  eak;.    case FT
6330: 53 51 55 45 52 59 5f 4e 4f 54 3a 0a 20 20 20 20  SQUERY_NOT:.    
6340: 20 20 7a 42 75 66 20 2b 3d 20 73 70 72 69 6e 74    zBuf += sprint
6350: 66 28 7a 42 75 66 2c 20 22 4e 4f 54 20 22 29 3b  f(zBuf, "NOT ");
6360: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6370: 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f    case FTSQUERY_
6380: 41 4e 44 3a 0a 20 20 20 20 20 20 7a 42 75 66 20  AND:.      zBuf 
6390: 2b 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  += sprintf(zBuf,
63a0: 20 22 41 4e 44 20 22 29 3b 0a 20 20 20 20 20 20   "AND ");.      
63b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
63c0: 46 54 53 51 55 45 52 59 5f 4f 52 3a 0a 20 20 20  FTSQUERY_OR:.   
63d0: 20 20 20 7a 42 75 66 20 2b 3d 20 73 70 72 69 6e     zBuf += sprin
63e0: 74 66 28 7a 42 75 66 2c 20 22 4f 52 20 22 29 3b  tf(zBuf, "OR ");
63f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6400: 7d 0a 0a 20 20 7a 42 75 66 20 2b 3d 20 73 70 72  }..  zBuf += spr
6410: 69 6e 74 66 28 7a 42 75 66 2c 20 22 7b 22 29 3b  intf(zBuf, "{");
6420: 0a 20 20 65 78 70 72 54 6f 53 74 72 69 6e 67 28  .  exprToString(
6430: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 7a 42  pExpr->pLeft, zB
6440: 75 66 29 3b 0a 20 20 7a 42 75 66 20 2b 3d 20 73  uf);.  zBuf += s
6450: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 7a  trlen(zBuf);.  z
6460: 42 75 66 20 2b 3d 20 73 70 72 69 6e 74 66 28 7a  Buf += sprintf(z
6470: 42 75 66 2c 20 22 7d 20 22 29 3b 0a 0a 20 20 7a  Buf, "} ");..  z
6480: 42 75 66 20 2b 3d 20 73 70 72 69 6e 74 66 28 7a  Buf += sprintf(z
6490: 42 75 66 2c 20 22 7b 22 29 3b 0a 20 20 65 78 70  Buf, "{");.  exp
64a0: 72 54 6f 53 74 72 69 6e 67 28 70 45 78 70 72 2d  rToString(pExpr-
64b0: 3e 70 52 69 67 68 74 2c 20 7a 42 75 66 29 3b 0a  >pRight, zBuf);.
64c0: 20 20 7a 42 75 66 20 2b 3d 20 73 74 72 6c 65 6e    zBuf += strlen
64d0: 28 7a 42 75 66 29 3b 0a 20 20 7a 42 75 66 20 2b  (zBuf);.  zBuf +
64e0: 3d 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20  = sprintf(zBuf, 
64f0: 22 7d 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  "}");.}../*.** T
6500: 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c 65  his is the imple
6510: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 73  mentation of a s
6520: 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74 69  calar SQL functi
6530: 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  on used to test 
6540: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
6550: 6f 6e 20 70 61 72 73 65 72 2e 20 49 74 20 73 68  on parser. It sh
6560: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 61  ould be called a
6570: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
6580: 20 20 20 66 74 73 33 5f 65 78 70 72 74 65 73 74     fts3_exprtest
6590: 28 3c 74 6f 6b 65 6e 69 7a 65 72 3e 2c 20 3c 65  (<tokenizer>, <e
65a0: 78 70 72 3e 2c 20 3c 63 6f 6c 75 6d 6e 20 31 3e  xpr>, <column 1>
65b0: 2c 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  , ...);.**.** Th
65c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
65d0: 2c 20 3c 74 6f 6b 65 6e 69 7a 65 72 3e 2c 20 69  , <tokenizer>, i
65e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
65f0: 65 20 66 74 73 33 20 74 6f 6b 65 6e 69 7a 65 72  e fts3 tokenizer
6600: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 70 61 72 73   used.** to pars
6610: 65 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  e the query expr
6620: 65 73 73 69 6f 6e 20 28 73 65 65 20 52 45 41 44  ession (see READ
6630: 4d 45 2e 74 6f 6b 65 6e 69 7a 65 72 73 29 2e 20  ME.tokenizers). 
6640: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
6650: 65 6e 74 0a 2a 2a 20 69 73 20 74 68 65 20 71 75  ent.** is the qu
6660: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ery expression t
6670: 6f 20 70 61 72 73 65 2e 20 45 61 63 68 20 73 75  o parse. Each su
6680: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
6690: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  t is the name.**
66a0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20   of a column of 
66b0: 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 20 74  the fts3 table t
66c0: 68 61 74 20 74 68 65 20 71 75 65 72 79 20 65 78  hat the query ex
66d0: 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 72 65 66  pression may ref
66e0: 65 72 20 74 6f 2e 0a 2a 2a 20 46 6f 72 20 65 78  er to..** For ex
66f0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  ample:.**.**   S
6700: 45 4c 45 43 54 20 66 74 73 33 5f 65 78 70 72 74  ELECT fts3_exprt
6710: 65 73 74 28 27 73 69 6d 70 6c 65 27 2c 20 27 42  est('simple', 'B
6720: 69 6c 6c 20 63 6f 6c 32 3a 42 6c 6f 67 67 73 27  ill col2:Bloggs'
6730: 2c 20 27 63 6f 6c 31 27 2c 20 27 63 6f 6c 32 27  , 'col1', 'col2'
6740: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  );.*/.static voi
6750: 64 20 66 74 73 33 45 78 70 72 54 65 73 74 28 0a  d fts3ExprTest(.
6760: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6770: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6780: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6790: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
67a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  {.  sqlite3_toke
67b0: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
67c0: 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 30 3b  st *pModule = 0;
67d0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
67e0: 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72  izer *pTokenizer
67f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
6800: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
6810: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
6820: 20 2a 7a 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e   *zExpr;.  int n
6830: 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  Expr;.  int nCol
6840: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 46 74  ;.  int ii;.  Ft
6850: 73 33 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20  s3Expr *pExpr;. 
6860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
6870: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
6880: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
6890: 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 33  );..  if( argc<3
68a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
68b0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
68c0: 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 22  text, .        "
68d0: 55 73 61 67 65 3a 20 66 74 73 33 5f 65 78 70 72  Usage: fts3_expr
68e0: 74 65 73 74 28 74 6f 6b 65 6e 69 7a 65 72 2c 20  test(tokenizer, 
68f0: 65 78 70 72 2c 20 63 6f 6c 31 2c 20 2e 2e 2e 22  expr, col1, ..."
6900: 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  , -1.    );.    
6910: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 72  return;.  }..  r
6920: 63 20 3d 20 71 75 65 72 79 54 65 73 74 54 6f 6b  c = queryTestTok
6930: 65 6e 69 7a 65 72 28 64 62 2c 0a 20 20 20 20 20  enizer(db,.     
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
6960: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
6970: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
6980: 26 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 69 66 28  &pModule);.  if(
6990: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
69a0: 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
69b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
69c0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
69d0: 20 20 67 6f 74 6f 20 65 78 70 72 74 65 73 74 5f    goto exprtest_
69e0: 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
69f0: 20 21 70 4d 6f 64 75 6c 65 20 29 7b 0a 20 20 20   !pModule ){.   
6a00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6a10: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
6a20: 4e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a 65  No such tokenize
6a30: 72 20 6d 6f 64 75 6c 65 22 2c 20 2d 31 29 3b 0a  r module", -1);.
6a40: 20 20 20 20 67 6f 74 6f 20 65 78 70 72 74 65 73      goto exprtes
6a50: 74 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 63  t_out;.  }..  rc
6a60: 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 72 65   = pModule->xCre
6a70: 61 74 65 28 30 2c 20 30 2c 20 26 70 54 6f 6b 65  ate(0, 0, &pToke
6a80: 6e 69 7a 65 72 29 3b 0a 20 20 61 73 73 65 72 74  nizer);.  assert
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
6aa0: 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  EM || rc==SQLITE
6ab0: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  _OK );.  if( rc=
6ac0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
6ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6ae0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6af0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f  context);.    go
6b00: 74 6f 20 65 78 70 72 74 65 73 74 5f 6f 75 74 3b  to exprtest_out;
6b10: 0a 20 20 7d 0a 20 20 70 54 6f 6b 65 6e 69 7a 65  .  }.  pTokenize
6b20: 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f  r->pModule = pMo
6b30: 64 75 6c 65 3b 0a 0a 20 20 7a 45 78 70 72 20 3d  dule;..  zExpr =
6b40: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
6b50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6b60: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 45  t(argv[1]);.  nE
6b70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  xpr = sqlite3_va
6b80: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
6b90: 5d 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 61 72 67  ]);.  nCol = arg
6ba0: 63 2d 32 3b 0a 20 20 61 7a 43 6f 6c 20 3d 20 28  c-2;.  azCol = (
6bb0: 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
6bc0: 6d 61 6c 6c 6f 63 28 6e 43 6f 6c 2a 73 69 7a 65  malloc(nCol*size
6bd0: 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 69  of(char *));.  i
6be0: 66 28 20 21 61 7a 43 6f 6c 20 29 7b 0a 20 20 20  f( !azCol ){.   
6bf0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6c00: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
6c10: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
6c20: 78 70 72 74 65 73 74 5f 6f 75 74 3b 0a 20 20 7d  xprtest_out;.  }
6c30: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
6c40: 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCol; ii++){.   
6c50: 20 61 7a 43 6f 6c 5b 69 69 5d 20 3d 20 28 63 68   azCol[ii] = (ch
6c60: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
6c70: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 69 2b  ue_text(argv[ii+
6c80: 32 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  2]);.  }..  rc =
6c90: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
6ca0: 50 61 72 73 65 28 0a 20 20 20 20 20 20 70 54 6f  Parse(.      pTo
6cb0: 6b 65 6e 69 7a 65 72 2c 20 61 7a 43 6f 6c 2c 20  kenizer, azCol, 
6cc0: 6e 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 7a 45 78 70  nCol, nCol, zExp
6cd0: 72 2c 20 6e 45 78 70 72 2c 20 26 70 45 78 70 72  r, nExpr, &pExpr
6ce0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
6cf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
6d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6d10: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
6d20: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
6d30: 6f 20 65 78 70 72 74 65 73 74 5f 6f 75 74 3b 0a  o exprtest_out;.
6d40: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
6d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6d60: 20 63 68 61 72 20 7a 42 75 66 5b 34 30 39 36 5d   char zBuf[4096]
6d70: 3b 0a 20 20 20 20 65 78 70 72 54 6f 53 74 72 69  ;.    exprToStri
6d80: 6e 67 28 70 45 78 70 72 2c 20 7a 42 75 66 29 3b  ng(pExpr, zBuf);
6d90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6da0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
6db0: 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
6dc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
6dd0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78     sqlite3Fts3Ex
6de0: 70 72 46 72 65 65 28 70 45 78 70 72 29 3b 0a 20  prFree(pExpr);. 
6df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6e00: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6e10: 28 63 6f 6e 74 65 78 74 2c 20 22 45 72 72 6f 72  (context, "Error
6e20: 20 70 61 72 73 69 6e 67 20 65 78 70 72 65 73 73   parsing express
6e30: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a  ion", -1);.  }..
6e40: 65 78 70 72 74 65 73 74 5f 6f 75 74 3a 0a 20 20  exprtest_out:.  
6e50: 69 66 28 20 70 4d 6f 64 75 6c 65 20 26 26 20 70  if( pModule && p
6e60: 54 6f 6b 65 6e 69 7a 65 72 20 29 7b 0a 20 20 20  Tokenizer ){.   
6e70: 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
6e80: 44 65 73 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a  Destroy(pTokeniz
6e90: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
6ea0: 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a  e3_free(azCol);.
6eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
6ec0: 72 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  r the query expr
6ed0: 65 73 73 69 6f 6e 20 70 61 72 73 65 72 20 74 65  ession parser te
6ee0: 73 74 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 33  st function fts3
6ef0: 5f 65 78 70 72 74 65 73 74 28 29 20 0a 2a 2a 20  _exprtest() .** 
6f00: 77 69 74 68 20 64 61 74 61 62 61 73 65 20 63 6f  with database co
6f10: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 0a 2a 2f  nnection db. .*/
6f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
6f30: 33 45 78 70 72 49 6e 69 74 54 65 73 74 49 6e 74  3ExprInitTestInt
6f40: 65 72 66 61 63 65 28 73 71 6c 69 74 65 33 2a 20  erface(sqlite3* 
6f50: 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  db){.  sqlite3_c
6f60: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
6f70: 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 33 5f        db, "fts3_
6f80: 65 78 70 72 74 65 73 74 22 2c 20 2d 31 2c 20 53  exprtest", -1, S
6f90: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
6fa0: 74 73 33 45 78 70 72 54 65 73 74 2c 20 30 2c 20  ts3ExprTest, 0, 
6fb0: 30 0a 20 20 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  0.  );.}..#endif
6fc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
6fd0: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
6fe0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
6ff0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
7000: 2a 2f 0a                                         */.