/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e51b375403421b8b37428a89b095d00597129aae:


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 4d  .colset(A) ::= M
0c40: 49 4e 55 53 20 4c 43 50 20 63 6f 6c 73 65 74 6c  INUS LCP colsetl
0c50: 69 73 74 28 58 29 20 52 43 50 2e 20 7b 20 0a 20  ist(X) RCP. { . 
0c60: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 46 74     A = sqlite3Ft
0c70: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 49 6e 76  s5ParseColsetInv
0c80: 65 72 74 28 70 50 61 72 73 65 2c 20 58 29 3b 0a  ert(pParse, X);.
0c90: 7d 0a 63 6f 6c 73 65 74 28 41 29 20 3a 3a 3d 20  }.colset(A) ::= 
0ca0: 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 28 58  LCP colsetlist(X
0cb0: 29 20 52 43 50 2e 20 7b 20 41 20 3d 20 58 3b 20  ) RCP. { A = X; 
0cc0: 7d 0a 63 6f 6c 73 65 74 28 41 29 20 3a 3a 3d 20  }.colset(A) ::= 
0cd0: 53 54 52 49 4e 47 28 58 29 2e 20 7b 0a 20 20 41  STRING(X). {.  A
0ce0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
0cf0: 72 73 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65  rseColset(pParse
0d00: 2c 20 30 2c 20 26 58 29 3b 0a 7d 0a 63 6f 6c 73  , 0, &X);.}.cols
0d10: 65 74 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 20  et(A) ::= MINUS 
0d20: 53 54 52 49 4e 47 28 58 29 2e 20 7b 0a 20 20 41  STRING(X). {.  A
0d30: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
0d40: 72 73 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65  rseColset(pParse
0d50: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 41 20 3d 20  , 0, &X);.  A = 
0d60: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
0d70: 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 70 50 61  ColsetInvert(pPa
0d80: 72 73 65 2c 20 41 29 3b 0a 7d 0a 0a 63 6f 6c 73  rse, A);.}..cols
0d90: 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 63 6f  etlist(A) ::= co
0da0: 6c 73 65 74 6c 69 73 74 28 59 29 20 53 54 52 49  lsetlist(Y) STRI
0db0: 4e 47 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20  NG(X). { .  A = 
0dc0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
0dd0: 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 59  Colset(pParse, Y
0de0: 2c 20 26 58 29 3b 20 7d 0a 63 6f 6c 73 65 74 6c  , &X); }.colsetl
0df0: 69 73 74 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  ist(A) ::= STRIN
0e00: 47 28 58 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73  G(X). { .  A = s
0e10: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43  qlite3Fts5ParseC
0e20: 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  olset(pParse, 0,
0e30: 20 26 58 29 3b 20 0a 7d 0a 0a 25 74 79 70 65 20   &X); .}..%type 
0e40: 6e 65 61 72 73 65 74 20 20 20 20 20 7b 46 74 73  nearset     {Fts
0e50: 35 45 78 70 72 4e 65 61 72 73 65 74 2a 7d 0a 25  5ExprNearset*}.%
0e60: 74 79 70 65 20 6e 65 61 72 70 68 72 61 73 65 73  type nearphrases
0e70: 20 7b 46 74 73 35 45 78 70 72 4e 65 61 72 73 65   {Fts5ExprNearse
0e80: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
0e90: 6e 65 61 72 73 65 74 20 7b 20 73 71 6c 69 74 65  nearset { sqlite
0ea0: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
0eb0: 74 46 72 65 65 28 24 24 29 3b 20 7d 0a 25 64 65  tFree($$); }.%de
0ec0: 73 74 72 75 63 74 6f 72 20 6e 65 61 72 70 68 72  structor nearphr
0ed0: 61 73 65 73 20 7b 20 73 71 6c 69 74 65 33 46 74  ases { sqlite3Ft
0ee0: 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
0ef0: 65 65 28 24 24 29 3b 20 7d 0a 0a 6e 65 61 72 73  ee($$); }..nears
0f00: 65 74 28 41 29 20 3a 3a 3d 20 70 68 72 61 73 65  et(A) ::= phrase
0f10: 28 58 29 2e 20 7b 20 41 20 3d 20 73 71 6c 69 74  (X). { A = sqlit
0f20: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
0f30: 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 58 29  et(pParse, 0, X)
0f40: 3b 20 7d 0a 6e 65 61 72 73 65 74 28 41 29 20 3a  ; }.nearset(A) :
0f50: 3a 3d 20 53 54 52 49 4e 47 28 58 29 20 4c 50 20  := STRING(X) LP 
0f60: 6e 65 61 72 70 68 72 61 73 65 73 28 59 29 20 6e  nearphrases(Y) n
0f70: 65 61 72 64 69 73 74 5f 6f 70 74 28 5a 29 20 52  eardist_opt(Z) R
0f80: 50 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 46 74  P. {.  sqlite3Ft
0f90: 73 35 50 61 72 73 65 4e 65 61 72 28 70 50 61 72  s5ParseNear(pPar
0fa0: 73 65 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74  se, &X);.  sqlit
0fb0: 65 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69  e3Fts5ParseSetDi
0fc0: 73 74 61 6e 63 65 28 70 50 61 72 73 65 2c 20 59  stance(pParse, Y
0fd0: 2c 20 26 5a 29 3b 0a 20 20 41 20 3d 20 59 3b 0a  , &Z);.  A = Y;.
0fe0: 7d 0a 0a 6e 65 61 72 70 68 72 61 73 65 73 28 41  }..nearphrases(A
0ff0: 29 20 3a 3a 3d 20 70 68 72 61 73 65 28 58 29 2e  ) ::= phrase(X).
1000: 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   { .  A = sqlite
1010: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
1020: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 58 29 3b  t(pParse, 0, X);
1030: 20 0a 7d 0a 6e 65 61 72 70 68 72 61 73 65 73 28   .}.nearphrases(
1040: 41 29 20 3a 3a 3d 20 6e 65 61 72 70 68 72 61 73  A) ::= nearphras
1050: 65 73 28 58 29 20 70 68 72 61 73 65 28 59 29 2e  es(X) phrase(Y).
1060: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
1070: 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
1080: 28 70 50 61 72 73 65 2c 20 58 2c 20 59 29 3b 0a  (pParse, X, Y);.
1090: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  }../*.** The opt
10a0: 69 6f 6e 61 6c 20 22 2c 20 3c 69 6e 74 65 67 65  ional ", <intege
10b0: 72 3e 22 20 61 74 20 74 68 65 20 65 6e 64 20 6f  r>" at the end o
10c0: 66 20 74 68 65 20 4e 45 41 52 28 29 20 61 72 67  f the NEAR() arg
10d0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 6e 65 61 72 64  uments..*/.neard
10e0: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ist_opt(A) ::= .
10f0: 20 7b 20 41 2e 70 20 3d 20 30 3b 20 41 2e 6e 20   { A.p = 0; A.n 
1100: 3d 20 30 3b 20 7d 0a 6e 65 61 72 64 69 73 74 5f  = 0; }.neardist_
1110: 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41  opt(A) ::= COMMA
1120: 20 53 54 52 49 4e 47 28 58 29 2e 20 7b 20 41 20   STRING(X). { A 
1130: 3d 20 58 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  = X; }../*.** A 
1140: 70 68 72 61 73 65 2e 20 41 20 73 65 74 20 6f 66  phrase. A set of
1150: 20 70 72 69 6d 69 74 69 76 65 73 20 63 6f 6e 6e   primitives conn
1160: 65 63 74 65 64 20 62 79 20 22 2b 22 20 6f 70 65  ected by "+" ope
1170: 72 61 74 6f 72 73 2e 20 45 78 61 6d 70 6c 65 73  rators. Examples
1180: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 74 68 65  :.**.**     "the
1190: 22 20 2b 20 22 71 75 69 63 6b 20 62 72 6f 77 6e  " + "quick brown
11a0: 22 20 2b 20 66 6f 20 2a 0a 2a 2a 20 20 20 20 20  " + fo *.**     
11b0: 22 74 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e  "the quick brown
11c0: 20 66 6f 22 20 2a 0a 2a 2a 20 20 20 20 20 74 68   fo" *.**     th
11d0: 65 2b 71 75 69 63 6b 2b 62 72 6f 77 6e 2b 66 6f  e+quick+brown+fo
11e0: 2a 0a 2a 2f 0a 25 74 79 70 65 20 70 68 72 61 73  *.*/.%type phras
11f0: 65 20 7b 46 74 73 35 45 78 70 72 50 68 72 61 73  e {Fts5ExprPhras
1200: 65 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  e*}.%destructor 
1210: 70 68 72 61 73 65 20 7b 20 73 71 6c 69 74 65 33  phrase { sqlite3
1220: 46 74 73 35 50 61 72 73 65 50 68 72 61 73 65 46  Fts5ParsePhraseF
1230: 72 65 65 28 24 24 29 3b 20 7d 0a 0a 70 68 72 61  ree($$); }..phra
1240: 73 65 28 41 29 20 3a 3a 3d 20 70 68 72 61 73 65  se(A) ::= phrase
1250: 28 58 29 20 50 4c 55 53 20 53 54 52 49 4e 47 28  (X) PLUS STRING(
1260: 59 29 20 73 74 61 72 5f 6f 70 74 28 5a 29 2e 20  Y) star_opt(Z). 
1270: 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  { .  A = sqlite3
1280: 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 70 50  Fts5ParseTerm(pP
1290: 61 72 73 65 2c 20 58 2c 20 26 59 2c 20 5a 29 3b  arse, X, &Y, Z);
12a0: 0a 7d 0a 70 68 72 61 73 65 28 41 29 20 3a 3a 3d  .}.phrase(A) ::=
12b0: 20 53 54 52 49 4e 47 28 59 29 20 73 74 61 72 5f   STRING(Y) star_
12c0: 6f 70 74 28 5a 29 2e 20 7b 20 0a 20 20 41 20 3d  opt(Z). { .  A =
12d0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12e0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 30 2c  eTerm(pParse, 0,
12f0: 20 26 59 2c 20 5a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &Y, Z);.}../*.*
1300: 2a 20 4f 70 74 69 6f 6e 61 6c 20 22 2a 22 20 63  * Optional "*" c
1310: 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 25 74 79  haracter..*/.%ty
1320: 70 65 20 73 74 61 72 5f 6f 70 74 20 7b 69 6e 74  pe star_opt {int
1330: 7d 0a 0a 73 74 61 72 5f 6f 70 74 28 41 29 20 3a  }..star_opt(A) :
1340: 3a 3d 20 53 54 41 52 2e 20 7b 20 41 20 3d 20 31  := STAR. { A = 1
1350: 3b 20 7d 0a 73 74 61 72 5f 6f 70 74 28 41 29 20  ; }.star_opt(A) 
1360: 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d  ::= . { A = 0; }
1370: 0a                                               .