/ Hex Artifact Content
Login

Artifact fcc5e92e570d38cab38488b2109cbf67468923b2:


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 65 78 70 72 28  ee($$); }..expr(
08d0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41  A) ::= expr(X) A
08e0: 4e 44 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20  ND expr(Y). {.  
08f0: 41 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  A = sqlite3Fts5P
0900: 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c  arseNode(pParse,
0910: 20 46 54 53 35 5f 41 4e 44 2c 20 58 2c 20 59 2c   FTS5_AND, X, Y,
0920: 20 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a   0);.}.expr(A) :
0930: 3a 3d 20 65 78 70 72 28 58 29 20 4f 52 20 65 78  := expr(X) OR ex
0940: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
0950: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
0960: 6f 64 65 28 70 50 61 72 73 65 2c 20 46 54 53 35  ode(pParse, FTS5
0970: 5f 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b 0a 7d  _OR, X, Y, 0);.}
0980: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
0990: 72 28 58 29 20 4e 4f 54 20 65 78 70 72 28 59 29  r(X) NOT expr(Y)
09a0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
09b0: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70  3Fts5ParseNode(p
09c0: 50 61 72 73 65 2c 20 46 54 53 35 5f 4e 4f 54 2c  Parse, FTS5_NOT,
09d0: 20 58 2c 20 59 2c 20 30 29 3b 0a 7d 0a 0a 65 78   X, Y, 0);.}..ex
09e0: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78 70  pr(A) ::= LP exp
09f0: 72 28 58 29 20 52 50 2e 20 7b 41 20 3d 20 58 3b  r(X) RP. {A = X;
0a00: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
0a10: 70 72 6c 69 73 74 28 58 29 2e 20 20 20 7b 41 20  prlist(X).   {A 
0a20: 3d 20 58 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28  = X;}..exprlist(
0a30: 41 29 20 3a 3a 3d 20 63 6e 65 61 72 73 65 74 28  A) ::= cnearset(
0a40: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70  X). {A = X;}.exp
0a50: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  rlist(A) ::= exp
0a60: 72 6c 69 73 74 28 58 29 20 63 6e 65 61 72 73 65  rlist(X) cnearse
0a70: 74 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  t(Y). {.  A = sq
0a80: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 49 6d  lite3Fts5ParseIm
0a90: 70 6c 69 63 69 74 41 6e 64 28 70 50 61 72 73 65  plicitAnd(pParse
0aa0: 2c 20 58 2c 20 59 29 3b 0a 7d 0a 0a 63 6e 65 61  , X, Y);.}..cnea
0ab0: 72 73 65 74 28 41 29 20 3a 3a 3d 20 6e 65 61 72  rset(A) ::= near
0ac0: 73 65 74 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d  set(X). { .  A =
0ad0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
0ae0: 65 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 46 54  eNode(pParse, FT
0af0: 53 35 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  S5_STRING, 0, 0,
0b00: 20 58 29 3b 20 0a 7d 0a 63 6e 65 61 72 73 65 74   X); .}.cnearset
0b10: 28 41 29 20 3a 3a 3d 20 63 6f 6c 73 65 74 28 58  (A) ::= colset(X
0b20: 29 20 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74 28  ) COLON nearset(
0b30: 59 29 2e 20 7b 20 0a 20 20 73 71 6c 69 74 65 33  Y). { .  sqlite3
0b40: 46 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73  Fts5ParseSetCols
0b50: 65 74 28 70 50 61 72 73 65 2c 20 59 2c 20 58 29  et(pParse, Y, X)
0b60: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 46  ;.  A = sqlite3F
0b70: 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50 61  ts5ParseNode(pPa
0b80: 72 73 65 2c 20 46 54 53 35 5f 53 54 52 49 4e 47  rse, FTS5_STRING
0b90: 2c 20 30 2c 20 30 2c 20 59 29 3b 20 0a 7d 0a 0a  , 0, 0, Y); .}..
0ba0: 25 74 79 70 65 20 63 6f 6c 73 65 74 20 7b 46 74  %type colset {Ft
0bb0: 73 35 43 6f 6c 73 65 74 2a 7d 0a 25 64 65 73 74  s5Colset*}.%dest
0bc0: 72 75 63 74 6f 72 20 63 6f 6c 73 65 74 20 7b 20  ructor colset { 
0bd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 24 24 29  sqlite3_free($$)
0be0: 3b 20 7d 0a 25 74 79 70 65 20 63 6f 6c 73 65 74  ; }.%type colset
0bf0: 6c 69 73 74 20 7b 46 74 73 35 43 6f 6c 73 65 74  list {Fts5Colset
0c00: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
0c10: 6f 6c 73 65 74 6c 69 73 74 20 7b 20 73 71 6c 69  olsetlist { sqli
0c20: 74 65 33 5f 66 72 65 65 28 24 24 29 3b 20 7d 0a  te3_free($$); }.
0c30: 0a 63 6f 6c 73 65 74 28 41 29 20 3a 3a 3d 20 4c  .colset(A) ::= L
0c40: 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 28 58 29  CP colsetlist(X)
0c50: 20 52 43 50 2e 20 7b 20 41 20 3d 20 58 3b 20 7d   RCP. { A = X; }
0c60: 0a 63 6f 6c 73 65 74 28 41 29 20 3a 3a 3d 20 53  .colset(A) ::= S
0c70: 54 52 49 4e 47 28 58 29 2e 20 7b 0a 20 20 41 20  TRING(X). {.  A 
0c80: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  = sqlite3Fts5Par
0c90: 73 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c  seColset(pParse,
0ca0: 20 30 2c 20 26 58 29 3b 0a 7d 0a 0a 63 6f 6c 73   0, &X);.}..cols
0cb0: 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 63 6f  etlist(A) ::= co
0cc0: 6c 73 65 74 6c 69 73 74 28 59 29 20 53 54 52 49  lsetlist(Y) STRI
0cd0: 4e 47 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20  NG(X). { .  A = 
0ce0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
0cf0: 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 59  Colset(pParse, Y
0d00: 2c 20 26 58 29 3b 20 7d 0a 63 6f 6c 73 65 74 6c  , &X); }.colsetl
0d10: 69 73 74 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  ist(A) ::= STRIN
0d20: 47 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73  G(X). { .  A = s
0d30: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43  qlite3Fts5ParseC
0d40: 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  olset(pParse, 0,
0d50: 20 26 58 29 3b 20 0a 7d 0a 0a 0a 25 74 79 70 65   &X); .}...%type
0d60: 20 6e 65 61 72 73 65 74 20 20 20 20 20 7b 46 74   nearset     {Ft
0d70: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 7d 0a  s5ExprNearset*}.
0d80: 25 74 79 70 65 20 6e 65 61 72 70 68 72 61 73 65  %type nearphrase
0d90: 73 20 7b 46 74 73 35 45 78 70 72 4e 65 61 72 73  s {Fts5ExprNears
0da0: 65 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  et*}.%destructor
0db0: 20 6e 65 61 72 73 65 74 20 7b 20 73 71 6c 69 74   nearset { sqlit
0dc0: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
0dd0: 65 74 46 72 65 65 28 24 24 29 3b 20 7d 0a 25 64  etFree($$); }.%d
0de0: 65 73 74 72 75 63 74 6f 72 20 6e 65 61 72 70 68  estructor nearph
0df0: 72 61 73 65 73 20 7b 20 73 71 6c 69 74 65 33 46  rases { sqlite3F
0e00: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46  ts5ParseNearsetF
0e10: 72 65 65 28 24 24 29 3b 20 7d 0a 0a 6e 65 61 72  ree($$); }..near
0e20: 73 65 74 28 41 29 20 3a 3a 3d 20 70 68 72 61 73  set(A) ::= phras
0e30: 65 28 58 29 2e 20 7b 20 41 20 3d 20 73 71 6c 69  e(X). { A = sqli
0e40: 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72  te3Fts5ParseNear
0e50: 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 58  set(pParse, 0, X
0e60: 29 3b 20 7d 0a 6e 65 61 72 73 65 74 28 41 29 20  ); }.nearset(A) 
0e70: 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 20 4c 50  ::= STRING(X) LP
0e80: 20 6e 65 61 72 70 68 72 61 73 65 73 28 59 29 20   nearphrases(Y) 
0e90: 6e 65 61 72 64 69 73 74 5f 6f 70 74 28 5a 29 20  neardist_opt(Z) 
0ea0: 52 50 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 46  RP. {.  sqlite3F
0eb0: 74 73 35 50 61 72 73 65 4e 65 61 72 28 70 50 61  ts5ParseNear(pPa
0ec0: 72 73 65 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69  rse, &X);.  sqli
0ed0: 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74 44  te3Fts5ParseSetD
0ee0: 69 73 74 61 6e 63 65 28 70 50 61 72 73 65 2c 20  istance(pParse, 
0ef0: 59 2c 20 26 5a 29 3b 0a 20 20 41 20 3d 20 59 3b  Y, &Z);.  A = Y;
0f00: 0a 7d 0a 0a 6e 65 61 72 70 68 72 61 73 65 73 28  .}..nearphrases(
0f10: 41 29 20 3a 3a 3d 20 70 68 72 61 73 65 28 58 29  A) ::= phrase(X)
0f20: 2e 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74  . { .  A = sqlit
0f30: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
0f40: 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 58 29  et(pParse, 0, X)
0f50: 3b 20 0a 7d 0a 6e 65 61 72 70 68 72 61 73 65 73  ; .}.nearphrases
0f60: 28 41 29 20 3a 3a 3d 20 6e 65 61 72 70 68 72 61  (A) ::= nearphra
0f70: 73 65 73 28 58 29 20 70 68 72 61 73 65 28 59 29  ses(X) phrase(Y)
0f80: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
0f90: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
0fa0: 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 29 3b  t(pParse, X, Y);
0fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70  .}../*.** The op
0fc0: 74 69 6f 6e 61 6c 20 22 2c 20 3c 69 6e 74 65 67  tional ", <integ
0fd0: 65 72 3e 22 20 61 74 20 74 68 65 20 65 6e 64 20  er>" at the end 
0fe0: 6f 66 20 74 68 65 20 4e 45 41 52 28 29 20 61 72  of the NEAR() ar
0ff0: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 6e 65 61 72  guments..*/.near
1000: 64 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  dist_opt(A) ::= 
1010: 2e 20 7b 20 41 2e 70 20 3d 20 30 3b 20 41 2e 6e  . { A.p = 0; A.n
1020: 20 3d 20 30 3b 20 7d 0a 6e 65 61 72 64 69 73 74   = 0; }.neardist
1030: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d  _opt(A) ::= COMM
1040: 41 20 53 54 52 49 4e 47 28 58 29 2e 20 7b 20 41  A STRING(X). { A
1050: 20 3d 20 58 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = X; }../*.** A
1060: 20 70 68 72 61 73 65 2e 20 41 20 73 65 74 20 6f   phrase. A set o
1070: 66 20 70 72 69 6d 69 74 69 76 65 73 20 63 6f 6e  f primitives con
1080: 6e 65 63 74 65 64 20 62 79 20 22 2b 22 20 6f 70  nected by "+" op
1090: 65 72 61 74 6f 72 73 2e 20 45 78 61 6d 70 6c 65  erators. Example
10a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 74 68  s:.**.**     "th
10b0: 65 22 20 2b 20 22 71 75 69 63 6b 20 62 72 6f 77  e" + "quick brow
10c0: 6e 22 20 2b 20 66 6f 20 2a 0a 2a 2a 20 20 20 20  n" + fo *.**    
10d0: 20 22 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77   "the quick brow
10e0: 6e 20 66 6f 22 20 2a 0a 2a 2a 20 20 20 20 20 74  n fo" *.**     t
10f0: 68 65 2b 71 75 69 63 6b 2b 62 72 6f 77 6e 2b 66  he+quick+brown+f
1100: 6f 2a 0a 2a 2f 0a 25 74 79 70 65 20 70 68 72 61  o*.*/.%type phra
1110: 73 65 20 7b 46 74 73 35 45 78 70 72 50 68 72 61  se {Fts5ExprPhra
1120: 73 65 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  se*}.%destructor
1130: 20 70 68 72 61 73 65 20 7b 20 73 71 6c 69 74 65   phrase { sqlite
1140: 33 46 74 73 35 50 61 72 73 65 50 68 72 61 73 65  3Fts5ParsePhrase
1150: 46 72 65 65 28 24 24 29 3b 20 7d 0a 0a 70 68 72  Free($$); }..phr
1160: 61 73 65 28 41 29 20 3a 3a 3d 20 70 68 72 61 73  ase(A) ::= phras
1170: 65 28 58 29 20 50 4c 55 53 20 53 54 52 49 4e 47  e(X) PLUS STRING
1180: 28 59 29 20 73 74 61 72 5f 6f 70 74 28 5a 29 2e  (Y) star_opt(Z).
1190: 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   { .  A = sqlite
11a0: 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 70  3Fts5ParseTerm(p
11b0: 50 61 72 73 65 2c 20 58 2c 20 26 59 2c 20 5a 29  Parse, X, &Y, Z)
11c0: 3b 0a 7d 0a 70 68 72 61 73 65 28 41 29 20 3a 3a  ;.}.phrase(A) ::
11d0: 3d 20 53 54 52 49 4e 47 28 59 29 20 73 74 61 72  = STRING(Y) star
11e0: 5f 6f 70 74 28 5a 29 2e 20 7b 20 0a 20 20 41 20  _opt(Z). { .  A 
11f0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  = sqlite3Fts5Par
1200: 73 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 30  seTerm(pParse, 0
1210: 2c 20 26 59 2c 20 5a 29 3b 0a 7d 0a 0a 2f 2a 0a  , &Y, Z);.}../*.
1220: 2a 2a 20 4f 70 74 69 6f 6e 61 6c 20 22 2a 22 20  ** Optional "*" 
1230: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 25 74  character..*/.%t
1240: 79 70 65 20 73 74 61 72 5f 6f 70 74 20 7b 69 6e  ype star_opt {in
1250: 74 7d 0a 0a 73 74 61 72 5f 6f 70 74 28 41 29 20  t}..star_opt(A) 
1260: 3a 3a 3d 20 53 54 41 52 2e 20 7b 20 41 20 3d 20  ::= STAR. { A = 
1270: 31 3b 20 7d 0a 73 74 61 72 5f 6f 70 74 28 41 29  1; }.star_opt(A)
1280: 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30 3b 20   ::= . { A = 0; 
1290: 7d 0a                                            }.