/ Hex Artifact Content
Login

Artifact eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** 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 2f 0a 0a 0a 2f 2f  *****.**.*/...//
0180: 20 41 6c 6c 20 74 6f 6b 65 6e 20 63 6f 64 65 73   All token codes
0190: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
01a0: 65 72 73 20 77 69 74 68 20 23 64 65 66 69 6e 65  ers with #define
01b0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
01c0: 68 20 22 54 4b 5f 22 0a 25 74 6f 6b 65 6e 5f 70  h "TK_".%token_p
01d0: 72 65 66 69 78 20 46 54 53 35 5f 0a 0a 2f 2f 20  refix FTS5_..// 
01e0: 54 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  The type of the 
01f0: 64 61 74 61 20 61 74 74 61 63 68 65 64 20 74 6f  data attached to
0200: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 73 20 54   each token is T
0210: 6f 6b 65 6e 2e 20 20 54 68 69 73 20 69 73 20 61  oken.  This is a
0220: 6c 73 6f 20 74 68 65 0a 2f 2f 20 64 65 66 61 75  lso the.// defau
0230: 6c 74 20 74 79 70 65 20 66 6f 72 20 6e 6f 6e 2d  lt type for non-
0240: 74 65 72 6d 69 6e 61 6c 73 2e 0a 2f 2f 0a 25 74  terminals..//.%t
0250: 6f 6b 65 6e 5f 74 79 70 65 20 7b 46 74 73 35 54  oken_type {Fts5T
0260: 6f 6b 65 6e 7d 0a 25 64 65 66 61 75 6c 74 5f 74  oken}.%default_t
0270: 79 70 65 20 7b 46 74 73 35 54 6f 6b 65 6e 7d 0a  ype {Fts5Token}.
0280: 0a 2f 2f 20 54 68 65 20 67 65 6e 65 72 61 74 65  .// The generate
0290: 64 20 70 61 72 73 65 72 20 66 75 6e 63 74 69 6f  d parser functio
02a0: 6e 20 74 61 6b 65 73 20 61 20 34 74 68 20 61 72  n takes a 4th ar
02b0: 67 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f 77  gument as follow
02c0: 73 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65  s:.%extra_argume
02d0: 6e 74 20 7b 46 74 73 35 50 61 72 73 65 20 2a 70  nt {Fts5Parse *p
02e0: 50 61 72 73 65 7d 0a 0a 2f 2f 20 54 68 69 73 20  Parse}..// This 
02f0: 63 6f 64 65 20 72 75 6e 73 20 77 68 65 6e 65 76  code runs whenev
0300: 65 72 20 74 68 65 72 65 20 69 73 20 61 20 73 79  er there is a sy
0310: 6e 74 61 78 20 65 72 72 6f 72 0a 2f 2f 0a 25 73  ntax error.//.%s
0320: 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b 0a 20 20  yntax_error {.  
0330: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 79 79 6d  UNUSED_PARAM(yym
0340: 61 6a 6f 72 29 3b 20 2f 2a 20 53 69 6c 65 6e 63  ajor); /* Silenc
0350: 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
0360: 6e 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ning */.  sqlite
0370: 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28  3Fts5ParseError(
0380: 0a 20 20 20 20 70 50 61 72 73 65 2c 20 22 66 74  .    pParse, "ft
0390: 73 35 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  s5: syntax error
03a0: 20 6e 65 61 72 20 5c 22 25 2e 2a 73 5c 22 22 2c   near \"%.*s\"",
03b0: 54 4f 4b 45 4e 2e 6e 2c 54 4f 4b 45 4e 2e 70 0a  TOKEN.n,TOKEN.p.
03c0: 20 20 29 3b 0a 7d 0a 25 73 74 61 63 6b 5f 6f 76    );.}.%stack_ov
03d0: 65 72 66 6c 6f 77 20 7b 0a 20 20 73 71 6c 69 74  erflow {.  sqlit
03e0: 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72  e3Fts5ParseError
03f0: 28 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20  (pParse, "fts5: 
0400: 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65  parser stack ove
0410: 72 66 6c 6f 77 22 29 3b 0a 7d 0a 0a 2f 2f 20 54  rflow");.}..// T
0420: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 67  he name of the g
0430: 65 6e 65 72 61 74 65 64 20 70 72 6f 63 65 64 75  enerated procedu
0440: 72 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  re that implemen
0450: 74 73 20 74 68 65 20 70 61 72 73 65 72 0a 2f 2f  ts the parser.//
0460: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
0470: 25 6e 61 6d 65 20 73 71 6c 69 74 65 33 46 74 73  %name sqlite3Fts
0480: 35 50 61 72 73 65 72 0a 0a 2f 2f 20 54 68 65 20  5Parser..// The 
0490: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 69  following text i
04a0: 73 20 69 6e 63 6c 75 64 65 64 20 6e 65 61 72 20  s included near 
04b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
04c0: 20 74 68 65 20 43 20 73 6f 75 72 63 65 0a 2f 2f   the C source.//
04d0: 20 63 6f 64 65 20 66 69 6c 65 20 74 68 61 74 20   code file that 
04e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 70  implements the p
04f0: 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c 75  arser..//.%inclu
0500: 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 66  de {.#include "f
0510: 74 73 35 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  ts5Int.h".#inclu
0520: 64 65 20 22 66 74 73 35 70 61 72 73 65 2e 68 22  de "fts5parse.h"
0530: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
0540: 61 6c 6c 20 65 72 72 6f 72 20 72 65 63 6f 76 65  all error recove
0550: 72 79 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  ry processing in
0560: 20 74 68 65 20 70 61 72 73 65 72 20 70 75 73 68   the parser push
0570: 2d 64 6f 77 6e 0a 2a 2a 20 61 75 74 6f 6d 61 74  -down.** automat
0580: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59  on..*/.#define Y
0590: 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59  YNOERRORRECOVERY
05a0: 20 31 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 79   1../*.** Make y
05b0: 79 74 65 73 74 63 61 73 65 28 29 20 74 68 65 20  ytestcase() the 
05c0: 73 61 6d 65 20 61 73 20 74 65 73 74 63 61 73 65  same as testcase
05d0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 79 79  ().*/.#define yy
05e0: 74 65 73 74 63 61 73 65 28 58 29 20 74 65 73 74  testcase(X) test
05f0: 63 61 73 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 49  case(X)../*.** I
0600: 6e 64 69 63 61 74 65 20 74 68 61 74 20 73 71 6c  ndicate that sql
0610: 69 74 65 33 50 61 72 73 65 72 46 72 65 65 28 29  ite3ParserFree()
0620: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63   will never be c
0630: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 6e 75 6c  alled with a nul
0640: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  l.** pointer..*/
0650: 0a 23 64 65 66 69 6e 65 20 59 59 50 41 52 53 45  .#define YYPARSE
0660: 46 52 45 45 4e 4f 54 4e 55 4c 4c 20 31 0a 0a 2f  FREENOTNULL 1../
0670: 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
0680: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 74 68   datatype for th
0690: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
06a0: 65 20 6d 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69  e malloc() routi
06b0: 6e 65 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74  ne passed.** int
06c0: 6f 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 41  o sqlite3ParserA
06d0: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 64 65 66  lloc().  The def
06e0: 61 75 6c 74 20 69 73 20 73 69 7a 65 5f 74 2e 0a  ault is size_t..
06f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 4d 41 4c  */.#define YYMAL
0700: 4c 4f 43 41 52 47 54 59 50 45 20 20 75 36 34 0a  LOCARGTYPE  u64.
0710: 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75  .} // end %inclu
0720: 64 65 0a 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c  de..%left OR..%l
0730: 65 66 74 20 41 4e 44 2e 0a 25 6c 65 66 74 20 4e  eft AND..%left N
0740: 4f 54 2e 0a 25 6c 65 66 74 20 54 45 52 4d 2e 0a  OT..%left TERM..
0750: 25 6c 65 66 74 20 43 4f 4c 4f 4e 2e 0a 0a 69 6e  %left COLON...in
0760: 70 75 74 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e  put ::= expr(X).
0770: 20 7b 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   { sqlite3Fts5Pa
0780: 72 73 65 46 69 6e 69 73 68 65 64 28 70 50 61 72  rseFinished(pPar
0790: 73 65 2c 20 58 29 3b 20 7d 0a 25 64 65 73 74 72  se, X); }.%destr
07a0: 75 63 74 6f 72 20 69 6e 70 75 74 20 7b 20 28 76  uctor input { (v
07b0: 6f 69 64 29 70 50 61 72 73 65 3b 20 7d 0a 0a 25  oid)pParse; }..%
07c0: 74 79 70 65 20 63 6e 65 61 72 73 65 74 20 20 20  type cnearset   
07d0: 20 7b 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 7d   {Fts5ExprNode*}
07e0: 0a 25 74 79 70 65 20 65 78 70 72 20 20 20 20 20  .%type expr     
07f0: 20 20 20 7b 46 74 73 35 45 78 70 72 4e 6f 64 65     {Fts5ExprNode
0800: 2a 7d 0a 25 74 79 70 65 20 65 78 70 72 6c 69 73  *}.%type exprlis
0810: 74 20 20 20 20 7b 46 74 73 35 45 78 70 72 4e 6f  t    {Fts5ExprNo
0820: 64 65 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  de*}.%destructor
0830: 20 63 6e 65 61 72 73 65 74 20 7b 20 73 71 6c 69   cnearset { sqli
0840: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
0850: 46 72 65 65 28 24 24 29 3b 20 7d 0a 25 64 65 73  Free($$); }.%des
0860: 74 72 75 63 74 6f 72 20 65 78 70 72 20 20 20 20  tructor expr    
0870: 20 7b 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   { sqlite3Fts5Pa
0880: 72 73 65 4e 6f 64 65 46 72 65 65 28 24 24 29 3b  rseNodeFree($$);
0890: 20 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65   }.%destructor e
08a0: 78 70 72 6c 69 73 74 20 7b 20 73 71 6c 69 74 65  xprlist { sqlite
08b0: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
08c0: 65 65 28 24 24 29 3b 20 7d 0a 0a 25 74 79 70 65  ee($$); }..%type
08d0: 20 63 6f 6c 73 65 74 20 7b 46 74 73 35 43 6f 6c   colset {Fts5Col
08e0: 73 65 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  set*}.%destructo
08f0: 72 20 63 6f 6c 73 65 74 20 7b 20 73 71 6c 69 74  r colset { sqlit
0900: 65 33 5f 66 72 65 65 28 24 24 29 3b 20 7d 0a 25  e3_free($$); }.%
0910: 74 79 70 65 20 63 6f 6c 73 65 74 6c 69 73 74 20  type colsetlist 
0920: 7b 46 74 73 35 43 6f 6c 73 65 74 2a 7d 0a 25 64  {Fts5Colset*}.%d
0930: 65 73 74 72 75 63 74 6f 72 20 63 6f 6c 73 65 74  estructor colset
0940: 6c 69 73 74 20 7b 20 73 71 6c 69 74 65 33 5f 66  list { sqlite3_f
0950: 72 65 65 28 24 24 29 3b 20 7d 0a 0a 63 6f 6c 73  ree($$); }..cols
0960: 65 74 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 20  et(A) ::= MINUS 
0970: 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 28 58  LCP colsetlist(X
0980: 29 20 52 43 50 2e 20 7b 20 0a 20 20 20 20 41 20  ) RCP. { .    A 
0990: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  = sqlite3Fts5Par
09a0: 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 70  seColsetInvert(p
09b0: 50 61 72 73 65 2c 20 58 29 3b 0a 7d 0a 63 6f 6c  Parse, X);.}.col
09c0: 73 65 74 28 41 29 20 3a 3a 3d 20 4c 43 50 20 63  set(A) ::= LCP c
09d0: 6f 6c 73 65 74 6c 69 73 74 28 58 29 20 52 43 50  olsetlist(X) RCP
09e0: 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 63 6f 6c  . { A = X; }.col
09f0: 73 65 74 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  set(A) ::= STRIN
0a00: 47 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  G(X). {.  A = sq
0a10: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
0a20: 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lset(pParse, 0, 
0a30: 26 58 29 3b 0a 7d 0a 63 6f 6c 73 65 74 28 41 29  &X);.}.colset(A)
0a40: 20 3a 3a 3d 20 4d 49 4e 55 53 20 53 54 52 49 4e   ::= MINUS STRIN
0a50: 47 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  G(X). {.  A = sq
0a60: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
0a70: 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lset(pParse, 0, 
0a80: 26 58 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &X);.  A = sqlit
0a90: 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65  e3Fts5ParseColse
0aa0: 74 49 6e 76 65 72 74 28 70 50 61 72 73 65 2c 20  tInvert(pParse, 
0ab0: 41 29 3b 0a 7d 0a 0a 63 6f 6c 73 65 74 6c 69 73  A);.}..colsetlis
0ac0: 74 28 41 29 20 3a 3a 3d 20 63 6f 6c 73 65 74 6c  t(A) ::= colsetl
0ad0: 69 73 74 28 59 29 20 53 54 52 49 4e 47 28 58 29  ist(Y) STRING(X)
0ae0: 2e 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74  . { .  A = sqlit
0af0: 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65  e3Fts5ParseColse
0b00: 74 28 70 50 61 72 73 65 2c 20 59 2c 20 26 58 29  t(pParse, Y, &X)
0b10: 3b 20 7d 0a 63 6f 6c 73 65 74 6c 69 73 74 28 41  ; }.colsetlist(A
0b20: 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e  ) ::= STRING(X).
0b30: 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   { .  A = sqlite
0b40: 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74  3Fts5ParseColset
0b50: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 58 29 3b  (pParse, 0, &X);
0b60: 20 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d   .}..expr(A) ::=
0b70: 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 70   expr(X) AND exp
0b80: 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Y). {.  A = sq
0b90: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
0ba0: 64 65 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f  de(pParse, FTS5_
0bb0: 41 4e 44 2c 20 58 2c 20 59 2c 20 30 29 3b 0a 7d  AND, X, Y, 0);.}
0bc0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
0bd0: 72 28 58 29 20 4f 52 20 65 78 70 72 28 59 29 2e  r(X) OR expr(Y).
0be0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
0bf0: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50  Fts5ParseNode(pP
0c00: 61 72 73 65 2c 20 46 54 53 35 5f 4f 52 2c 20 58  arse, FTS5_OR, X
0c10: 2c 20 59 2c 20 30 29 3b 0a 7d 0a 65 78 70 72 28  , Y, 0);.}.expr(
0c20: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e  A) ::= expr(X) N
0c30: 4f 54 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20  OT expr(Y). {.  
0c40: 41 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  A = sqlite3Fts5P
0c50: 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c  arseNode(pParse,
0c60: 20 46 54 53 35 5f 4e 4f 54 2c 20 58 2c 20 59 2c   FTS5_NOT, X, Y,
0c70: 20 30 29 3b 0a 7d 0a 0a 65 78 70 72 28 41 29 20   0);.}..expr(A) 
0c80: 3a 3a 3d 20 63 6f 6c 73 65 74 28 58 29 20 43 4f  ::= colset(X) CO
0c90: 4c 4f 4e 20 4c 50 20 65 78 70 72 28 59 29 20 52  LON LP expr(Y) R
0ca0: 50 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 46 74  P. {.  sqlite3Ft
0cb0: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
0cc0: 28 70 50 61 72 73 65 2c 20 59 2c 20 58 29 3b 0a  (pParse, Y, X);.
0cd0: 20 20 41 20 3d 20 59 3b 0a 7d 0a 65 78 70 72 28    A = Y;.}.expr(
0ce0: 41 29 20 3a 3a 3d 20 4c 50 20 65 78 70 72 28 58  A) ::= LP expr(X
0cf0: 29 20 52 50 2e 20 7b 41 20 3d 20 58 3b 7d 0a 65  ) RP. {A = X;}.e
0d00: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c  xpr(A) ::= exprl
0d10: 69 73 74 28 58 29 2e 20 20 20 7b 41 20 3d 20 58  ist(X).   {A = X
0d20: 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20  ;}..exprlist(A) 
0d30: 3a 3a 3d 20 63 6e 65 61 72 73 65 74 28 58 29 2e  ::= cnearset(X).
0d40: 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 6c 69   {A = X;}.exprli
0d50: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c 69  st(A) ::= exprli
0d60: 73 74 28 58 29 20 63 6e 65 61 72 73 65 74 28 59  st(X) cnearset(Y
0d70: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
0d80: 65 33 46 74 73 35 50 61 72 73 65 49 6d 70 6c 69  e3Fts5ParseImpli
0d90: 63 69 74 41 6e 64 28 70 50 61 72 73 65 2c 20 58  citAnd(pParse, X
0da0: 2c 20 59 29 3b 0a 7d 0a 0a 63 6e 65 61 72 73 65  , Y);.}..cnearse
0db0: 74 28 41 29 20 3a 3a 3d 20 6e 65 61 72 73 65 74  t(A) ::= nearset
0dc0: 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73 71  (X). { .  A = sq
0dd0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
0de0: 64 65 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f  de(pParse, FTS5_
0df0: 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 58 29  STRING, 0, 0, X)
0e00: 3b 20 0a 7d 0a 63 6e 65 61 72 73 65 74 28 41 29  ; .}.cnearset(A)
0e10: 20 3a 3a 3d 20 63 6f 6c 73 65 74 28 58 29 20 43   ::= colset(X) C
0e20: 4f 4c 4f 4e 20 6e 65 61 72 73 65 74 28 59 29 2e  OLON nearset(Y).
0e30: 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   { .  A = sqlite
0e40: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70  3Fts5ParseNode(p
0e50: 50 61 72 73 65 2c 20 46 54 53 35 5f 53 54 52 49  Parse, FTS5_STRI
0e60: 4e 47 2c 20 30 2c 20 30 2c 20 59 29 3b 20 0a 20  NG, 0, 0, Y); . 
0e70: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
0e80: 65 53 65 74 43 6f 6c 73 65 74 28 70 50 61 72 73  eSetColset(pPars
0e90: 65 2c 20 41 2c 20 58 29 3b 0a 7d 0a 0a 0a 25 74  e, A, X);.}...%t
0ea0: 79 70 65 20 6e 65 61 72 73 65 74 20 20 20 20 20  ype nearset     
0eb0: 7b 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  {Fts5ExprNearset
0ec0: 2a 7d 0a 25 74 79 70 65 20 6e 65 61 72 70 68 72  *}.%type nearphr
0ed0: 61 73 65 73 20 7b 46 74 73 35 45 78 70 72 4e 65  ases {Fts5ExprNe
0ee0: 61 72 73 65 74 2a 7d 0a 25 64 65 73 74 72 75 63  arset*}.%destruc
0ef0: 74 6f 72 20 6e 65 61 72 73 65 74 20 7b 20 73 71  tor nearset { sq
0f00: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
0f10: 61 72 73 65 74 46 72 65 65 28 24 24 29 3b 20 7d  arsetFree($$); }
0f20: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65 61  .%destructor nea
0f30: 72 70 68 72 61 73 65 73 20 7b 20 73 71 6c 69 74  rphrases { sqlit
0f40: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
0f50: 65 74 46 72 65 65 28 24 24 29 3b 20 7d 0a 0a 6e  etFree($$); }..n
0f60: 65 61 72 73 65 74 28 41 29 20 3a 3a 3d 20 70 68  earset(A) ::= ph
0f70: 72 61 73 65 28 59 29 2e 20 7b 20 41 20 3d 20 73  rase(Y). { A = s
0f80: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
0f90: 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30  earset(pParse, 0
0fa0: 2c 20 59 29 3b 20 7d 0a 6e 65 61 72 73 65 74 28  , Y); }.nearset(
0fb0: 41 29 20 3a 3a 3d 20 43 41 52 45 54 20 70 68 72  A) ::= CARET phr
0fc0: 61 73 65 28 59 29 2e 20 7b 20 0a 20 20 73 71 6c  ase(Y). { .  sql
0fd0: 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
0fe0: 43 61 72 65 74 28 59 29 3b 0a 20 20 41 20 3d 20  Caret(Y);.  A = 
0ff0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
1000: 4e 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20  Nearset(pParse, 
1010: 30 2c 20 59 29 3b 20 0a 7d 0a 6e 65 61 72 73 65  0, Y); .}.nearse
1020: 74 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28  t(A) ::= STRING(
1030: 58 29 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65  X) LP nearphrase
1040: 73 28 59 29 20 6e 65 61 72 64 69 73 74 5f 6f 70  s(Y) neardist_op
1050: 74 28 5a 29 20 52 50 2e 20 7b 0a 20 20 73 71 6c  t(Z) RP. {.  sql
1060: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
1070: 72 28 70 50 61 72 73 65 2c 20 26 58 29 3b 0a 20  r(pParse, &X);. 
1080: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1090: 65 53 65 74 44 69 73 74 61 6e 63 65 28 70 50 61  eSetDistance(pPa
10a0: 72 73 65 2c 20 59 2c 20 26 5a 29 3b 0a 20 20 41  rse, Y, &Z);.  A
10b0: 20 3d 20 59 3b 0a 7d 0a 0a 6e 65 61 72 70 68 72   = Y;.}..nearphr
10c0: 61 73 65 73 28 41 29 20 3a 3a 3d 20 70 68 72 61  ases(A) ::= phra
10d0: 73 65 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20  se(X). { .  A = 
10e0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
10f0: 4e 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20  Nearset(pParse, 
1100: 30 2c 20 58 29 3b 20 0a 7d 0a 6e 65 61 72 70 68  0, X); .}.nearph
1110: 72 61 73 65 73 28 41 29 20 3a 3a 3d 20 6e 65 61  rases(A) ::= nea
1120: 72 70 68 72 61 73 65 73 28 58 29 20 70 68 72 61  rphrases(X) phra
1130: 73 65 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  se(Y). {.  A = s
1140: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
1150: 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 58  earset(pParse, X
1160: 2c 20 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , Y);.}../*.** T
1170: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 22 2c 20 3c  he optional ", <
1180: 69 6e 74 65 67 65 72 3e 22 20 61 74 20 74 68 65  integer>" at the
1190: 20 65 6e 64 20 6f 66 20 74 68 65 20 4e 45 41 52   end of the NEAR
11a0: 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  () arguments..*/
11b0: 0a 6e 65 61 72 64 69 73 74 5f 6f 70 74 28 41 29  .neardist_opt(A)
11c0: 20 3a 3a 3d 20 2e 20 7b 20 41 2e 70 20 3d 20 30   ::= . { A.p = 0
11d0: 3b 20 41 2e 6e 20 3d 20 30 3b 20 7d 0a 6e 65 61  ; A.n = 0; }.nea
11e0: 72 64 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  rdist_opt(A) ::=
11f0: 20 43 4f 4d 4d 41 20 53 54 52 49 4e 47 28 58 29   COMMA STRING(X)
1200: 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 2f 2a  . { A = X; }../*
1210: 0a 2a 2a 20 41 20 70 68 72 61 73 65 2e 20 41 20  .** A phrase. A 
1220: 73 65 74 20 6f 66 20 70 72 69 6d 69 74 69 76 65  set of primitive
1230: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 22  s connected by "
1240: 2b 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 45 78  +" operators. Ex
1250: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
1260: 20 20 22 74 68 65 22 20 2b 20 22 71 75 69 63 6b    "the" + "quick
1270: 20 62 72 6f 77 6e 22 20 2b 20 66 6f 20 2a 0a 2a   brown" + fo *.*
1280: 2a 20 20 20 20 20 22 74 68 65 20 71 75 69 63 6b  *     "the quick
1290: 20 62 72 6f 77 6e 20 66 6f 22 20 2a 0a 2a 2a 20   brown fo" *.** 
12a0: 20 20 20 20 74 68 65 2b 71 75 69 63 6b 2b 62 72      the+quick+br
12b0: 6f 77 6e 2b 66 6f 2a 0a 2a 2f 0a 25 74 79 70 65  own+fo*.*/.%type
12c0: 20 70 68 72 61 73 65 20 7b 46 74 73 35 45 78 70   phrase {Fts5Exp
12d0: 72 50 68 72 61 73 65 2a 7d 0a 25 64 65 73 74 72  rPhrase*}.%destr
12e0: 75 63 74 6f 72 20 70 68 72 61 73 65 20 7b 20 73  uctor phrase { s
12f0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 50  qlite3Fts5ParseP
1300: 68 72 61 73 65 46 72 65 65 28 24 24 29 3b 20 7d  hraseFree($$); }
1310: 0a 0a 70 68 72 61 73 65 28 41 29 20 3a 3a 3d 20  ..phrase(A) ::= 
1320: 70 68 72 61 73 65 28 58 29 20 50 4c 55 53 20 53  phrase(X) PLUS S
1330: 54 52 49 4e 47 28 59 29 20 73 74 61 72 5f 6f 70  TRING(Y) star_op
1340: 74 28 5a 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73  t(Z). { .  A = s
1350: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 54  qlite3Fts5ParseT
1360: 65 72 6d 28 70 50 61 72 73 65 2c 20 58 2c 20 26  erm(pParse, X, &
1370: 59 2c 20 5a 29 3b 0a 7d 0a 70 68 72 61 73 65 28  Y, Z);.}.phrase(
1380: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 59 29  A) ::= STRING(Y)
1390: 20 73 74 61 72 5f 6f 70 74 28 5a 29 2e 20 7b 20   star_opt(Z). { 
13a0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 46 74  .  A = sqlite3Ft
13b0: 73 35 50 61 72 73 65 54 65 72 6d 28 70 50 61 72  s5ParseTerm(pPar
13c0: 73 65 2c 20 30 2c 20 26 59 2c 20 5a 29 3b 0a 7d  se, 0, &Y, Z);.}
13d0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 61 6c  ../*.** Optional
13e0: 20 22 2a 22 20 63 68 61 72 61 63 74 65 72 2e 0a   "*" character..
13f0: 2a 2f 0a 25 74 79 70 65 20 73 74 61 72 5f 6f 70  */.%type star_op
1400: 74 20 7b 69 6e 74 7d 0a 73 74 61 72 5f 6f 70 74  t {int}.star_opt
1410: 28 41 29 20 3a 3a 3d 20 53 54 41 52 2e 20 7b 20  (A) ::= STAR. { 
1420: 41 20 3d 20 31 3b 20 7d 0a 73 74 61 72 5f 6f 70  A = 1; }.star_op
1430: 74 28 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d  t(A) ::= . { A =
1440: 20 30 3b 20 7d 0a                                 0; }.