System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 70164f84a39815dc838343351580d6a8bd4c8f85:


0000: 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
0010: 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c  (SQLITE_CORE) ||
0020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0030: 45 4e 41 42 4c 45 5f 46 54 53 35 29 20 0d 0a 0d  ENABLE_FTS5) ...
0040: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
0050: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
0060: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
0070: 0d 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55  ..# define NDEBU
0080: 47 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66  G 1..#endif..#if
0090: 20 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29   defined(NDEBUG)
00a0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
00b0: 54 45 5f 44 45 42 55 47 29 0d 0a 23 20 75 6e 64  TE_DEBUG)..# und
00c0: 65 66 20 4e 44 45 42 55 47 0d 0a 23 65 6e 64 69  ef NDEBUG..#endi
00d0: 66 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74  f....#line 1 "ft
00e0: 73 35 2e 68 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30  s5.h"../*..** 20
00f0: 31 34 20 4d 61 79 20 33 31 0d 0a 2a 2a 0d 0a 2a  14 May 31..**..*
0100: 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  * The author dis
0110: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0120: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0130: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0140: 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e  of..** a legal n
0150: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0160: 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a   blessing:..**..
0170: 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  **    May you do
0180: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
0190: 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79  il...**    May y
01a0: 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e  ou find forgiven
01b0: 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66  ess for yourself
01c0: 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68   and forgive oth
01d0: 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  ers...**    May 
01e0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
01f0: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0200: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0210: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  e...**..********
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0260: 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 49  ******..**..** I
0270: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 65 78 74  nterfaces to ext
0280: 65 6e 64 20 46 54 53 35 2e 20 55 73 69 6e 67 20  end FTS5. Using 
0290: 74 68 65 20 69 6e 74 65 72 66 61 63 65 73 20 64  the interfaces d
02a0: 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
02b0: 69 6c 65 2c 20 0d 0a 2a 2a 20 46 54 53 35 20 6d  ile, ..** FTS5 m
02c0: 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 77  ay be extended w
02d0: 69 74 68 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20  ith:..**..**    
02e0: 20 2a 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e 69   * custom tokeni
02f0: 7a 65 72 73 2c 20 61 6e 64 0d 0a 2a 2a 20 20 20  zers, and..**   
0300: 20 20 2a 20 63 75 73 74 6f 6d 20 61 75 78 69 6c    * custom auxil
0310: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 0d  iary functions..
0320: 0a 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66  .*/......#ifndef
0330: 20 5f 46 54 53 35 5f 48 0d 0a 23 64 65 66 69 6e   _FTS5_H..#defin
0340: 65 20 5f 46 54 53 35 5f 48 0d 0a 0d 0a 23 69 6e  e _FTS5_H....#in
0350: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68  clude "sqlite3.h
0360: 22 0d 0a 0d 0a 23 69 66 64 65 66 20 5f 5f 63 70  "....#ifdef __cp
0370: 6c 75 73 70 6c 75 73 0d 0a 65 78 74 65 72 6e 20  lusplus..extern 
0380: 22 43 22 20 7b 0d 0a 23 65 6e 64 69 66 0d 0a 0d  "C" {..#endif...
0390: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
03a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20  ***********..** 
03e0: 43 55 53 54 4f 4d 20 41 55 58 49 4c 49 41 52 59  CUSTOM AUXILIARY
03f0: 20 46 55 4e 43 54 49 4f 4e 53 0d 0a 2a 2a 0d 0a   FUNCTIONS..**..
0400: 2a 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  ** Virtual table
0410: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
0420: 20 6d 61 79 20 6f 76 65 72 6c 6f 61 64 20 53 51   may overload SQ
0430: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 62 79 20 69  L functions by i
0440: 6d 70 6c 65 6d 65 6e 74 69 6e 67 0d 0a 2a 2a 20  mplementing..** 
0450: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  the sqlite3_modu
0460: 6c 65 2e 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  le.xFindFunction
0470: 28 29 20 6d 65 74 68 6f 64 2e 0d 0a 2a 2f 0d 0a  () method...*/..
0480: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0490: 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70   Fts5ExtensionAp
04a0: 69 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41  i Fts5ExtensionA
04b0: 70 69 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72  pi;..typedef str
04c0: 75 63 74 20 46 74 73 35 43 6f 6e 74 65 78 74 20  uct Fts5Context 
04d0: 46 74 73 35 43 6f 6e 74 65 78 74 3b 0d 0a 74 79  Fts5Context;..ty
04e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
04f0: 35 50 68 72 61 73 65 49 74 65 72 20 46 74 73 35  5PhraseIter Fts5
0500: 50 68 72 61 73 65 49 74 65 72 3b 0d 0a 0d 0a 74  PhraseIter;....t
0510: 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 66 74  ypedef void (*ft
0520: 73 35 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 75 6e  s5_extension_fun
0530: 63 74 69 6f 6e 29 28 0d 0a 20 20 63 6f 6e 73 74  ction)(..  const
0540: 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70   Fts5ExtensionAp
0550: 69 20 2a 70 41 70 69 2c 20 20 20 2f 2a 20 41 50  i *pApi,   /* AP
0560: 49 20 6f 66 66 65 72 65 64 20 62 79 20 63 75 72  I offered by cur
0570: 72 65 6e 74 20 46 54 53 20 76 65 72 73 69 6f 6e  rent FTS version
0580: 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65   */..  Fts5Conte
0590: 78 74 20 2a 70 46 74 73 2c 20 20 20 20 20 20 20  xt *pFts,       
05a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
05b0: 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20 70  arg to pass to p
05c0: 41 70 69 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  Api functions */
05d0: 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ..  sqlite3_cont
05e0: 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
05f0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
0600: 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 72 65 73  or returning res
0610: 75 6c 74 2f 65 72 72 6f 72 20 2a 2f 0d 0a 20 20  ult/error */..  
0620: 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20  int nVal,       
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
0650: 75 65 73 20 69 6e 20 61 70 56 61 6c 5b 5d 20 61  ues in apVal[] a
0660: 72 72 61 79 20 2a 2f 0d 0a 20 20 73 71 6c 69 74  rray */..  sqlit
0670: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
0690: 72 61 79 20 6f 66 20 74 72 61 69 6c 69 6e 67 20  ray of trailing 
06a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0d 0a 29 3b  arguments */..);
06b0: 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73 35 50  ....struct Fts5P
06c0: 68 72 61 73 65 49 74 65 72 20 7b 0d 0a 20 20 63  hraseIter {..  c
06d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
06e0: 61 72 20 2a 61 3b 0d 0a 20 20 63 6f 6e 73 74 20  ar *a;..  const 
06f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
0700: 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  ;..};..../*..** 
0710: 45 58 54 45 4e 53 49 4f 4e 20 41 50 49 20 46 55  EXTENSION API FU
0720: 4e 43 54 49 4f 4e 53 0d 0a 2a 2a 0d 0a 2a 2a 20  NCTIONS..**..** 
0730: 78 55 73 65 72 44 61 74 61 28 70 46 74 73 29 3a  xUserData(pFts):
0740: 0d 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20  ..**   Return a 
0750: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6e 74  copy of the cont
0760: 65 78 74 20 70 6f 69 6e 74 65 72 20 74 68 65 20  ext pointer the 
0770: 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69  extension functi
0780: 6f 6e 20 77 61 73 20 0d 0a 2a 2a 20 20 20 72 65  on was ..**   re
0790: 67 69 73 74 65 72 65 64 20 77 69 74 68 2e 0d 0a  gistered with...
07a0: 2a 2a 0d 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 54 6f  **..** xColumnTo
07b0: 74 61 6c 53 69 7a 65 28 70 46 74 73 2c 20 69 43  talSize(pFts, iC
07c0: 6f 6c 2c 20 70 6e 54 6f 6b 65 6e 29 3a 0d 0a 2a  ol, pnToken):..*
07d0: 2a 20 20 20 49 66 20 70 61 72 61 6d 65 74 65 72  *   If parameter
07e0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
07f0: 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 6f 75 74  an zero, set out
0800: 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 6e  put variable *pn
0810: 54 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 74 6f 20 74  Token..**   to t
0820: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
0830: 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  of tokens in the
0840: 20 46 54 53 35 20 74 61 62 6c 65 2e 20 4f 72 2c   FTS5 table. Or,
0850: 20 69 66 20 69 43 6f 6c 20 69 73 0d 0a 2a 2a 20   if iCol is..** 
0860: 20 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 62    non-negative b
0870: 75 74 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ut less than the
0880: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
0890: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ns in the table,
08a0: 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 20 20 74 68   return..**   th
08b0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
08c0: 66 20 74 6f 6b 65 6e 73 20 69 6e 20 63 6f 6c 75  f tokens in colu
08d0: 6d 6e 20 69 43 6f 6c 2c 20 63 6f 6e 73 69 64 65  mn iCol, conside
08e0: 72 69 6e 67 20 61 6c 6c 20 72 6f 77 73 20 69 6e  ring all rows in
08f0: 20 0d 0a 2a 2a 20 20 20 74 68 65 20 46 54 53 35   ..**   the FTS5
0900: 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   table...**..** 
0910: 20 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69    If parameter i
0920: 43 6f 6c 20 69 73 20 67 72 65 61 74 65 72 20 74  Col is greater t
0930: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
0940: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
0950: 6c 75 6d 6e 73 0d 0a 2a 2a 20 20 20 69 6e 20 74  lumns..**   in t
0960: 68 65 20 74 61 62 6c 65 2c 20 53 51 4c 49 54 45  he table, SQLITE
0970: 5f 52 41 4e 47 45 20 69 73 20 72 65 74 75 72 6e  _RANGE is return
0980: 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ed. Or, if an er
0990: 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e  ror occurs (e.g.
09a0: 0d 0a 2a 2a 20 20 20 61 6e 20 4f 4f 4d 20 63 6f  ..**   an OOM co
09b0: 6e 64 69 74 69 6f 6e 20 6f 72 20 49 4f 20 65 72  ndition or IO er
09c0: 72 6f 72 29 2c 20 61 6e 20 61 70 70 72 6f 70 72  ror), an appropr
09d0: 69 61 74 65 20 53 51 4c 69 74 65 20 65 72 72 6f  iate SQLite erro
09e0: 72 20 63 6f 64 65 20 69 73 20 0d 0a 2a 2a 20 20  r code is ..**  
09f0: 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a   returned...**..
0a00: 2a 2a 20 78 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  ** xColumnCount(
0a10: 70 46 74 73 29 3a 0d 0a 2a 2a 20 20 20 52 65 74  pFts):..**   Ret
0a20: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
0a30: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
0a40: 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   table...**..** 
0a50: 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73  xColumnSize(pFts
0a60: 2c 20 69 43 6f 6c 2c 20 70 6e 54 6f 6b 65 6e 29  , iCol, pnToken)
0a70: 3a 0d 0a 2a 2a 20 20 20 49 66 20 70 61 72 61 6d  :..**   If param
0a80: 65 74 65 72 20 69 43 6f 6c 20 69 73 20 6c 65 73  eter iCol is les
0a90: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  s than zero, set
0aa0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
0ab0: 20 2a 70 6e 54 6f 6b 65 6e 0d 0a 2a 2a 20 20 20   *pnToken..**   
0ac0: 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
0ad0: 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ber of tokens in
0ae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
0af0: 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6c 20 69 73  . Or, if iCol is
0b00: 0d 0a 2a 2a 20 20 20 6e 6f 6e 2d 6e 65 67 61 74  ..**   non-negat
0b10: 69 76 65 20 62 75 74 20 6c 65 73 73 20 74 68 61  ive but less tha
0b20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
0b30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
0b40: 61 62 6c 65 2c 20 73 65 74 0d 0a 2a 2a 20 20 20  able, set..**   
0b50: 2a 70 6e 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20  *pnToken to the 
0b60: 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
0b70: 20 69 6e 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20   in column iCol 
0b80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
0b90: 6f 77 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66  ow...**..**   If
0ba0: 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f 6c 20   parameter iCol 
0bb0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
0bc0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
0bd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
0be0: 73 0d 0a 2a 2a 20 20 20 69 6e 20 74 68 65 20 74  s..**   in the t
0bf0: 61 62 6c 65 2c 20 53 51 4c 49 54 45 5f 52 41 4e  able, SQLITE_RAN
0c00: 47 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  GE is returned. 
0c10: 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
0c20: 6f 63 63 75 72 73 20 28 65 2e 67 2e 0d 0a 2a 2a  occurs (e.g...**
0c30: 20 20 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74     an OOM condit
0c40: 69 6f 6e 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ion or IO error)
0c50: 2c 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  , an appropriate
0c60: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
0c70: 64 65 20 69 73 20 0d 0a 2a 2a 20 20 20 72 65 74  de is ..**   ret
0c80: 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  urned...**..**  
0c90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
0ca0: 61 79 20 62 65 20 71 75 69 74 65 20 69 6e 65 66  ay be quite inef
0cb0: 66 69 63 69 65 6e 74 20 69 66 20 75 73 65 64 20  ficient if used 
0cc0: 77 69 74 68 20 61 6e 20 46 54 53 35 20 74 61 62  with an FTS5 tab
0cd0: 6c 65 0d 0a 2a 2a 20 20 20 63 72 65 61 74 65 64  le..**   created
0ce0: 20 77 69 74 68 20 74 68 65 20 22 63 6f 6c 75 6d   with the "colum
0cf0: 6e 73 69 7a 65 3d 30 22 20 6f 70 74 69 6f 6e 2e  nsize=0" option.
0d00: 0d 0a 2a 2a 0d 0a 2a 2a 20 78 43 6f 6c 75 6d 6e  ..**..** xColumn
0d10: 54 65 78 74 3a 0d 0a 2a 2a 20 20 20 54 68 69 73  Text:..**   This
0d20: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
0d30: 74 73 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ts to retrieve t
0d40: 68 65 20 74 65 78 74 20 6f 66 20 63 6f 6c 75 6d  he text of colum
0d50: 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 0d 0a 2a  n iCol of the..*
0d60: 2a 20 20 20 63 75 72 72 65 6e 74 20 64 6f 63 75  *   current docu
0d70: 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73  ment. If success
0d80: 66 75 6c 2c 20 28 2a 70 7a 29 20 69 73 20 73 65  ful, (*pz) is se
0d90: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
0da0: 62 75 66 66 65 72 0d 0a 2a 2a 20 20 20 63 6f 6e  buffer..**   con
0db0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
0dc0: 20 69 6e 20 75 74 66 2d 38 20 65 6e 63 6f 64 69   in utf-8 encodi
0dd0: 6e 67 2c 20 28 2a 70 6e 29 20 69 73 20 73 65 74  ng, (*pn) is set
0de0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69 6e 20   to the size in 
0df0: 62 79 74 65 73 0d 0a 2a 2a 20 20 20 28 6e 6f 74  bytes..**   (not
0e00: 20 63 68 61 72 61 63 74 65 72 73 29 20 6f 66 20   characters) of 
0e10: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 53  the buffer and S
0e20: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
0e30: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
0e40: 0d 0a 2a 2a 20 20 20 69 66 20 61 6e 20 65 72 72  ..**   if an err
0e50: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
0e60: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
0e70: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
0e80: 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 73  the final values
0e90: 0d 0a 2a 2a 20 20 20 6f 66 20 28 2a 70 7a 29 20  ..**   of (*pz) 
0ea0: 61 6e 64 20 28 2a 70 6e 29 20 61 72 65 20 75 6e  and (*pn) are un
0eb0: 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a  defined...**..**
0ec0: 20 78 50 68 72 61 73 65 43 6f 75 6e 74 3a 0d 0a   xPhraseCount:..
0ed0: 2a 2a 20 20 20 52 65 74 75 72 6e 73 20 74 68 65  **   Returns the
0ee0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73   number of phras
0ef0: 65 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  es in the curren
0f00: 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  t query expressi
0f10: 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68 72  on...**..** xPhr
0f20: 61 73 65 53 69 7a 65 3a 0d 0a 2a 2a 20 20 20 52  aseSize:..**   R
0f30: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
0f40: 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 70  r of tokens in p
0f50: 68 72 61 73 65 20 69 50 68 72 61 73 65 20 6f 66  hrase iPhrase of
0f60: 20 74 68 65 20 71 75 65 72 79 2e 20 50 68 72 61   the query. Phra
0f70: 73 65 73 0d 0a 2a 2a 20 20 20 61 72 65 20 6e 75  ses..**   are nu
0f80: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
0f90: 66 72 6f 6d 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a  from zero...**..
0fa0: 2a 2a 20 78 49 6e 73 74 43 6f 75 6e 74 3a 0d 0a  ** xInstCount:..
0fb0: 2a 2a 20 20 20 53 65 74 20 2a 70 6e 49 6e 73 74  **   Set *pnInst
0fc0: 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
0fd0: 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65 6e  mber of occurren
0fe0: 63 65 73 20 6f 66 20 61 6c 6c 20 70 68 72 61 73  ces of all phras
0ff0: 65 73 20 77 69 74 68 69 6e 0d 0a 2a 2a 20 20 20  es within..**   
1000: 74 68 65 20 71 75 65 72 79 20 77 69 74 68 69 6e  the query within
1010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1020: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1030: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
1040: 2c 20 6f 72 0d 0a 2a 2a 20 20 20 61 6e 20 65 72  , or..**   an er
1050: 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 53  ror code (i.e. S
1060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20  QLITE_NOMEM) if 
1070: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
1080: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 69 73 20  ..**..**   This 
1090: 41 50 49 20 63 61 6e 20 62 65 20 71 75 69 74 65  API can be quite
10a0: 20 73 6c 6f 77 20 69 66 20 75 73 65 64 20 77 69   slow if used wi
10b0: 74 68 20 61 6e 20 46 54 53 35 20 74 61 62 6c 65  th an FTS5 table
10c0: 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
10d0: 65 0d 0a 2a 2a 20 20 20 22 64 65 74 61 69 6c 3d  e..**   "detail=
10e0: 6e 6f 6e 65 22 20 6f 72 20 22 64 65 74 61 69 6c  none" or "detail
10f0: 3d 63 6f 6c 75 6d 6e 22 20 6f 70 74 69 6f 6e 2e  =column" option.
1100: 20 49 66 20 74 68 65 20 46 54 53 35 20 74 61 62   If the FTS5 tab
1110: 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 0d 0a  le is created ..
1120: 2a 2a 20 20 20 77 69 74 68 20 65 69 74 68 65 72  **   with either
1130: 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20 6f   "detail=none" o
1140: 72 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e  r "detail=column
1150: 22 20 61 6e 64 20 22 63 6f 6e 74 65 6e 74 3d 22  " and "content="
1160: 20 6f 70 74 69 6f 6e 20 0d 0a 2a 2a 20 20 20 28   option ..**   (
1170: 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 61 20  i.e. if it is a 
1180: 63 6f 6e 74 65 6e 74 6c 65 73 73 20 74 61 62 6c  contentless tabl
1190: 65 29 2c 20 74 68 65 6e 20 74 68 69 73 20 41 50  e), then this AP
11a0: 49 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  I always returns
11b0: 20 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 49 6e 73   0...**..** xIns
11c0: 74 3a 0d 0a 2a 2a 20 20 20 51 75 65 72 79 20 66  t:..**   Query f
11d0: 6f 72 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f  or the details o
11e0: 66 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 69  f phrase match i
11f0: 49 64 78 20 77 69 74 68 69 6e 20 74 68 65 20 63  Idx within the c
1200: 75 72 72 65 6e 74 20 72 6f 77 2e 0d 0a 2a 2a 20  urrent row...** 
1210: 20 20 50 68 72 61 73 65 20 6d 61 74 63 68 65 73    Phrase matches
1220: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1230: 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1240: 2c 20 73 6f 20 74 68 65 20 69 49 64 78 20 61 72  , so the iIdx ar
1250: 67 75 6d 65 6e 74 0d 0a 2a 2a 20 20 20 73 68 6f  gument..**   sho
1260: 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20 74  uld be greater t
1270: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1280: 7a 65 72 6f 20 61 6e 64 20 73 6d 61 6c 6c 65 72  zero and smaller
1290: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 0d   than the value.
12a0: 0a 2a 2a 20 20 20 6f 75 74 70 75 74 20 62 79 20  .**   output by 
12b0: 78 49 6e 73 74 43 6f 75 6e 74 28 29 2e 0d 0a 2a  xInstCount()...*
12c0: 2a 0d 0a 2a 2a 20 20 20 55 73 75 61 6c 6c 79 2c  *..**   Usually,
12d0: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
12e0: 72 20 2a 70 69 50 68 72 61 73 65 20 69 73 20 73  r *piPhrase is s
12f0: 65 74 20 74 6f 20 74 68 65 20 70 68 72 61 73 65  et to the phrase
1300: 20 6e 75 6d 62 65 72 2c 20 2a 70 69 43 6f 6c 0d   number, *piCol.
1310: 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 63 6f 6c  .**   to the col
1320: 75 6d 6e 20 69 6e 20 77 68 69 63 68 20 69 74 20  umn in which it 
1330: 6f 63 63 75 72 73 20 61 6e 64 20 2a 70 69 4f 66  occurs and *piOf
1340: 66 20 74 68 65 20 74 6f 6b 65 6e 20 6f 66 66 73  f the token offs
1350: 65 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 20 20  et of the..**   
1360: 66 69 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20 74  first token of t
1370: 68 65 20 70 68 72 61 73 65 2e 20 54 68 65 20 65  he phrase. The e
1380: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
1390: 68 65 20 74 61 62 6c 65 20 77 61 73 20 63 72 65  he table was cre
13a0: 61 74 65 64 0d 0a 2a 2a 20 20 20 77 69 74 68 20  ated..**   with 
13b0: 74 68 65 20 6f 66 66 73 65 74 73 3d 30 20 6f 70  the offsets=0 op
13c0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 2e 20  tion specified. 
13d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 69  In this case *pi
13e0: 4f 66 66 20 69 73 20 61 6c 77 61 79 73 0d 0a 2a  Off is always..*
13f0: 2a 20 20 20 73 65 74 20 74 6f 20 2d 31 2e 0d 0a  *   set to -1...
1400: 2a 2a 0d 0a 2a 2a 20 20 20 52 65 74 75 72 6e 73  **..**   Returns
1410: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
1420: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
1430: 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
1440: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 0d   SQLITE_NOMEM) .
1450: 0a 2a 2a 20 20 20 69 66 20 61 6e 20 65 72 72 6f  .**   if an erro
1460: 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2a 0d 0a 2a  r occurs...**..*
1470: 2a 20 20 20 54 68 69 73 20 41 50 49 20 63 61 6e  *   This API can
1480: 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77 20 69   be quite slow i
1490: 66 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 46  f used with an F
14a0: 54 53 35 20 74 61 62 6c 65 20 63 72 65 61 74 65  TS5 table create
14b0: 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 20  d with the..**  
14c0: 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20 6f   "detail=none" o
14d0: 72 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e  r "detail=column
14e0: 22 20 6f 70 74 69 6f 6e 2e 20 0d 0a 2a 2a 0d 0a  " option. ..**..
14f0: 2a 2a 20 78 52 6f 77 69 64 3a 0d 0a 2a 2a 20 20  ** xRowid:..**  
1500: 20 52 65 74 75 72 6e 73 20 74 68 65 20 72 6f 77   Returns the row
1510: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
1520: 74 20 72 6f 77 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78  t row...**..** x
1530: 54 6f 6b 65 6e 69 7a 65 3a 0d 0a 2a 2a 20 20 20  Tokenize:..**   
1540: 54 6f 6b 65 6e 69 7a 65 20 74 65 78 74 20 75 73  Tokenize text us
1550: 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  ing the tokenize
1560: 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  r belonging to t
1570: 68 65 20 46 54 53 35 20 74 61 62 6c 65 2e 0d 0a  he FTS5 table...
1580: 2a 2a 0d 0a 2a 2a 20 78 51 75 65 72 79 50 68 72  **..** xQueryPhr
1590: 61 73 65 28 70 46 74 73 35 2c 20 69 50 68 72 61  ase(pFts5, iPhra
15a0: 73 65 2c 20 70 55 73 65 72 44 61 74 61 2c 20 78  se, pUserData, x
15b0: 43 61 6c 6c 62 61 63 6b 29 3a 0d 0a 2a 2a 20 20  Callback):..**  
15c0: 20 54 68 69 73 20 41 50 49 20 66 75 6e 63 74 69   This API functi
15d0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 71 75  on is used to qu
15e0: 65 72 79 20 74 68 65 20 46 54 53 20 74 61 62 6c  ery the FTS tabl
15f0: 65 20 66 6f 72 20 70 68 72 61 73 65 20 69 50 68  e for phrase iPh
1600: 72 61 73 65 0d 0a 2a 2a 20 20 20 6f 66 20 74 68  rase..**   of th
1610: 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
1620: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 61   Specifically, a
1630: 20 71 75 65 72 79 20 65 71 75 69 76 61 6c 65 6e   query equivalen
1640: 74 20 74 6f 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  t to:..**..**   
1650: 20 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 66 74 73      ... FROM fts
1660: 74 61 62 6c 65 20 57 48 45 52 45 20 66 74 73 74  table WHERE ftst
1670: 61 62 6c 65 20 4d 41 54 43 48 20 24 70 20 4f 52  able MATCH $p OR
1680: 44 45 52 20 42 59 20 72 6f 77 69 64 0d 0a 2a 2a  DER BY rowid..**
1690: 0d 0a 2a 2a 20 20 20 77 69 74 68 20 24 70 20 73  ..**   with $p s
16a0: 65 74 20 74 6f 20 61 20 70 68 72 61 73 65 20 65  et to a phrase e
16b0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
16c0: 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20   phrase iPhrase 
16d0: 6f 66 20 74 68 65 0d 0a 2a 2a 20 20 20 63 75 72  of the..**   cur
16e0: 72 65 6e 74 20 71 75 65 72 79 20 69 73 20 65 78  rent query is ex
16f0: 65 63 75 74 65 64 2e 20 41 6e 79 20 63 6f 6c 75  ecuted. Any colu
1700: 6d 6e 20 66 69 6c 74 65 72 20 74 68 61 74 20 61  mn filter that a
1710: 70 70 6c 69 65 73 20 74 6f 0d 0a 2a 2a 20 20 20  pplies to..**   
1720: 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20 6f  phrase iPhrase o
1730: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  f the current qu
1740: 65 72 79 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ery is included 
1750: 69 6e 20 24 70 2e 20 46 6f 72 20 65 61 63 68 20  in $p. For each 
1760: 0d 0a 2a 2a 20 20 20 72 6f 77 20 76 69 73 69 74  ..**   row visit
1770: 65 64 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ed, the callback
1780: 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64   function passed
1790: 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20 61   as the fourth a
17a0: 72 67 75 6d 65 6e 74 20 0d 0a 2a 2a 20 20 20 69  rgument ..**   i
17b0: 73 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20 63  s invoked. The c
17c0: 6f 6e 74 65 78 74 20 61 6e 64 20 41 50 49 20 6f  ontext and API o
17d0: 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 74 6f  bjects passed to
17e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 0d 0a   the callback ..
17f0: 2a 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 6d 61  **   function ma
1800: 79 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  y be used to acc
1810: 65 73 73 20 74 68 65 20 70 72 6f 70 65 72 74 69  ess the properti
1820: 65 73 20 6f 66 20 65 61 63 68 20 6d 61 74 63 68  es of each match
1830: 65 64 20 72 6f 77 2e 0d 0a 2a 2a 20 20 20 49 6e  ed row...**   In
1840: 76 6f 6b 69 6e 67 20 41 70 69 2e 78 55 73 65 72  voking Api.xUser
1850: 44 61 74 61 28 29 20 72 65 74 75 72 6e 73 20 61  Data() returns a
1860: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69   copy of the poi
1870: 6e 74 65 72 20 70 61 73 73 65 64 20 61 73 20 0d  nter passed as .
1880: 0a 2a 2a 20 20 20 74 68 65 20 74 68 69 72 64 20  .**   the third 
1890: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 55 73 65  argument to pUse
18a0: 72 44 61 74 61 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  rData...**..**  
18b0: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
18c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18d0: 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
18e0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
18f0: 2c 20 74 68 65 0d 0a 2a 2a 20 20 20 71 75 65 72  , the..**   quer
1900: 79 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20 61  y is abandoned a
1910: 6e 64 20 74 68 65 20 78 51 75 65 72 79 50 68 72  nd the xQueryPhr
1920: 61 73 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ase function ret
1930: 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  urns immediately
1940: 2e 0d 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 72  ...**   If the r
1950: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
1960: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 20 78 51   SQLITE_DONE, xQ
1970: 75 65 72 79 50 68 72 61 73 65 20 72 65 74 75 72  ueryPhrase retur
1980: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a  ns SQLITE_OK...*
1990: 2a 20 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  *   Otherwise, t
19a0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
19b0: 20 70 72 6f 70 61 67 61 74 65 64 20 75 70 77 61   propagated upwa
19c0: 72 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49  rds...**..**   I
19d0: 66 20 74 68 65 20 71 75 65 72 79 20 72 75 6e 73  f the query runs
19e0: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 77   to completion w
19f0: 69 74 68 6f 75 74 20 69 6e 63 69 64 65 6e 74 2c  ithout incident,
1a00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1a10: 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 20 20 4f 72  turned...**   Or
1a20: 2c 20 69 66 20 73 6f 6d 65 20 65 72 72 6f 72 20  , if some error 
1a30: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68  occurs before th
1a40: 65 20 71 75 65 72 79 20 63 6f 6d 70 6c 65 74 65  e query complete
1a50: 73 20 6f 72 20 69 73 20 61 62 6f 72 74 65 64 20  s or is aborted 
1a60: 62 79 0d 0a 2a 2a 20 20 20 74 68 65 20 63 61 6c  by..**   the cal
1a70: 6c 62 61 63 6b 2c 20 61 6e 20 53 51 4c 69 74 65  lback, an SQLite
1a80: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1a90: 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a  eturned...**..**
1aa0: 0d 0a 2a 2a 20 78 53 65 74 41 75 78 64 61 74 61  ..** xSetAuxdata
1ab0: 28 70 46 74 73 35 2c 20 70 41 75 78 2c 20 78 44  (pFts5, pAux, xD
1ac0: 65 6c 65 74 65 29 0d 0a 2a 2a 0d 0a 2a 2a 20 20  elete)..**..**  
1ad0: 20 53 61 76 65 20 74 68 65 20 70 6f 69 6e 74 65   Save the pointe
1ae0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1af0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1b00: 61 73 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  as the extension
1b10: 20 66 75 6e 63 74 69 6f 6e 73 20 0d 0a 2a 2a 20   functions ..** 
1b20: 20 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74    "auxiliary dat
1b30: 61 22 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  a". The pointer 
1b40: 6d 61 79 20 74 68 65 6e 20 62 65 20 72 65 74 72  may then be retr
1b50: 69 65 76 65 64 20 62 79 20 74 68 65 20 63 75 72  ieved by the cur
1b60: 72 65 6e 74 20 6f 72 20 61 6e 79 0d 0a 2a 2a 20  rent or any..** 
1b70: 20 20 66 75 74 75 72 65 20 69 6e 76 6f 63 61 74    future invocat
1b80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
1b90: 66 74 73 35 20 65 78 74 65 6e 73 69 6f 6e 20 66  fts5 extension f
1ba0: 75 6e 63 74 69 6f 6e 20 6d 61 64 65 20 61 73 20  unction made as 
1bb0: 70 61 72 74 20 6f 66 0d 0a 2a 2a 20 20 20 6f 66  part of..**   of
1bc0: 20 74 68 65 20 73 61 6d 65 20 4d 41 54 43 48 20   the same MATCH 
1bd0: 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65 20  query using the 
1be0: 78 47 65 74 41 75 78 64 61 74 61 28 29 20 41 50  xGetAuxdata() AP
1bf0: 49 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 45 61 63  I...**..**   Eac
1c00: 68 20 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63  h extension func
1c10: 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74 65  tion is allocate
1c20: 64 20 61 20 73 69 6e 67 6c 65 20 61 75 78 69 6c  d a single auxil
1c30: 69 61 72 79 20 64 61 74 61 20 73 6c 6f 74 20 66  iary data slot f
1c40: 6f 72 0d 0a 2a 2a 20 20 20 65 61 63 68 20 46 54  or..**   each FT
1c50: 53 20 71 75 65 72 79 20 28 4d 41 54 43 48 20 65  S query (MATCH e
1c60: 78 70 72 65 73 73 69 6f 6e 29 2e 20 49 66 20 74  xpression). If t
1c70: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e  he extension fun
1c80: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1c90: 20 0d 0a 2a 2a 20 20 20 6d 6f 72 65 20 74 68 61   ..**   more tha
1ca0: 6e 20 6f 6e 63 65 20 66 6f 72 20 61 20 73 69 6e  n once for a sin
1cb0: 67 6c 65 20 46 54 53 20 71 75 65 72 79 2c 20 74  gle FTS query, t
1cc0: 68 65 6e 20 61 6c 6c 20 69 6e 76 6f 63 61 74 69  hen all invocati
1cd0: 6f 6e 73 20 73 68 61 72 65 20 61 20 0d 0a 2a 2a  ons share a ..**
1ce0: 20 20 20 73 69 6e 67 6c 65 20 61 75 78 69 6c 69     single auxili
1cf0: 61 72 79 20 64 61 74 61 20 63 6f 6e 74 65 78 74  ary data context
1d00: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20 74  ...**..**   If t
1d10: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1d20: 61 6e 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  an auxiliary dat
1d30: 61 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  a pointer when t
1d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0d  his function is.
1d50: 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 2c 20 74  .**   invoked, t
1d60: 68 65 6e 20 69 74 20 69 73 20 72 65 70 6c 61 63  hen it is replac
1d70: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 70 6f  ed by the new po
1d80: 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 78 44 65  inter. If an xDe
1d90: 6c 65 74 65 20 63 61 6c 6c 62 61 63 6b 0d 0a 2a  lete callback..*
1da0: 2a 20 20 20 77 61 73 20 73 70 65 63 69 66 69 65  *   was specifie
1db0: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1dc0: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 69 6e 74 65   original pointe
1dd0: 72 2c 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  r, it is invoked
1de0: 20 61 74 20 74 68 69 73 0d 0a 2a 2a 20 20 20 70   at this..**   p
1df0: 6f 69 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  oint...**..**   
1e00: 54 68 65 20 78 44 65 6c 65 74 65 20 63 61 6c 6c  The xDelete call
1e10: 62 61 63 6b 2c 20 69 66 20 6f 6e 65 20 69 73 20  back, if one is 
1e20: 73 70 65 63 69 66 69 65 64 2c 20 69 73 20 61 6c  specified, is al
1e30: 73 6f 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  so invoked on th
1e40: 65 0d 0a 2a 2a 20 20 20 61 75 78 69 6c 69 61 72  e..**   auxiliar
1e50: 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 20 61  y data pointer a
1e60: 66 74 65 72 20 74 68 65 20 46 54 53 35 20 71 75  fter the FTS5 qu
1e70: 65 72 79 20 68 61 73 20 66 69 6e 69 73 68 65 64  ery has finished
1e80: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20 61  ...**..**   If a
1e90: 6e 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e  n error (e.g. an
1ea0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20   OOM condition) 
1eb0: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1ec0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 0d  is function, an.
1ed0: 0a 2a 2a 20 20 20 74 68 65 20 61 75 78 69 6c 69  .**   the auxili
1ee0: 61 72 79 20 64 61 74 61 20 69 73 20 73 65 74 20  ary data is set 
1ef0: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65  to NULL and an e
1f00: 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
1f10: 65 64 2e 20 49 66 20 74 68 65 0d 0a 2a 2a 20 20  ed. If the..**  
1f20: 20 78 44 65 6c 65 74 65 20 70 61 72 61 6d 65 74   xDelete paramet
1f30: 65 72 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c  er was not NULL,
1f40: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f   it is invoked o
1f50: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
1f60: 64 61 74 61 0d 0a 2a 2a 20 20 20 70 6f 69 6e 74  data..**   point
1f70: 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
1f80: 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a  ing...**..**..**
1f90: 20 78 47 65 74 41 75 78 64 61 74 61 28 70 46 74   xGetAuxdata(pFt
1fa0: 73 35 2c 20 62 43 6c 65 61 72 29 0d 0a 2a 2a 0d  s5, bClear)..**.
1fb0: 0a 2a 2a 20 20 20 52 65 74 75 72 6e 73 20 74 68  .**   Returns th
1fc0: 65 20 63 75 72 72 65 6e 74 20 61 75 78 69 6c 69  e current auxili
1fd0: 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
1fe0: 20 66 6f 72 20 74 68 65 20 66 74 73 35 20 65 78   for the fts5 ex
1ff0: 74 65 6e 73 69 6f 6e 20 0d 0a 2a 2a 20 20 20 66  tension ..**   f
2000: 75 6e 63 74 69 6f 6e 2e 20 53 65 65 20 74 68 65  unction. See the
2010: 20 78 53 65 74 41 75 78 64 61 74 61 28 29 20 6d   xSetAuxdata() m
2020: 65 74 68 6f 64 20 66 6f 72 20 64 65 74 61 69 6c  ethod for detail
2030: 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20  s...**..**   If 
2040: 74 68 65 20 62 43 6c 65 61 72 20 61 72 67 75 6d  the bClear argum
2050: 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
2060: 20 74 68 65 6e 20 74 68 65 20 61 75 78 69 6c 69   then the auxili
2070: 61 72 79 20 64 61 74 61 20 69 73 20 63 6c 65 61  ary data is clea
2080: 72 65 64 0d 0a 2a 2a 20 20 20 28 73 65 74 20 74  red..**   (set t
2090: 6f 20 4e 55 4c 4c 29 20 62 65 66 6f 72 65 20 74  o NULL) before t
20a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20b0: 75 72 6e 73 2e 20 49 6e 20 74 68 69 73 20 63 61  urns. In this ca
20c0: 73 65 20 74 68 65 20 78 44 65 6c 65 74 65 2c 0d  se the xDelete,.
20d0: 0a 2a 2a 20 20 20 69 66 20 61 6e 79 2c 20 69 73  .**   if any, is
20e0: 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 2e 0d 0a 2a   not invoked...*
20f0: 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 78 52 6f 77 43 6f  *..**..** xRowCo
2100: 75 6e 74 28 70 46 74 73 35 2c 20 70 6e 52 6f 77  unt(pFts5, pnRow
2110: 29 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 69 73  )..**..**   This
2120: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2130: 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2140: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2150: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2160: 62 6c 65 2e 0d 0a 2a 2a 20 20 20 49 6e 20 6f 74  ble...**   In ot
2170: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73  her words, the s
2180: 61 6d 65 20 76 61 6c 75 65 20 74 68 61 74 20 77  ame value that w
2190: 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64  ould be returned
21a0: 20 62 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20   by:..**..**    
21b0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
21c0: 28 2a 29 20 46 52 4f 4d 20 66 74 73 74 61 62 6c  (*) FROM ftstabl
21d0: 65 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68 72 61  e;..**..** xPhra
21e0: 73 65 46 69 72 73 74 28 29 0d 0a 2a 2a 20 20 20  seFirst()..**   
21f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2200: 20 75 73 65 64 2c 20 61 6c 6f 6e 67 20 77 69 74   used, along wit
2210: 68 20 74 79 70 65 20 46 74 73 35 50 68 72 61 73  h type Fts5Phras
2220: 65 49 74 65 72 20 61 6e 64 20 74 68 65 20 78 50  eIter and the xP
2230: 68 72 61 73 65 4e 65 78 74 0d 0a 2a 2a 20 20 20  hraseNext..**   
2240: 6d 65 74 68 6f 64 2c 20 74 6f 20 69 74 65 72 61  method, to itera
2250: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69  te through all i
2260: 6e 73 74 61 6e 63 65 73 20 6f 66 20 61 20 73 69  nstances of a si
2270: 6e 67 6c 65 20 71 75 65 72 79 20 70 68 72 61 73  ngle query phras
2280: 65 20 77 69 74 68 69 6e 0d 0a 2a 2a 20 20 20 74  e within..**   t
2290: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
22a0: 54 68 69 73 20 69 73 20 74 68 65 20 73 61 6d 65  This is the same
22b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 20   information as 
22c0: 69 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  is accessible vi
22d0: 61 20 74 68 65 0d 0a 2a 2a 20 20 20 78 49 6e 73  a the..**   xIns
22e0: 74 43 6f 75 6e 74 2f 78 49 6e 73 74 20 41 50 49  tCount/xInst API
22f0: 73 2e 20 57 68 69 6c 65 20 74 68 65 20 78 49 6e  s. While the xIn
2300: 73 74 43 6f 75 6e 74 2f 78 49 6e 73 74 20 41 50  stCount/xInst AP
2310: 49 73 20 61 72 65 20 6d 6f 72 65 20 63 6f 6e 76  Is are more conv
2320: 65 6e 69 65 6e 74 0d 0a 2a 2a 20 20 20 74 6f 20  enient..**   to 
2330: 75 73 65 2c 20 74 68 69 73 20 41 50 49 20 6d 61  use, this API ma
2340: 79 20 62 65 20 66 61 73 74 65 72 20 75 6e 64 65  y be faster unde
2350: 72 20 73 6f 6d 65 20 63 69 72 63 75 6d 73 74 61  r some circumsta
2360: 6e 63 65 73 2e 20 54 6f 20 69 74 65 72 61 74 65  nces. To iterate
2370: 20 0d 0a 2a 2a 20 20 20 74 68 72 6f 75 67 68 20   ..**   through 
2380: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 70 68 72  instances of phr
2390: 61 73 65 20 69 50 68 72 61 73 65 2c 20 75 73 65  ase iPhrase, use
23a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
23b0: 6f 64 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20  ode:..**..**    
23c0: 20 20 20 46 74 73 35 50 68 72 61 73 65 49 74 65     Fts5PhraseIte
23d0: 72 20 69 74 65 72 3b 0d 0a 2a 2a 20 20 20 20 20  r iter;..**     
23e0: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 69 4f 66 66    int iCol, iOff
23f0: 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 28  ;..**       for(
2400: 70 41 70 69 2d 3e 78 50 68 72 61 73 65 46 69 72  pApi->xPhraseFir
2410: 73 74 28 70 46 74 73 2c 20 69 50 68 72 61 73 65  st(pFts, iPhrase
2420: 2c 20 26 69 74 65 72 2c 20 26 69 43 6f 6c 2c 20  , &iter, &iCol, 
2430: 26 69 4f 66 66 29 3b 0d 0a 2a 2a 20 20 20 20 20  &iOff);..**     
2440: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 3b 0d 0a        iCol>=0;..
2450: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 41 70  **           pAp
2460: 69 2d 3e 78 50 68 72 61 73 65 4e 65 78 74 28 70  i->xPhraseNext(p
2470: 46 74 73 2c 20 26 69 74 65 72 2c 20 26 69 43 6f  Fts, &iter, &iCo
2480: 6c 2c 20 26 69 4f 66 66 29 0d 0a 2a 2a 20 20 20  l, &iOff)..**   
2490: 20 20 20 20 29 7b 0d 0a 2a 2a 20 20 20 20 20 20      ){..**      
24a0: 20 20 20 2f 2f 20 41 6e 20 69 6e 73 74 61 6e 63     // An instanc
24b0: 65 20 6f 66 20 70 68 72 61 73 65 20 69 50 68 72  e of phrase iPhr
24c0: 61 73 65 20 61 74 20 6f 66 66 73 65 74 20 69 4f  ase at offset iO
24d0: 66 66 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 43 6f  ff of column iCo
24e0: 6c 0d 0a 2a 2a 20 20 20 20 20 20 20 7d 0d 0a 2a  l..**       }..*
24f0: 2a 0d 0a 2a 2a 20 20 20 54 68 65 20 46 74 73 35  *..**   The Fts5
2500: 50 68 72 61 73 65 49 74 65 72 20 73 74 72 75 63  PhraseIter struc
2510: 74 75 72 65 20 69 73 20 64 65 66 69 6e 65 64 20  ture is defined 
2520: 61 62 6f 76 65 2e 20 41 70 70 6c 69 63 61 74 69  above. Applicati
2530: 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a  ons should not..
2540: 2a 2a 20 20 20 6d 6f 64 69 66 79 20 74 68 69 73  **   modify this
2550: 20 73 74 72 75 63 74 75 72 65 20 64 69 72 65 63   structure direc
2560: 74 6c 79 20 2d 20 69 74 20 73 68 6f 75 6c 64 20  tly - it should 
2570: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73 20  only be used as 
2580: 73 68 6f 77 6e 20 61 62 6f 76 65 0d 0a 2a 2a 20  shown above..** 
2590: 20 20 77 69 74 68 20 74 68 65 20 78 50 68 72 61    with the xPhra
25a0: 73 65 46 69 72 73 74 28 29 20 61 6e 64 20 78 50  seFirst() and xP
25b0: 68 72 61 73 65 4e 65 78 74 28 29 20 41 50 49 20  hraseNext() API 
25c0: 6d 65 74 68 6f 64 73 20 28 61 6e 64 20 62 79 0d  methods (and by.
25d0: 0a 2a 2a 20 20 20 78 50 68 72 61 73 65 46 69 72  .**   xPhraseFir
25e0: 73 74 43 6f 6c 75 6d 6e 28 29 20 61 6e 64 20 78  stColumn() and x
25f0: 50 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e  PhraseNextColumn
2600: 28 29 20 61 73 20 69 6c 6c 75 73 74 72 61 74 65  () as illustrate
2610: 64 20 62 65 6c 6f 77 29 2e 0d 0a 2a 2a 0d 0a 2a  d below)...**..*
2620: 2a 20 20 20 54 68 69 73 20 41 50 49 20 63 61 6e  *   This API can
2630: 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77 20 69   be quite slow i
2640: 66 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 46  f used with an F
2650: 54 53 35 20 74 61 62 6c 65 20 63 72 65 61 74 65  TS5 table create
2660: 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 20  d with the..**  
2670: 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20 6f   "detail=none" o
2680: 72 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e  r "detail=column
2690: 22 20 6f 70 74 69 6f 6e 2e 20 49 66 20 74 68 65  " option. If the
26a0: 20 46 54 53 35 20 74 61 62 6c 65 20 69 73 20 63   FTS5 table is c
26b0: 72 65 61 74 65 64 20 0d 0a 2a 2a 20 20 20 77 69  reated ..**   wi
26c0: 74 68 20 65 69 74 68 65 72 20 22 64 65 74 61 69  th either "detai
26d0: 6c 3d 6e 6f 6e 65 22 20 6f 72 20 22 64 65 74 61  l=none" or "deta
26e0: 69 6c 3d 63 6f 6c 75 6d 6e 22 20 61 6e 64 20 22  il=column" and "
26f0: 63 6f 6e 74 65 6e 74 3d 22 20 6f 70 74 69 6f 6e  content=" option
2700: 20 0d 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 69 66   ..**   (i.e. if
2710: 20 69 74 20 69 73 20 61 20 63 6f 6e 74 65 6e 74   it is a content
2720: 6c 65 73 73 20 74 61 62 6c 65 29 2c 20 74 68 65  less table), the
2730: 6e 20 74 68 69 73 20 41 50 49 20 61 6c 77 61 79  n this API alway
2740: 73 20 69 74 65 72 61 74 65 73 0d 0a 2a 2a 20 20  s iterates..**  
2750: 20 74 68 72 6f 75 67 68 20 61 6e 20 65 6d 70 74   through an empt
2760: 79 20 73 65 74 20 28 61 6c 6c 20 63 61 6c 6c 73  y set (all calls
2770: 20 74 6f 20 78 50 68 72 61 73 65 46 69 72 73 74   to xPhraseFirst
2780: 28 29 20 73 65 74 20 69 43 6f 6c 20 74 6f 20 2d  () set iCol to -
2790: 31 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68 72  1)...**..** xPhr
27a0: 61 73 65 4e 65 78 74 28 29 0d 0a 2a 2a 20 20 20  aseNext()..**   
27b0: 53 65 65 20 78 50 68 72 61 73 65 46 69 72 73 74  See xPhraseFirst
27c0: 20 61 62 6f 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   above...**..** 
27d0: 78 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c 75  xPhraseFirstColu
27e0: 6d 6e 28 29 0d 0a 2a 2a 20 20 20 54 68 69 73 20  mn()..**   This 
27f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 78 50 68  function and xPh
2800: 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 28 29  raseNextColumn()
2810: 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20   are similar to 
2820: 74 68 65 20 78 50 68 72 61 73 65 46 69 72 73 74  the xPhraseFirst
2830: 28 29 0d 0a 2a 2a 20 20 20 61 6e 64 20 78 50 68  ()..**   and xPh
2840: 72 61 73 65 4e 65 78 74 28 29 20 41 50 49 73 20  raseNext() APIs 
2850: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
2860: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2870: 69 73 20 74 68 61 74 20 69 6e 73 74 65 61 64 0d  is that instead.
2880: 0a 2a 2a 20 20 20 6f 66 20 69 74 65 72 61 74 69  .**   of iterati
2890: 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69  ng through all i
28a0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 61 20 70 68  nstances of a ph
28b0: 72 61 73 65 20 69 6e 20 74 68 65 20 63 75 72 72  rase in the curr
28c0: 65 6e 74 20 72 6f 77 2c 20 74 68 65 73 65 0d 0a  ent row, these..
28d0: 2a 2a 20 20 20 41 50 49 73 20 61 72 65 20 75 73  **   APIs are us
28e0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
28f0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6f 66  rough the set of
2900: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2910: 63 75 72 72 65 6e 74 20 72 6f 77 0d 0a 2a 2a 20  current row..** 
2920: 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f    that contain o
2930: 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74 61  ne or more insta
2940: 6e 63 65 73 20 6f 66 20 61 20 73 70 65 63 69 66  nces of a specif
2950: 69 65 64 20 70 68 72 61 73 65 2e 20 46 6f 72 20  ied phrase. For 
2960: 65 78 61 6d 70 6c 65 3a 0d 0a 2a 2a 0d 0a 2a 2a  example:..**..**
2970: 20 20 20 20 20 20 20 46 74 73 35 50 68 72 61 73         Fts5Phras
2980: 65 49 74 65 72 20 69 74 65 72 3b 0d 0a 2a 2a 20  eIter iter;..** 
2990: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0d        int iCol;.
29a0: 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 28 70 41  .**       for(pA
29b0: 70 69 2d 3e 78 50 68 72 61 73 65 46 69 72 73 74  pi->xPhraseFirst
29c0: 43 6f 6c 75 6d 6e 28 70 46 74 73 2c 20 69 50 68  Column(pFts, iPh
29d0: 72 61 73 65 2c 20 26 69 74 65 72 2c 20 26 69 43  rase, &iter, &iC
29e0: 6f 6c 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 20  ol);..**        
29f0: 20 20 20 69 43 6f 6c 3e 3d 30 3b 0d 0a 2a 2a 20     iCol>=0;..** 
2a00: 20 20 20 20 20 20 20 20 20 20 70 41 70 69 2d 3e            pApi->
2a10: 78 50 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d  xPhraseNextColum
2a20: 6e 28 70 46 74 73 2c 20 26 69 74 65 72 2c 20 26  n(pFts, &iter, &
2a30: 69 43 6f 6c 29 0d 0a 2a 2a 20 20 20 20 20 20 20  iCol)..**       
2a40: 29 7b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  ){..**         /
2a50: 2f 20 43 6f 6c 75 6d 6e 20 69 43 6f 6c 20 63 6f  / Column iCol co
2a60: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
2a70: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
2a80: 70 68 72 61 73 65 20 69 50 68 72 61 73 65 0d 0a  phrase iPhrase..
2a90: 2a 2a 20 20 20 20 20 20 20 7d 0d 0a 2a 2a 0d 0a  **       }..**..
2aa0: 2a 2a 20 20 20 54 68 69 73 20 41 50 49 20 63 61  **   This API ca
2ab0: 6e 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77 20  n be quite slow 
2ac0: 69 66 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  if used with an 
2ad0: 46 54 53 35 20 74 61 62 6c 65 20 63 72 65 61 74  FTS5 table creat
2ae0: 65 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20  ed with the..** 
2af0: 20 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20    "detail=none" 
2b00: 6f 70 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 46  option. If the F
2b10: 54 53 35 20 74 61 62 6c 65 20 69 73 20 63 72 65  TS5 table is cre
2b20: 61 74 65 64 20 77 69 74 68 20 65 69 74 68 65 72  ated with either
2b30: 20 0d 0a 2a 2a 20 20 20 22 64 65 74 61 69 6c 3d   ..**   "detail=
2b40: 6e 6f 6e 65 22 20 22 63 6f 6e 74 65 6e 74 3d 22  none" "content="
2b50: 20 6f 70 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66   option (i.e. if
2b60: 20 69 74 20 69 73 20 61 20 63 6f 6e 74 65 6e 74   it is a content
2b70: 6c 65 73 73 20 74 61 62 6c 65 29 2c 20 0d 0a 2a  less table), ..*
2b80: 2a 20 20 20 74 68 65 6e 20 74 68 69 73 20 41 50  *   then this AP
2b90: 49 20 61 6c 77 61 79 73 20 69 74 65 72 61 74 65  I always iterate
2ba0: 73 20 74 68 72 6f 75 67 68 20 61 6e 20 65 6d 70  s through an emp
2bb0: 74 79 20 73 65 74 20 28 61 6c 6c 20 63 61 6c 6c  ty set (all call
2bc0: 73 20 74 6f 20 0d 0a 2a 2a 20 20 20 78 50 68 72  s to ..**   xPhr
2bd0: 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28 29  aseFirstColumn()
2be0: 20 73 65 74 20 69 43 6f 6c 20 74 6f 20 2d 31 29   set iCol to -1)
2bf0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 20  ...**..**   The 
2c00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 63 63 65  information acce
2c10: 73 73 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  ssed using this 
2c20: 41 50 49 20 61 6e 64 20 69 74 73 20 63 6f 6d 70  API and its comp
2c30: 61 6e 69 6f 6e 0d 0a 2a 2a 20 20 20 78 50 68 72  anion..**   xPhr
2c40: 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28 29  aseFirstColumn()
2c50: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 62 74   may also be obt
2c60: 61 69 6e 65 64 20 75 73 69 6e 67 20 78 50 68 72  ained using xPhr
2c70: 61 73 65 46 69 72 73 74 2f 78 50 68 72 61 73 65  aseFirst/xPhrase
2c80: 4e 65 78 74 0d 0a 2a 2a 20 20 20 28 6f 72 20 78  Next..**   (or x
2c90: 49 6e 73 74 2f 78 49 6e 73 74 43 6f 75 6e 74 29  Inst/xInstCount)
2ca0: 2e 20 54 68 65 20 63 68 69 65 66 20 61 64 76 61  . The chief adva
2cb0: 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 41 50  ntage of this AP
2cc0: 49 20 69 73 20 74 68 61 74 20 69 74 20 69 73 0d  I is that it is.
2cd0: 0a 2a 2a 20 20 20 73 69 67 6e 69 66 69 63 61 6e  .**   significan
2ce0: 74 6c 79 20 6d 6f 72 65 20 65 66 66 69 63 69 65  tly more efficie
2cf0: 6e 74 20 74 68 61 6e 20 74 68 6f 73 65 20 61 6c  nt than those al
2d00: 74 65 72 6e 61 74 69 76 65 73 20 77 68 65 6e 20  ternatives when 
2d10: 75 73 65 64 20 77 69 74 68 0d 0a 2a 2a 20 20 20  used with..**   
2d20: 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e 22 20  "detail=column" 
2d30: 74 61 62 6c 65 73 2e 20 20 0d 0a 2a 2a 0d 0a 2a  tables.  ..**..*
2d40: 2a 20 78 50 68 72 61 73 65 4e 65 78 74 43 6f 6c  * xPhraseNextCol
2d50: 75 6d 6e 28 29 0d 0a 2a 2a 20 20 20 53 65 65 20  umn()..**   See 
2d60: 78 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c 75  xPhraseFirstColu
2d70: 6d 6e 20 61 62 6f 76 65 2e 0d 0a 2a 2f 0d 0a 73  mn above...*/..s
2d80: 74 72 75 63 74 20 46 74 73 35 45 78 74 65 6e 73  truct Fts5Extens
2d90: 69 6f 6e 41 70 69 20 7b 0d 0a 20 20 69 6e 74 20  ionApi {..  int 
2da0: 69 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  iVersion;       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2dc0: 75 72 72 65 6e 74 6c 79 20 61 6c 77 61 79 73 20  urrently always 
2dd0: 73 65 74 20 74 6f 20 33 20 2a 2f 0d 0a 0d 0a 20  set to 3 */.... 
2de0: 20 76 6f 69 64 20 2a 28 2a 78 55 73 65 72 44 61   void *(*xUserDa
2df0: 74 61 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a  ta)(Fts5Context*
2e00: 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 43  );....  int (*xC
2e10: 6f 6c 75 6d 6e 43 6f 75 6e 74 29 28 46 74 73 35  olumnCount)(Fts5
2e20: 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a 20 20 69 6e  Context*);..  in
2e30: 74 20 28 2a 78 52 6f 77 43 6f 75 6e 74 29 28 46  t (*xRowCount)(F
2e40: 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 73 71 6c  ts5Context*, sql
2e50: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 52 6f  ite3_int64 *pnRo
2e60: 77 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f  w);..  int (*xCo
2e70: 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 29 28 46  lumnTotalSize)(F
2e80: 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69 6e 74  ts5Context*, int
2e90: 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 33 5f 69   iCol, sqlite3_i
2ea0: 6e 74 36 34 20 2a 70 6e 54 6f 6b 65 6e 29 3b 0d  nt64 *pnToken);.
2eb0: 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  ...  int (*xToke
2ec0: 6e 69 7a 65 29 28 46 74 73 35 43 6f 6e 74 65 78  nize)(Fts5Contex
2ed0: 74 2a 2c 20 0d 0a 20 20 20 20 63 6f 6e 73 74 20  t*, ..    const 
2ee0: 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74  char *pText, int
2ef0: 20 6e 54 65 78 74 2c 20 2f 2a 20 54 65 78 74 20   nText, /* Text 
2f00: 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a  to tokenize */..
2f10: 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20      void *pCtx, 
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73    /* Context pas
2f40: 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20  sed to xToken() 
2f50: 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 28 2a 78 54  */..    int (*xT
2f60: 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74  oken)(void*, int
2f70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
2f80: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20  nt, int, int)   
2f90: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
2fa0: 2a 2f 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 69 6e  */..  );....  in
2fb0: 74 20 28 2a 78 50 68 72 61 73 65 43 6f 75 6e 74  t (*xPhraseCount
2fc0: 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 29 3b  )(Fts5Context*);
2fd0: 0d 0a 20 20 69 6e 74 20 28 2a 78 50 68 72 61 73  ..  int (*xPhras
2fe0: 65 53 69 7a 65 29 28 46 74 73 35 43 6f 6e 74 65  eSize)(Fts5Conte
2ff0: 78 74 2a 2c 20 69 6e 74 20 69 50 68 72 61 73 65  xt*, int iPhrase
3000: 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 49  );....  int (*xI
3010: 6e 73 74 43 6f 75 6e 74 29 28 46 74 73 35 43 6f  nstCount)(Fts5Co
3020: 6e 74 65 78 74 2a 2c 20 69 6e 74 20 2a 70 6e 49  ntext*, int *pnI
3030: 6e 73 74 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78  nst);..  int (*x
3040: 49 6e 73 74 29 28 46 74 73 35 43 6f 6e 74 65 78  Inst)(Fts5Contex
3050: 74 2a 2c 20 69 6e 74 20 69 49 64 78 2c 20 69 6e  t*, int iIdx, in
3060: 74 20 2a 70 69 50 68 72 61 73 65 2c 20 69 6e 74  t *piPhrase, int
3070: 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 69   *piCol, int *pi
3080: 4f 66 66 29 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74  Off);....  sqlit
3090: 65 33 5f 69 6e 74 36 34 20 28 2a 78 52 6f 77 69  e3_int64 (*xRowi
30a0: 64 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 29  d)(Fts5Context*)
30b0: 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6c 75  ;..  int (*xColu
30c0: 6d 6e 54 65 78 74 29 28 46 74 73 35 43 6f 6e 74  mnText)(Fts5Cont
30d0: 65 78 74 2a 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  ext*, int iCol, 
30e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c  const char **pz,
30f0: 20 69 6e 74 20 2a 70 6e 29 3b 0d 0a 20 20 69 6e   int *pn);..  in
3100: 74 20 28 2a 78 43 6f 6c 75 6d 6e 53 69 7a 65 29  t (*xColumnSize)
3110: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69  (Fts5Context*, i
3120: 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6e  nt iCol, int *pn
3130: 54 6f 6b 65 6e 29 3b 0d 0a 0d 0a 20 20 69 6e 74  Token);....  int
3140: 20 28 2a 78 51 75 65 72 79 50 68 72 61 73 65 29   (*xQueryPhrase)
3150: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69  (Fts5Context*, i
3160: 6e 74 20 69 50 68 72 61 73 65 2c 20 76 6f 69 64  nt iPhrase, void
3170: 20 2a 70 55 73 65 72 44 61 74 61 2c 0d 0a 20 20   *pUserData,..  
3180: 20 20 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 46    int(*)(const F
3190: 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 2a  ts5ExtensionApi*
31a0: 2c 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 76 6f  ,Fts5Context*,vo
31b0: 69 64 2a 29 0d 0a 20 20 29 3b 0d 0a 20 20 69 6e  id*)..  );..  in
31c0: 74 20 28 2a 78 53 65 74 41 75 78 64 61 74 61 29  t (*xSetAuxdata)
31d0: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 76  (Fts5Context*, v
31e0: 6f 69 64 20 2a 70 41 75 78 2c 20 76 6f 69 64 28  oid *pAux, void(
31f0: 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a 29  *xDelete)(void*)
3200: 29 3b 0d 0a 20 20 76 6f 69 64 20 2a 28 2a 78 47  );..  void *(*xG
3210: 65 74 41 75 78 64 61 74 61 29 28 46 74 73 35 43  etAuxdata)(Fts5C
3220: 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 62 43 6c  ontext*, int bCl
3230: 65 61 72 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28  ear);....  int (
3240: 2a 78 50 68 72 61 73 65 46 69 72 73 74 29 28 46  *xPhraseFirst)(F
3250: 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69 6e 74  ts5Context*, int
3260: 20 69 50 68 72 61 73 65 2c 20 46 74 73 35 50 68   iPhrase, Fts5Ph
3270: 72 61 73 65 49 74 65 72 2a 2c 20 69 6e 74 2a 2c  raseIter*, int*,
3280: 20 69 6e 74 2a 29 3b 0d 0a 20 20 76 6f 69 64 20   int*);..  void 
3290: 28 2a 78 50 68 72 61 73 65 4e 65 78 74 29 28 46  (*xPhraseNext)(F
32a0: 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 46 74 73  ts5Context*, Fts
32b0: 35 50 68 72 61 73 65 49 74 65 72 2a 2c 20 69 6e  5PhraseIter*, in
32c0: 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  t *piCol, int *p
32d0: 69 4f 66 66 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20  iOff);....  int 
32e0: 28 2a 78 50 68 72 61 73 65 46 69 72 73 74 43 6f  (*xPhraseFirstCo
32f0: 6c 75 6d 6e 29 28 46 74 73 35 43 6f 6e 74 65 78  lumn)(Fts5Contex
3300: 74 2a 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c  t*, int iPhrase,
3310: 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72 2a   Fts5PhraseIter*
3320: 2c 20 69 6e 74 2a 29 3b 0d 0a 20 20 76 6f 69 64  , int*);..  void
3330: 20 28 2a 78 50 68 72 61 73 65 4e 65 78 74 43 6f   (*xPhraseNextCo
3340: 6c 75 6d 6e 29 28 46 74 73 35 43 6f 6e 74 65 78  lumn)(Fts5Contex
3350: 74 2a 2c 20 46 74 73 35 50 68 72 61 73 65 49 74  t*, Fts5PhraseIt
3360: 65 72 2a 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29  er*, int *piCol)
3370: 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a  ;..};..../* ..**
3380: 20 43 55 53 54 4f 4d 20 41 55 58 49 4c 49 41 52   CUSTOM AUXILIAR
3390: 59 20 46 55 4e 43 54 49 4f 4e 53 0d 0a 2a 2a 2a  Y FUNCTIONS..***
33a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e0: 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a  ******/..../****
33f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3430: 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 43 55 53 54 4f 4d  *****..** CUSTOM
3440: 20 54 4f 4b 45 4e 49 5a 45 52 53 0d 0a 2a 2a 0d   TOKENIZERS..**.
3450: 0a 2a 2a 20 41 70 70 6c 69 63 61 74 69 6f 6e 73  .** Applications
3460: 20 6d 61 79 20 61 6c 73 6f 20 72 65 67 69 73 74   may also regist
3470: 65 72 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e 69  er custom tokeni
3480: 7a 65 72 20 74 79 70 65 73 2e 20 41 20 74 6f 6b  zer types. A tok
3490: 65 6e 69 7a 65 72 20 0d 0a 2a 2a 20 69 73 20 72  enizer ..** is r
34a0: 65 67 69 73 74 65 72 65 64 20 62 79 20 70 72 6f  egistered by pro
34b0: 76 69 64 69 6e 67 20 66 74 73 35 20 77 69 74 68  viding fts5 with
34c0: 20 61 20 70 6f 70 75 6c 61 74 65 64 20 69 6e 73   a populated ins
34d0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 0d 0a 2a  tance of the ..*
34e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  * following stru
34f0: 63 74 75 72 65 2e 20 41 6c 6c 20 73 74 72 75 63  cture. All struc
3500: 74 75 72 65 20 6d 65 74 68 6f 64 73 20 6d 75 73  ture methods mus
3510: 74 20 62 65 20 64 65 66 69 6e 65 64 2c 20 73 65  t be defined, se
3520: 74 74 69 6e 67 0d 0a 2a 2a 20 61 6e 79 20 6d 65  tting..** any me
3530: 6d 62 65 72 20 6f 66 20 74 68 65 20 66 74 73 35  mber of the fts5
3540: 5f 74 6f 6b 65 6e 69 7a 65 72 20 73 74 72 75 63  _tokenizer struc
3550: 74 20 74 6f 20 4e 55 4c 4c 20 6c 65 61 64 73 20  t to NULL leads 
3560: 74 6f 20 75 6e 64 65 66 69 6e 65 64 0d 0a 2a 2a  to undefined..**
3570: 20 62 65 68 61 76 69 6f 75 72 2e 20 54 68 65 20   behaviour. The 
3580: 73 74 72 75 63 74 75 72 65 20 6d 65 74 68 6f 64  structure method
3590: 73 20 61 72 65 20 65 78 70 65 63 74 65 64 20 74  s are expected t
35a0: 6f 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 66 6f  o function as fo
35b0: 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 78  llows:..**..** x
35c0: 43 72 65 61 74 65 3a 0d 0a 2a 2a 20 20 20 54 68  Create:..**   Th
35d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
35e0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
35f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
3600: 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6e 73 74 61   tokenizer insta
3610: 6e 63 65 2e 0d 0a 2a 2a 20 20 20 41 20 74 6f 6b  nce...**   A tok
3620: 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65 20  enizer instance 
3630: 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
3640: 63 74 75 61 6c 6c 79 20 74 6f 6b 65 6e 69 7a 65  ctually tokenize
3650: 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20   text...**..**  
3660: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
3670: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
3680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
3690: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 28 76 6f   copy of the (vo
36a0: 69 64 2a 29 0d 0a 2a 2a 20 20 20 70 6f 69 6e 74  id*)..**   point
36b0: 65 72 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  er provided by t
36c0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 77  he application w
36d0: 68 65 6e 20 74 68 65 20 66 74 73 35 5f 74 6f 6b  hen the fts5_tok
36e0: 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 0d 0a 2a  enizer object..*
36f0: 2a 20 20 20 77 61 73 20 72 65 67 69 73 74 65 72  *   was register
3700: 65 64 20 77 69 74 68 20 46 54 53 35 20 28 74 68  ed with FTS5 (th
3710: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3720: 20 74 6f 20 78 43 72 65 61 74 65 54 6f 6b 65 6e   to xCreateToken
3730: 69 7a 65 72 28 29 29 2e 20 0d 0a 2a 2a 20 20 20  izer()). ..**   
3740: 54 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  The second and t
3750: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 61  hird arguments a
3760: 72 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  re an array of n
3770: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
3780: 72 69 6e 67 73 0d 0a 2a 2a 20 20 20 63 6f 6e 74  rings..**   cont
3790: 61 69 6e 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e  aining the token
37a0: 69 7a 65 72 20 61 72 67 75 6d 65 6e 74 73 2c 20  izer arguments, 
37b0: 69 66 20 61 6e 79 2c 20 73 70 65 63 69 66 69 65  if any, specifie
37c0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0d  d following the.
37d0: 0a 2a 2a 20 20 20 74 6f 6b 65 6e 69 7a 65 72 20  .**   tokenizer 
37e0: 6e 61 6d 65 20 61 73 20 70 61 72 74 20 6f 66 20  name as part of 
37f0: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
3800: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
3810: 6e 74 20 75 73 65 64 0d 0a 2a 2a 20 20 20 74 6f  nt used..**   to
3820: 20 63 72 65 61 74 65 20 74 68 65 20 46 54 53 35   create the FTS5
3830: 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   table...**..** 
3840: 20 20 54 68 65 20 66 69 6e 61 6c 20 61 72 67 75    The final argu
3850: 6d 65 6e 74 20 69 73 20 61 6e 20 6f 75 74 70 75  ment is an outpu
3860: 74 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 73  t variable. If s
3870: 75 63 63 65 73 73 66 75 6c 2c 20 28 2a 70 70 4f  uccessful, (*ppO
3880: 75 74 29 20 0d 0a 2a 2a 20 20 20 73 68 6f 75 6c  ut) ..**   shoul
3890: 64 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  d be set to poin
38a0: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 74 6f 6b  t to the new tok
38b0: 65 6e 69 7a 65 72 20 68 61 6e 64 6c 65 20 61 6e  enizer handle an
38c0: 64 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a 20  d SQLITE_OK..** 
38d0: 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61    returned. If a
38e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
38f0: 73 6f 6d 65 20 76 61 6c 75 65 20 6f 74 68 65 72  some value other
3900: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
3910: 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 62 65 20  should..**   be 
3920: 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
3930: 73 20 63 61 73 65 2c 20 66 74 73 35 20 61 73 73  s case, fts5 ass
3940: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 66 69  umes that the fi
3950: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  nal value of *pp
3960: 4f 75 74 20 0d 0a 2a 2a 20 20 20 69 73 20 75 6e  Out ..**   is un
3970: 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a  defined...**..**
3980: 20 78 44 65 6c 65 74 65 3a 0d 0a 2a 2a 20 20 20   xDelete:..**   
3990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
39a0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 64 65 6c 65   invoked to dele
39b0: 74 65 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 68  te a tokenizer h
39c0: 61 6e 64 6c 65 20 70 72 65 76 69 6f 75 73 6c 79  andle previously
39d0: 0d 0a 2a 2a 20 20 20 61 6c 6c 6f 63 61 74 65 64  ..**   allocated
39e0: 20 75 73 69 6e 67 20 78 43 72 65 61 74 65 28 29   using xCreate()
39f0: 2e 20 46 74 73 35 20 67 75 61 72 61 6e 74 65 65  . Fts5 guarantee
3a00: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3a10: 74 69 6f 6e 20 77 69 6c 6c 0d 0a 2a 2a 20 20 20  tion will..**   
3a20: 62 65 20 69 6e 76 6f 6b 65 64 20 65 78 61 63 74  be invoked exact
3a30: 6c 79 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ly once for each
3a40: 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
3a50: 20 74 6f 20 78 43 72 65 61 74 65 28 29 2e 0d 0a   to xCreate()...
3a60: 2a 2a 0d 0a 2a 2a 20 78 54 6f 6b 65 6e 69 7a 65  **..** xTokenize
3a70: 3a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 66 75 6e  :..**   This fun
3a80: 63 74 69 6f 6e 20 69 73 20 65 78 70 65 63 74 65  ction is expecte
3a90: 64 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 74 68  d to tokenize th
3aa0: 65 20 6e 54 65 78 74 20 62 79 74 65 20 73 74 72  e nText byte str
3ab0: 69 6e 67 20 69 6e 64 69 63 61 74 65 64 20 0d 0a  ing indicated ..
3ac0: 2a 2a 20 20 20 62 79 20 61 72 67 75 6d 65 6e 74  **   by argument
3ad0: 20 70 54 65 78 74 2e 20 70 54 65 78 74 20 6d 61   pText. pText ma
3ae0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
3af0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  nul-terminated. 
3b00: 54 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 20 20  The first..**   
3b10: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
3b20: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
3b30: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3b40: 20 61 6e 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65   an Fts5Tokenize
3b50: 72 20 6f 62 6a 65 63 74 0d 0a 2a 2a 20 20 20 72  r object..**   r
3b60: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
3b70: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 78 43  rlier call to xC
3b80: 72 65 61 74 65 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a  reate()...**..**
3b90: 20 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72     The second ar
3ba0: 67 75 6d 65 6e 74 20 69 6e 64 69 63 61 74 65 73  gument indicates
3bb0: 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 61 74   the reason that
3bc0: 20 46 54 53 35 20 69 73 20 72 65 71 75 65 73 74   FTS5 is request
3bd0: 69 6e 67 0d 0a 2a 2a 20 20 20 74 6f 6b 65 6e 69  ing..**   tokeni
3be0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  zation of the su
3bf0: 70 70 6c 69 65 64 20 74 65 78 74 2e 20 54 68 69  pplied text. Thi
3c00: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
3c10: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3c20: 0d 0a 2a 2a 20 20 20 66 6f 75 72 20 76 61 6c 75  ..**   four valu
3c30: 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c 75  es:..**..**   <u
3c40: 6c 3e 3c 6c 69 3e 20 3c 62 3e 46 54 53 35 5f 54  l><li> <b>FTS5_T
3c50: 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e 54  OKENIZE_DOCUMENT
3c60: 3c 2f 62 3e 20 2d 20 41 20 64 6f 63 75 6d 65 6e  </b> - A documen
3c70: 74 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  t is being inser
3c80: 74 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 20 20 20  ted into..**    
3c90: 20 20 20 20 20 20 20 20 6f 72 20 72 65 6d 6f 76          or remov
3ca0: 65 64 20 66 72 6f 6d 20 74 68 65 20 46 54 53 20  ed from the FTS 
3cb0: 74 61 62 6c 65 2e 20 54 68 65 20 74 6f 6b 65 6e  table. The token
3cc0: 69 7a 65 72 20 69 73 20 62 65 69 6e 67 20 69 6e  izer is being in
3cd0: 76 6f 6b 65 64 20 74 6f 0d 0a 2a 2a 20 20 20 20  voked to..**    
3ce0: 20 20 20 20 20 20 20 20 64 65 74 65 72 6d 69 6e          determin
3cf0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 6f 6b  e the set of tok
3d00: 65 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 28 6f  ens to add to (o
3d10: 72 20 64 65 6c 65 74 65 20 66 72 6f 6d 29 20 74  r delete from) t
3d20: 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  he..**          
3d30: 20 20 46 54 53 20 69 6e 64 65 78 2e 0d 0a 2a 2a    FTS index...**
3d40: 0d 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 69 3e 20  ..**       <li> 
3d50: 3c 62 3e 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45  <b>FTS5_TOKENIZE
3d60: 5f 51 55 45 52 59 3c 2f 62 3e 20 2d 20 41 20 4d  _QUERY</b> - A M
3d70: 41 54 43 48 20 71 75 65 72 79 20 69 73 20 62 65  ATCH query is be
3d80: 69 6e 67 20 65 78 65 63 75 74 65 64 20 0d 0a 2a  ing executed ..*
3d90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 61 67 61  *            aga
3da0: 69 6e 73 74 20 74 68 65 20 46 54 53 20 69 6e 64  inst the FTS ind
3db0: 65 78 2e 20 54 68 65 20 74 6f 6b 65 6e 69 7a 65  ex. The tokenize
3dc0: 72 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  r is being calle
3dd0: 64 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 0d 0a  d to tokenize ..
3de0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  **            a 
3df0: 62 61 72 65 77 6f 72 64 20 6f 72 20 71 75 6f 74  bareword or quot
3e00: 65 64 20 73 74 72 69 6e 67 20 73 70 65 63 69 66  ed string specif
3e10: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
3e20: 68 65 20 71 75 65 72 79 2e 0d 0a 2a 2a 0d 0a 2a  he query...**..*
3e30: 2a 20 20 20 20 20 20 20 3c 6c 69 3e 20 3c 62 3e  *       <li> <b>
3e40: 28 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51  (FTS5_TOKENIZE_Q
3e50: 55 45 52 59 20 7c 20 46 54 53 35 5f 54 4f 4b 45  UERY | FTS5_TOKE
3e60: 4e 49 5a 45 5f 50 52 45 46 49 58 29 3c 2f 62 3e  NIZE_PREFIX)</b>
3e70: 20 2d 20 53 61 6d 65 20 61 73 0d 0a 2a 2a 20 20   - Same as..**  
3e80: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 54            FTS5_T
3e90: 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 2c 20 65  OKENIZE_QUERY, e
3ea0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 62  xcept that the b
3eb0: 61 72 65 77 6f 72 64 20 6f 72 20 71 75 6f 74 65  areword or quote
3ec0: 64 20 73 74 72 69 6e 67 20 69 73 0d 0a 2a 2a 20  d string is..** 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f             follo
3ee0: 77 65 64 20 62 79 20 61 20 22 2a 22 20 63 68 61  wed by a "*" cha
3ef0: 72 61 63 74 65 72 2c 20 69 6e 64 69 63 61 74 69  racter, indicati
3f00: 6e 67 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ng that the last
3f10: 20 74 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 20 20 20   token..**      
3f20: 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20 62        returned b
3f30: 79 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  y the tokenizer 
3f40: 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20  will be treated 
3f50: 61 73 20 61 20 74 6f 6b 65 6e 20 70 72 65 66 69  as a token prefi
3f60: 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20  x...**..**      
3f70: 20 3c 6c 69 3e 20 3c 62 3e 46 54 53 35 5f 54 4f   <li> <b>FTS5_TO
3f80: 4b 45 4e 49 5a 45 5f 41 55 58 3c 2f 62 3e 20 2d  KENIZE_AUX</b> -
3f90: 20 54 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69   The tokenizer i
3fa0: 73 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  s being invoked 
3fb0: 74 6f 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  to ..**         
3fc0: 20 20 20 73 61 74 69 73 66 79 20 61 6e 20 66 74     satisfy an ft
3fd0: 73 35 5f 61 70 69 2e 78 54 6f 6b 65 6e 69 7a 65  s5_api.xTokenize
3fe0: 28 29 20 72 65 71 75 65 73 74 20 6d 61 64 65 20  () request made 
3ff0: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 0d  by an auxiliary.
4000: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 66  .**            f
4010: 75 6e 63 74 69 6f 6e 2e 20 4f 72 20 61 6e 20 66  unction. Or an f
4020: 74 73 35 5f 61 70 69 2e 78 43 6f 6c 75 6d 6e 53  ts5_api.xColumnS
4030: 69 7a 65 28 29 20 72 65 71 75 65 73 74 20 6d 61  ize() request ma
4040: 64 65 20 62 79 20 74 68 65 20 73 61 6d 65 0d 0a  de by the same..
4050: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  **            on
4060: 20 61 20 63 6f 6c 75 6d 6e 73 69 7a 65 3d 30 20   a columnsize=0 
4070: 64 61 74 61 62 61 73 65 2e 20 20 0d 0a 2a 2a 20  database.  ..** 
4080: 20 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20    </ul>..**..** 
4090: 20 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e    For each token
40a0: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   in the input st
40b0: 72 69 6e 67 2c 20 74 68 65 20 73 75 70 70 6c 69  ring, the suppli
40c0: 65 64 20 63 61 6c 6c 62 61 63 6b 20 78 54 6f 6b  ed callback xTok
40d0: 65 6e 28 29 20 6d 75 73 74 0d 0a 2a 2a 20 20 20  en() must..**   
40e0: 62 65 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20  be invoked. The 
40f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
4100: 6f 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 61  o it should be a
4110: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69   copy of the poi
4120: 6e 74 65 72 0d 0a 2a 2a 20 20 20 70 61 73 73 65  nter..**   passe
4130: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
4140: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b  argument to xTok
4150: 65 6e 69 7a 65 28 29 2e 20 54 68 65 20 74 68 69  enize(). The thi
4160: 72 64 20 61 6e 64 20 66 6f 75 72 74 68 0d 0a 2a  rd and fourth..*
4170: 2a 20 20 20 61 72 67 75 6d 65 6e 74 73 20 61 72  *   arguments ar
4180: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
4190: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
41a0: 6e 67 20 74 68 65 20 74 6f 6b 65 6e 20 74 65 78  ng the token tex
41b0: 74 2c 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 20  t, and the..**  
41c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 74 6f 6b   size of the tok
41d0: 65 6e 20 69 6e 20 62 79 74 65 73 2e 20 54 68 65  en in bytes. The
41e0: 20 34 74 68 20 61 6e 64 20 35 74 68 20 61 72 67   4th and 5th arg
41f0: 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 62  uments are the b
4200: 79 74 65 20 6f 66 66 73 65 74 73 0d 0a 2a 2a 20  yte offsets..** 
4210: 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62    of the first b
4220: 79 74 65 20 6f 66 20 61 6e 64 20 66 69 72 73 74  yte of and first
4230: 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
4240: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4250: 74 65 78 74 20 66 72 6f 6d 0d 0a 2a 2a 20 20 20  text from..**   
4260: 77 68 69 63 68 20 74 68 65 20 74 6f 6b 65 6e 20  which the token 
4270: 69 73 20 64 65 72 69 76 65 64 20 77 69 74 68 69  is derived withi
4280: 6e 20 74 68 65 20 69 6e 70 75 74 2e 0d 0a 2a 2a  n the input...**
4290: 0d 0a 2a 2a 20 20 20 54 68 65 20 73 65 63 6f 6e  ..**   The secon
42a0: 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  d argument passe
42b0: 64 20 74 6f 20 74 68 65 20 78 54 6f 6b 65 6e 28  d to the xToken(
42c0: 29 20 63 61 6c 6c 62 61 63 6b 20 28 22 74 66 6c  ) callback ("tfl
42d0: 61 67 73 22 29 20 73 68 6f 75 6c 64 0d 0a 2a 2a  ags") should..**
42e0: 20 20 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73     normally be s
42f0: 65 74 20 74 6f 20 30 2e 20 54 68 65 20 65 78 63  et to 0. The exc
4300: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
4310: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 75 70 70 6f   tokenizer suppo
4320: 72 74 73 20 0d 0a 2a 2a 20 20 20 73 79 6e 6f 6e  rts ..**   synon
4330: 79 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  yms. In this cas
4340: 65 20 73 65 65 20 74 68 65 20 64 69 73 63 75 73  e see the discus
4350: 73 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 64  sion below for d
4360: 65 74 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  etails...**..** 
4370: 20 20 46 54 53 35 20 61 73 73 75 6d 65 73 20 74    FTS5 assumes t
4380: 68 65 20 78 54 6f 6b 65 6e 28 29 20 63 61 6c 6c  he xToken() call
4390: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
43a0: 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  for each token i
43b0: 6e 20 74 68 65 20 0d 0a 2a 2a 20 20 20 6f 72 64  n the ..**   ord
43c0: 65 72 20 74 68 61 74 20 74 68 65 79 20 6f 63 63  er that they occ
43d0: 75 72 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  ur within the in
43e0: 70 75 74 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a  put text...**..*
43f0: 2a 20 20 20 49 66 20 61 6e 20 78 54 6f 6b 65 6e  *   If an xToken
4400: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  () callback retu
4410: 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
4420: 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
4430: 4f 4b 2c 20 74 68 65 6e 0d 0a 2a 2a 20 20 20 74  OK, then..**   t
4440: 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  he tokenization 
4450: 73 68 6f 75 6c 64 20 62 65 20 61 62 61 6e 64 6f  should be abando
4460: 6e 65 64 20 61 6e 64 20 74 68 65 20 78 54 6f 6b  ned and the xTok
4470: 65 6e 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 73  enize() method s
4480: 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 69 6d 6d 65  hould..**   imme
4490: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 61  diately return a
44a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 78 54 6f   copy of the xTo
44b0: 6b 65 6e 28 29 20 72 65 74 75 72 6e 20 76 61 6c  ken() return val
44c0: 75 65 2e 20 4f 72 2c 20 69 66 20 74 68 65 0d 0a  ue. Or, if the..
44d0: 2a 2a 20 20 20 69 6e 70 75 74 20 62 75 66 66 65  **   input buffe
44e0: 72 20 69 73 20 65 78 68 61 75 73 74 65 64 2c 20  r is exhausted, 
44f0: 78 54 6f 6b 65 6e 69 7a 65 28 29 20 73 68 6f 75  xTokenize() shou
4500: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
4510: 5f 4f 4b 2e 20 46 69 6e 61 6c 6c 79 2c 0d 0a 2a  _OK. Finally,..*
4520: 2a 20 20 20 69 66 20 61 6e 20 65 72 72 6f 72 20  *   if an error 
4530: 6f 63 63 75 72 73 20 77 69 74 68 20 74 68 65 20  occurs with the 
4540: 78 54 6f 6b 65 6e 69 7a 65 28 29 20 69 6d 70 6c  xTokenize() impl
4550: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 73 65 6c  ementation itsel
4560: 66 2c 20 69 74 0d 0a 2a 2a 20 20 20 6d 61 79 20  f, it..**   may 
4570: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 6f 6b 65  abandon the toke
4580: 6e 69 7a 61 74 69 6f 6e 20 61 6e 64 20 72 65 74  nization and ret
4590: 75 72 6e 20 61 6e 79 20 65 72 72 6f 72 20 63 6f  urn any error co
45a0: 64 65 20 6f 74 68 65 72 20 74 68 61 6e 0d 0a 2a  de other than..*
45b0: 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  *   SQLITE_OK or
45c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0d 0a 2a   SQLITE_DONE...*
45d0: 2a 0d 0a 2a 2a 20 53 59 4e 4f 4e 59 4d 20 53 55  *..** SYNONYM SU
45e0: 50 50 4f 52 54 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  PPORT..**..**   
45f0: 43 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72  Custom tokenizer
4600: 73 20 6d 61 79 20 61 6c 73 6f 20 73 75 70 70 6f  s may also suppo
4610: 72 74 20 73 79 6e 6f 6e 79 6d 73 2e 20 43 6f 6e  rt synonyms. Con
4620: 73 69 64 65 72 20 61 20 63 61 73 65 20 69 6e 20  sider a case in 
4630: 77 68 69 63 68 20 61 0d 0a 2a 2a 20 20 20 75 73  which a..**   us
4640: 65 72 20 77 69 73 68 65 73 20 74 6f 20 71 75 65  er wishes to que
4650: 72 79 20 66 6f 72 20 61 20 70 68 72 61 73 65 20  ry for a phrase 
4660: 73 75 63 68 20 61 73 20 22 66 69 72 73 74 20 70  such as "first p
4670: 6c 61 63 65 22 2e 20 55 73 69 6e 67 20 74 68 65  lace". Using the
4680: 20 0d 0a 2a 2a 20 20 20 62 75 69 6c 74 2d 69 6e   ..**   built-in
4690: 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 20 74 68 65   tokenizers, the
46a0: 20 46 54 53 35 20 71 75 65 72 79 20 27 66 69 72   FTS5 query 'fir
46b0: 73 74 20 2b 20 70 6c 61 63 65 27 20 77 69 6c 6c  st + place' will
46c0: 20 6d 61 74 63 68 20 69 6e 73 74 61 6e 63 65 73   match instances
46d0: 0d 0a 2a 2a 20 20 20 6f 66 20 22 66 69 72 73 74  ..**   of "first
46e0: 20 70 6c 61 63 65 22 20 77 69 74 68 69 6e 20 74   place" within t
46f0: 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 65 74 2c  he document set,
4700: 20 62 75 74 20 6e 6f 74 20 61 6c 74 65 72 6e 61   but not alterna
4710: 74 69 76 65 20 66 6f 72 6d 73 0d 0a 2a 2a 20 20  tive forms..**  
4720: 20 73 75 63 68 20 61 73 20 22 31 73 74 20 70 6c   such as "1st pl
4730: 61 63 65 22 2e 20 49 6e 20 73 6f 6d 65 20 61 70  ace". In some ap
4740: 70 6c 69 63 61 74 69 6f 6e 73 2c 20 69 74 20 77  plications, it w
4750: 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72 20 74  ould be better t
4760: 6f 20 6d 61 74 63 68 0d 0a 2a 2a 20 20 20 61 6c  o match..**   al
4770: 6c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 22  l instances of "
4780: 66 69 72 73 74 20 70 6c 61 63 65 22 20 6f 72 20  first place" or 
4790: 22 31 73 74 20 70 6c 61 63 65 22 20 72 65 67 61  "1st place" rega
47a0: 72 64 6c 65 73 73 20 6f 66 20 77 68 69 63 68 20  rdless of which 
47b0: 66 6f 72 6d 0d 0a 2a 2a 20 20 20 74 68 65 20 75  form..**   the u
47c0: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ser specified in
47d0: 20 74 68 65 20 4d 41 54 43 48 20 71 75 65 72 79   the MATCH query
47e0: 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20   text...**..**  
47f0: 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
4800: 61 6c 20 77 61 79 73 20 74 6f 20 61 70 70 72 6f  al ways to appro
4810: 61 63 68 20 74 68 69 73 20 69 6e 20 46 54 53 35  ach this in FTS5
4820: 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c 6f 6c 3e  :..**..**   <ol>
4830: 3c 6c 69 3e 20 42 79 20 6d 61 70 70 69 6e 67 20  <li> By mapping 
4840: 61 6c 6c 20 73 79 6e 6f 6e 79 6d 73 20 74 6f 20  all synonyms to 
4850: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 2e 20  a single token. 
4860: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
4870: 65 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e ..**          
4880: 20 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 65    In the above e
4890: 78 61 6d 70 6c 65 2c 20 74 68 69 73 20 6d 65 61  xample, this mea
48a0: 6e 73 20 74 68 61 74 20 74 68 65 20 74 6f 6b 65  ns that the toke
48b0: 6e 69 7a 65 72 20 72 65 74 75 72 6e 73 20 74 68  nizer returns th
48c0: 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
48d0: 20 73 61 6d 65 20 74 6f 6b 65 6e 20 66 6f 72 20   same token for 
48e0: 69 6e 70 75 74 73 20 22 66 69 72 73 74 22 20 61  inputs "first" a
48f0: 6e 64 20 22 31 73 74 22 2e 20 53 61 79 20 74 68  nd "1st". Say th
4900: 61 74 20 74 6f 6b 65 6e 20 69 73 20 69 6e 0d 0a  at token is in..
4910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 66 61  **            fa
4920: 63 74 20 22 66 69 72 73 74 22 2c 20 73 6f 20 74  ct "first", so t
4930: 68 61 74 20 77 68 65 6e 20 74 68 65 20 75 73 65  hat when the use
4940: 72 20 69 6e 73 65 72 74 73 20 74 68 65 20 64 6f  r inserts the do
4950: 63 75 6d 65 6e 74 20 22 49 20 77 6f 6e 0d 0a 2a  cument "I won..*
4960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 31 73 74  *            1st
4970: 20 70 6c 61 63 65 22 20 65 6e 74 72 69 65 73 20   place" entries 
4980: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
4990: 20 69 6e 64 65 78 20 66 6f 72 20 74 6f 6b 65 6e   index for token
49a0: 73 20 22 69 22 2c 20 22 77 6f 6e 22 2c 0d 0a 2a  s "i", "won",..*
49b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69  *            "fi
49c0: 72 73 74 22 20 61 6e 64 20 22 70 6c 61 63 65 22  rst" and "place"
49d0: 2e 20 49 66 20 74 68 65 20 75 73 65 72 20 74 68  . If the user th
49e0: 65 6e 20 71 75 65 72 69 65 73 20 66 6f 72 20 27  en queries for '
49f0: 31 73 74 20 2b 20 70 6c 61 63 65 27 2c 0d 0a 2a  1st + place',..*
4a00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65  *            the
4a10: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 75 62 73 74   tokenizer subst
4a20: 69 74 75 74 65 73 20 22 66 69 72 73 74 22 20 66  itutes "first" f
4a30: 6f 72 20 22 31 73 74 22 20 61 6e 64 20 74 68 65  or "1st" and the
4a40: 20 71 75 65 72 79 20 77 6f 72 6b 73 0d 0a 2a 2a   query works..**
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 20 65              as e
4a60: 78 70 65 63 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a  xpected...**..**
4a70: 20 20 20 20 20 20 20 3c 6c 69 3e 20 42 79 20 61         <li> By a
4a80: 64 64 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73  dding multiple s
4a90: 79 6e 6f 6e 79 6d 73 20 66 6f 72 20 61 20 73 69  ynonyms for a si
4aa0: 6e 67 6c 65 20 74 65 72 6d 20 74 6f 20 74 68 65  ngle term to the
4ab0: 20 46 54 53 20 69 6e 64 65 78 2e 0d 0a 2a 2a 20   FTS index...** 
4ac0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 20 74 68             In th
4ad0: 69 73 20 63 61 73 65 2c 20 77 68 65 6e 20 74 6f  is case, when to
4ae0: 6b 65 6e 69 7a 69 6e 67 20 71 75 65 72 79 20 74  kenizing query t
4af0: 65 78 74 2c 20 74 68 65 20 74 6f 6b 65 6e 69 7a  ext, the tokeniz
4b00: 65 72 20 6d 61 79 20 0d 0a 2a 2a 20 20 20 20 20  er may ..**     
4b10: 20 20 20 20 20 20 20 70 72 6f 76 69 64 65 20 6d         provide m
4b20: 75 6c 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d 73  ultiple synonyms
4b30: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
4b40: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f  rm within the do
4b50: 63 75 6d 65 6e 74 2e 0d 0a 2a 2a 20 20 20 20 20  cument...**     
4b60: 20 20 20 20 20 20 20 46 54 53 35 20 74 68 65 6e         FTS5 then
4b70: 20 71 75 65 72 69 65 73 20 74 68 65 20 69 6e 64   queries the ind
4b80: 65 78 20 66 6f 72 20 65 61 63 68 20 73 79 6e 6f  ex for each syno
4b90: 6e 79 6d 20 69 6e 64 69 76 69 64 75 61 6c 6c 79  nym individually
4ba0: 2e 20 46 6f 72 0d 0a 2a 2a 20 20 20 20 20 20 20  . For..**       
4bb0: 20 20 20 20 20 65 78 61 6d 70 6c 65 2c 20 66 61       example, fa
4bc0: 63 65 64 20 77 69 74 68 20 74 68 65 20 71 75 65  ced with the que
4bd0: 72 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c 63  ry:..**..**   <c
4be0: 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 20 20 20  odeblock>..**   
4bf0: 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 66 69 72    ... MATCH 'fir
4c00: 73 74 20 70 6c 61 63 65 27 3c 2f 63 6f 64 65 62  st place'</codeb
4c10: 6c 6f 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  lock>..**..**   
4c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 6f 6b           the tok
4c30: 65 6e 69 7a 65 72 20 6f 66 66 65 72 73 20 62 6f  enizer offers bo
4c40: 74 68 20 22 31 73 74 22 20 61 6e 64 20 22 66 69  th "1st" and "fi
4c50: 72 73 74 22 20 61 73 20 73 79 6e 6f 6e 79 6d 73  rst" as synonyms
4c60: 20 66 6f 72 20 74 68 65 0d 0a 2a 2a 20 20 20 20   for the..**    
4c70: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 74 6f          first to
4c80: 6b 65 6e 20 69 6e 20 74 68 65 20 4d 41 54 43 48  ken in the MATCH
4c90: 20 71 75 65 72 79 20 61 6e 64 20 46 54 53 35 20   query and FTS5 
4ca0: 65 66 66 65 63 74 69 76 65 6c 79 20 72 75 6e 73  effectively runs
4cb0: 20 61 20 71 75 65 72 79 20 0d 0a 2a 2a 20 20 20   a query ..**   
4cc0: 20 20 20 20 20 20 20 20 20 73 69 6d 69 6c 61 72           similar
4cd0: 20 74 6f 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c   to:..**..**   <
4ce0: 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 20 20  codeblock>..**  
4cf0: 20 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 28 66     ... MATCH '(f
4d00: 69 72 73 74 20 4f 52 20 31 73 74 29 20 70 6c 61  irst OR 1st) pla
4d10: 63 65 27 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0d  ce'</codeblock>.
4d20: 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  .**..**         
4d30: 20 20 20 65 78 63 65 70 74 20 74 68 61 74 2c 20     except that, 
4d40: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
4d50: 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 66 75   of auxiliary fu
4d60: 6e 63 74 69 6f 6e 73 2c 20 74 68 65 20 71 75 65  nctions, the que
4d70: 72 79 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ry..**          
4d80: 20 20 73 74 69 6c 6c 20 61 70 70 65 61 72 73 20    still appears 
4d90: 74 6f 20 63 6f 6e 74 61 69 6e 20 6a 75 73 74 20  to contain just 
4da0: 74 77 6f 20 70 68 72 61 73 65 73 20 2d 20 22 28  two phrases - "(
4db0: 66 69 72 73 74 20 4f 52 20 31 73 74 29 22 20 0d  first OR 1st)" .
4dc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 62  .**            b
4dd0: 65 69 6e 67 20 74 72 65 61 74 65 64 20 61 73 20  eing treated as 
4de0: 61 20 73 69 6e 67 6c 65 20 70 68 72 61 73 65 2e  a single phrase.
4df0: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 3c  ..**..**       <
4e00: 6c 69 3e 20 42 79 20 61 64 64 69 6e 67 20 6d 75  li> By adding mu
4e10: 6c 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d 73 20  ltiple synonyms 
4e20: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
4e30: 6d 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64  m to the FTS ind
4e40: 65 78 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  ex...**         
4e50: 20 20 20 55 73 69 6e 67 20 74 68 69 73 20 6d 65     Using this me
4e60: 74 68 6f 64 2c 20 77 68 65 6e 20 74 6f 6b 65 6e  thod, when token
4e70: 69 7a 69 6e 67 20 64 6f 63 75 6d 65 6e 74 20 74  izing document t
4e80: 65 78 74 2c 20 74 68 65 20 74 6f 6b 65 6e 69 7a  ext, the tokeniz
4e90: 65 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  er..**          
4ea0: 20 20 70 72 6f 76 69 64 65 73 20 6d 75 6c 74 69    provides multi
4eb0: 70 6c 65 20 73 79 6e 6f 6e 79 6d 73 20 66 6f 72  ple synonyms for
4ec0: 20 65 61 63 68 20 74 6f 6b 65 6e 2e 20 53 6f 20   each token. So 
4ed0: 74 68 61 74 20 77 68 65 6e 20 61 20 0d 0a 2a 2a  that when a ..**
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 75              docu
4ef0: 6d 65 6e 74 20 73 75 63 68 20 61 73 20 22 49 20  ment such as "I 
4f00: 77 6f 6e 20 66 69 72 73 74 20 70 6c 61 63 65 22  won first place"
4f10: 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64 2c 20 65   is tokenized, e
4f20: 6e 74 72 69 65 73 20 61 72 65 0d 0a 2a 2a 20 20  ntries are..**  
4f30: 20 20 20 20 20 20 20 20 20 20 61 64 64 65 64 20            added 
4f40: 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  to the FTS index
4f50: 20 66 6f 72 20 22 69 22 2c 20 22 77 6f 6e 22 2c   for "i", "won",
4f60: 20 22 66 69 72 73 74 22 2c 20 22 31 73 74 22 20   "first", "1st" 
4f70: 61 6e 64 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  and..**         
4f80: 20 20 20 22 70 6c 61 63 65 22 2e 0d 0a 2a 2a 0d     "place"...**.
4f90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 54  .**            T
4fa0: 68 69 73 20 77 61 79 2c 20 65 76 65 6e 20 69 66  his way, even if
4fb0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 64   the tokenizer d
4fc0: 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
4fd0: 73 79 6e 6f 6e 79 6d 73 0d 0a 2a 2a 20 20 20 20  synonyms..**    
4fe0: 20 20 20 20 20 20 20 20 77 68 65 6e 20 74 6f 6b          when tok
4ff0: 65 6e 69 7a 69 6e 67 20 71 75 65 72 79 20 74 65  enizing query te
5000: 78 74 20 28 69 74 20 73 68 6f 75 6c 64 20 6e 6f  xt (it should no
5010: 74 20 2d 20 74 6f 20 64 6f 20 77 6f 75 6c 64 20  t - to do would 
5020: 62 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  be..**          
5030: 20 20 69 6e 65 66 66 69 63 69 65 6e 74 29 2c 20    inefficient), 
5040: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  it doesn't matte
5050: 72 20 69 66 20 74 68 65 20 75 73 65 72 20 71 75  r if the user qu
5060: 65 72 69 65 73 20 66 6f 72 20 0d 0a 2a 2a 20 20  eries for ..**  
5070: 20 20 20 20 20 20 20 20 20 20 27 66 69 72 73 74            'first
5080: 20 2b 20 70 6c 61 63 65 27 20 6f 72 20 27 31 73   + place' or '1s
5090: 74 20 2b 20 70 6c 61 63 65 27 2c 20 61 73 20 74  t + place', as t
50a0: 68 65 72 65 20 61 72 65 20 65 6e 74 72 69 65 73  here are entries
50b0: 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 20 20 20 20   in the..**     
50c0: 20 20 20 20 20 20 20 46 54 53 20 69 6e 64 65 78         FTS index
50d0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
50e0: 6f 20 62 6f 74 68 20 66 6f 72 6d 73 20 6f 66 20  o both forms of 
50f0: 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e 2e  the first token.
5100: 0d 0a 2a 2a 20 20 20 3c 2f 6f 6c 3e 0d 0a 2a 2a  ..**   </ol>..**
5110: 0d 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 69  ..**   Whether i
5120: 74 20 69 73 20 70 61 72 73 69 6e 67 20 64 6f 63  t is parsing doc
5130: 75 6d 65 6e 74 20 6f 72 20 71 75 65 72 79 20 74  ument or query t
5140: 65 78 74 2c 20 61 6e 79 20 63 61 6c 6c 20 74 6f  ext, any call to
5150: 20 78 54 6f 6b 65 6e 20 74 68 61 74 0d 0a 2a 2a   xToken that..**
5160: 20 20 20 73 70 65 63 69 66 69 65 73 20 61 20 3c     specifies a <
5170: 69 3e 74 66 6c 61 67 73 3c 2f 69 3e 20 61 72 67  i>tflags</i> arg
5180: 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 46  ument with the F
5190: 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41  TS5_TOKEN_COLOCA
51a0: 54 45 44 20 62 69 74 0d 0a 2a 2a 20 20 20 69 73  TED bit..**   is
51b0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 73   considered to s
51c0: 75 70 70 6c 79 20 61 20 73 79 6e 6f 6e 79 6d 20  upply a synonym 
51d0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
51e0: 20 74 6f 6b 65 6e 2e 20 46 6f 72 20 65 78 61 6d   token. For exam
51f0: 70 6c 65 2c 0d 0a 2a 2a 20 20 20 77 68 65 6e 20  ple,..**   when 
5200: 70 61 72 73 69 6e 67 20 74 68 65 20 64 6f 63 75  parsing the docu
5210: 6d 65 6e 74 20 22 49 20 77 6f 6e 20 66 69 72 73  ment "I won firs
5220: 74 20 70 6c 61 63 65 22 2c 20 61 20 74 6f 6b 65  t place", a toke
5230: 6e 69 7a 65 72 20 74 68 61 74 20 73 75 70 70 6f  nizer that suppo
5240: 72 74 73 0d 0a 2a 2a 20 20 20 73 79 6e 6f 6e 79  rts..**   synony
5250: 6d 73 20 77 6f 75 6c 64 20 63 61 6c 6c 20 78 54  ms would call xT
5260: 6f 6b 65 6e 28 29 20 35 20 74 69 6d 65 73 2c 20  oken() 5 times, 
5270: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d  as follows:..**.
5280: 0a 2a 2a 20 20 20 3c 63 6f 64 65 62 6c 6f 63 6b  .**   <codeblock
5290: 3e 0d 0a 2a 2a 20 20 20 20 20 20 20 78 54 6f 6b  >..**       xTok
52a0: 65 6e 28 70 43 74 78 2c 20 30 2c 20 22 69 22 2c  en(pCtx, 0, "i",
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 31 2c 20 20 30 2c 20 20 31 29        1,  0,  1)
52d0: 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 78 54 6f 6b  ;..**       xTok
52e0: 65 6e 28 70 43 74 78 2c 20 30 2c 20 22 77 6f 6e  en(pCtx, 0, "won
52f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5300: 20 20 20 20 20 20 33 2c 20 20 32 2c 20 20 35 29        3,  2,  5)
5310: 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 78 54 6f 6b  ;..**       xTok
5320: 65 6e 28 70 43 74 78 2c 20 30 2c 20 22 66 69 72  en(pCtx, 0, "fir
5330: 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
5340: 20 20 20 20 20 20 35 2c 20 20 36 2c 20 31 31 29        5,  6, 11)
5350: 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 78 54 6f 6b  ;..**       xTok
5360: 65 6e 28 70 43 74 78 2c 20 46 54 53 35 5f 54 4f  en(pCtx, FTS5_TO
5370: 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 2c 20 22  KEN_COLOCATED, "
5380: 31 73 74 22 2c 20 33 2c 20 20 36 2c 20 31 31 29  1st", 3,  6, 11)
5390: 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 78 54 6f 6b  ;..**       xTok
53a0: 65 6e 28 70 43 74 78 2c 20 30 2c 20 22 70 6c 61  en(pCtx, 0, "pla
53b0: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
53c0: 20 20 20 20 20 20 35 2c 20 31 32 2c 20 31 37 29        5, 12, 17)
53d0: 3b 0d 0a 2a 2a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ;..**</codeblock
53e0: 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 74 20 69  >..**..**   It i
53f0: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73 70  s an error to sp
5400: 65 63 69 66 79 20 74 68 65 20 46 54 53 35 5f 54  ecify the FTS5_T
5410: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 20 66  OKEN_COLOCATED f
5420: 6c 61 67 20 74 68 65 20 66 69 72 73 74 20 74 69  lag the first ti
5430: 6d 65 0d 0a 2a 2a 20 20 20 78 54 6f 6b 65 6e 28  me..**   xToken(
5440: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 4d 75 6c  ) is called. Mul
5450: 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d 73 20 6d  tiple synonyms m
5460: 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20  ay be specified 
5470: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b  for a single tok
5480: 65 6e 0d 0a 2a 2a 20 20 20 62 79 20 6d 61 6b 69  en..**   by maki
5490: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  ng multiple call
54a0: 73 20 74 6f 20 78 54 6f 6b 65 6e 28 46 54 53 35  s to xToken(FTS5
54b0: 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44  _TOKEN_COLOCATED
54c0: 29 20 69 6e 20 73 65 71 75 65 6e 63 65 2e 20 0d  ) in sequence. .
54d0: 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e  .**   There is n
54e0: 6f 20 6c 69 6d 69 74 20 74 6f 20 74 68 65 20 6e  o limit to the n
54f0: 75 6d 62 65 72 20 6f 66 20 73 79 6e 6f 6e 79 6d  umber of synonym
5500: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 72  s that may be pr
5510: 6f 76 69 64 65 64 20 66 6f 72 20 61 0d 0a 2a 2a  ovided for a..**
5520: 20 20 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 2e     single token.
5530: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 6e 20 6d 61  ..**..**   In ma
5540: 6e 79 20 63 61 73 65 73 2c 20 6d 65 74 68 6f 64  ny cases, method
5550: 20 28 31 29 20 61 62 6f 76 65 20 69 73 20 74 68   (1) above is th
5560: 65 20 62 65 73 74 20 61 70 70 72 6f 61 63 68 2e  e best approach.
5570: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 61 64 64   It does not add
5580: 20 0d 0a 2a 2a 20 20 20 65 78 74 72 61 20 64 61   ..**   extra da
5590: 74 61 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e  ta to the FTS in
55a0: 64 65 78 20 6f 72 20 72 65 71 75 69 72 65 20 46  dex or require F
55b0: 54 53 35 20 74 6f 20 71 75 65 72 79 20 66 6f 72  TS5 to query for
55c0: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 2c   multiple terms,
55d0: 0d 0a 2a 2a 20 20 20 73 6f 20 69 74 20 69 73 20  ..**   so it is 
55e0: 65 66 66 69 63 69 65 6e 74 20 69 6e 20 74 65 72  efficient in ter
55f0: 6d 73 20 6f 66 20 64 69 73 6b 20 73 70 61 63 65  ms of disk space
5600: 20 61 6e 64 20 71 75 65 72 79 20 73 70 65 65 64   and query speed
5610: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 0d 0a 2a  . However, it..*
5620: 2a 20 20 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  *   does not sup
5630: 70 6f 72 74 20 70 72 65 66 69 78 20 71 75 65 72  port prefix quer
5640: 69 65 73 20 76 65 72 79 20 77 65 6c 6c 2e 20 49  ies very well. I
5650: 66 2c 20 61 73 20 73 75 67 67 65 73 74 65 64 20  f, as suggested 
5660: 61 62 6f 76 65 2c 20 74 68 65 0d 0a 2a 2a 20 20  above, the..**  
5670: 20 74 6f 6b 65 6e 20 22 66 69 72 73 74 22 20 69   token "first" i
5680: 73 20 73 75 62 73 74 69 74 75 74 65 64 20 66 6f  s substituted fo
5690: 72 20 22 31 73 74 22 20 62 79 20 74 68 65 20 74  r "1st" by the t
56a0: 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 6e 20 74  okenizer, then t
56b0: 68 65 20 71 75 65 72 79 3a 0d 0a 2a 2a 0d 0a 2a  he query:..**..*
56c0: 2a 20 20 20 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0d  *   <codeblock>.
56d0: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 4d 41 54 43  .**     ... MATC
56e0: 48 20 27 31 73 2a 27 3c 2f 63 6f 64 65 62 6c 6f  H '1s*'</codeblo
56f0: 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 77 69  ck>..**..**   wi
5700: 6c 6c 20 6e 6f 74 20 6d 61 74 63 68 20 64 6f 63  ll not match doc
5710: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
5720: 61 69 6e 20 74 68 65 20 74 6f 6b 65 6e 20 22 31  ain the token "1
5730: 73 74 22 20 28 61 73 20 74 68 65 20 74 6f 6b 65  st" (as the toke
5740: 6e 69 7a 65 72 0d 0a 2a 2a 20 20 20 77 69 6c 6c  nizer..**   will
5750: 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 6d 61   probably not ma
5760: 70 20 22 31 73 22 20 74 6f 20 61 6e 79 20 70 72  p "1s" to any pr
5770: 65 66 69 78 20 6f 66 20 22 66 69 72 73 74 22 29  efix of "first")
5780: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 46 6f 72 20  ...**..**   For 
5790: 66 75 6c 6c 20 70 72 65 66 69 78 20 73 75 70 70  full prefix supp
57a0: 6f 72 74 2c 20 6d 65 74 68 6f 64 20 28 33 29 20  ort, method (3) 
57b0: 6d 61 79 20 62 65 20 70 72 65 66 65 72 72 65 64  may be preferred
57c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
57d0: 0d 0a 2a 2a 20 20 20 62 65 63 61 75 73 65 20 74  ..**   because t
57e0: 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
57f0: 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 62 6f  s entries for bo
5800: 74 68 20 22 66 69 72 73 74 22 20 61 6e 64 20 22  th "first" and "
5810: 31 73 74 22 2c 20 70 72 65 66 69 78 0d 0a 2a 2a  1st", prefix..**
5820: 20 20 20 71 75 65 72 69 65 73 20 73 75 63 68 20     queries such 
5830: 61 73 20 27 66 69 2a 27 20 6f 72 20 27 31 73 2a  as 'fi*' or '1s*
5840: 27 20 77 69 6c 6c 20 6d 61 74 63 68 20 63 6f 72  ' will match cor
5850: 72 65 63 74 6c 79 2e 20 48 6f 77 65 76 65 72 2c  rectly. However,
5860: 20 62 65 63 61 75 73 65 0d 0a 2a 2a 20 20 20 65   because..**   e
5870: 78 74 72 61 20 65 6e 74 72 69 65 73 20 61 72 65  xtra entries are
5880: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 46 54   added to the FT
5890: 53 20 69 6e 64 65 78 2c 20 74 68 69 73 20 6d 65  S index, this me
58a0: 74 68 6f 64 20 75 73 65 73 20 6d 6f 72 65 20 73  thod uses more s
58b0: 70 61 63 65 0d 0a 2a 2a 20 20 20 77 69 74 68 69  pace..**   withi
58c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
58d0: 0a 2a 2a 0d 0a 2a 2a 20 20 20 4d 65 74 68 6f 64  .**..**   Method
58e0: 20 28 32 29 20 6f 66 66 65 72 73 20 61 20 6d 69   (2) offers a mi
58f0: 64 70 6f 69 6e 74 20 62 65 74 77 65 65 6e 20 28  dpoint between (
5900: 31 29 20 61 6e 64 20 28 33 29 2e 20 55 73 69 6e  1) and (3). Usin
5910: 67 20 74 68 69 73 20 6d 65 74 68 6f 64 2c 0d 0a  g this method,..
5920: 2a 2a 20 20 20 61 20 71 75 65 72 79 20 73 75 63  **   a query suc
5930: 68 20 61 73 20 27 31 73 2a 27 20 77 69 6c 6c 20  h as '1s*' will 
5940: 6d 61 74 63 68 20 64 6f 63 75 6d 65 6e 74 73 20  match documents 
5950: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
5960: 20 6c 69 74 65 72 61 6c 20 0d 0a 2a 2a 20 20 20   literal ..**   
5970: 74 6f 6b 65 6e 20 22 31 73 74 22 2c 20 62 75 74  token "1st", but
5980: 20 6e 6f 74 20 22 66 69 72 73 74 22 20 28 61 73   not "first" (as
5990: 73 75 6d 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e  suming the token
59a0: 69 7a 65 72 20 69 73 20 6e 6f 74 20 61 62 6c 65  izer is not able
59b0: 20 74 6f 0d 0a 2a 2a 20 20 20 70 72 6f 76 69 64   to..**   provid
59c0: 65 20 73 79 6e 6f 6e 79 6d 73 20 66 6f 72 20 70  e synonyms for p
59d0: 72 65 66 69 78 65 73 29 2e 20 48 6f 77 65 76 65  refixes). Howeve
59e0: 72 2c 20 61 20 6e 6f 6e 2d 70 72 65 66 69 78 20  r, a non-prefix 
59f0: 71 75 65 72 79 20 6c 69 6b 65 20 27 31 73 74 27  query like '1st'
5a00: 0d 0a 2a 2a 20 20 20 77 69 6c 6c 20 6d 61 74 63  ..**   will matc
5a10: 68 20 61 67 61 69 6e 73 74 20 22 31 73 74 22 20  h against "1st" 
5a20: 61 6e 64 20 22 66 69 72 73 74 22 2e 20 54 68 69  and "first". Thi
5a30: 73 20 6d 65 74 68 6f 64 20 64 6f 65 73 20 6e 6f  s method does no
5a40: 74 20 72 65 71 75 69 72 65 0d 0a 2a 2a 20 20 20  t require..**   
5a50: 65 78 74 72 61 20 64 69 73 6b 20 73 70 61 63 65  extra disk space
5a60: 2c 20 61 73 20 6e 6f 20 65 78 74 72 61 20 65 6e  , as no extra en
5a70: 74 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20  tries are added 
5a80: 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  to the FTS index
5a90: 2e 20 0d 0a 2a 2a 20 20 20 4f 6e 20 74 68 65 20  . ..**   On the 
5aa0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74 20 6d  other hand, it m
5ab0: 61 79 20 72 65 71 75 69 72 65 20 6d 6f 72 65 20  ay require more 
5ac0: 43 50 55 20 63 79 63 6c 65 73 20 74 6f 20 72 75  CPU cycles to ru
5ad0: 6e 20 4d 41 54 43 48 20 71 75 65 72 69 65 73 2c  n MATCH queries,
5ae0: 0d 0a 2a 2a 20 20 20 61 73 20 73 65 70 61 72 61  ..**   as separa
5af0: 74 65 20 71 75 65 72 69 65 73 20 6f 66 20 74 68  te queries of th
5b00: 65 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20  e FTS index are 
5b10: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
5b20: 68 20 73 79 6e 6f 6e 79 6d 2e 0d 0a 2a 2a 0d 0a  h synonym...**..
5b30: 2a 2a 20 20 20 57 68 65 6e 20 75 73 69 6e 67 20  **   When using 
5b40: 6d 65 74 68 6f 64 73 20 28 32 29 20 6f 72 20 28  methods (2) or (
5b50: 33 29 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  3), it is import
5b60: 61 6e 74 20 74 68 61 74 20 74 68 65 20 74 6f 6b  ant that the tok
5b70: 65 6e 69 7a 65 72 20 6f 6e 6c 79 0d 0a 2a 2a 20  enizer only..** 
5b80: 20 20 70 72 6f 76 69 64 65 20 73 79 6e 6f 6e 79    provide synony
5b90: 6d 73 20 77 68 65 6e 20 74 6f 6b 65 6e 69 7a 69  ms when tokenizi
5ba0: 6e 67 20 64 6f 63 75 6d 65 6e 74 20 74 65 78 74  ng document text
5bb0: 20 28 6d 65 74 68 6f 64 20 28 32 29 29 20 6f 72   (method (2)) or
5bc0: 20 71 75 65 72 79 0d 0a 2a 2a 20 20 20 74 65 78   query..**   tex
5bd0: 74 20 28 6d 65 74 68 6f 64 20 28 33 29 29 2c 20  t (method (3)), 
5be0: 6e 6f 74 20 62 6f 74 68 2e 20 44 6f 69 6e 67 20  not both. Doing 
5bf0: 73 6f 20 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73  so will not caus
5c00: 65 20 61 6e 79 20 65 72 72 6f 72 73 2c 20 62 75  e any errors, bu
5c10: 74 20 69 73 0d 0a 2a 2a 20 20 20 69 6e 65 66 66  t is..**   ineff
5c20: 69 63 69 65 6e 74 2e 0d 0a 2a 2f 0d 0a 74 79 70  icient...*/..typ
5c30: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
5c40: 54 6f 6b 65 6e 69 7a 65 72 20 46 74 73 35 54 6f  Tokenizer Fts5To
5c50: 6b 65 6e 69 7a 65 72 3b 0d 0a 74 79 70 65 64 65  kenizer;..typede
5c60: 66 20 73 74 72 75 63 74 20 66 74 73 35 5f 74 6f  f struct fts5_to
5c70: 6b 65 6e 69 7a 65 72 20 66 74 73 35 5f 74 6f 6b  kenizer fts5_tok
5c80: 65 6e 69 7a 65 72 3b 0d 0a 73 74 72 75 63 74 20  enizer;..struct 
5c90: 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 7b  fts5_tokenizer {
5ca0: 0d 0a 20 20 69 6e 74 20 28 2a 78 43 72 65 61 74  ..  int (*xCreat
5cb0: 65 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  e)(void*, const 
5cc0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 69 6e  char **azArg, in
5cd0: 74 20 6e 41 72 67 2c 20 46 74 73 35 54 6f 6b 65  t nArg, Fts5Toke
5ce0: 6e 69 7a 65 72 20 2a 2a 70 70 4f 75 74 29 3b 0d  nizer **ppOut);.
5cf0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 65 74  .  void (*xDelet
5d00: 65 29 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  e)(Fts5Tokenizer
5d10: 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f  *);..  int (*xTo
5d20: 6b 65 6e 69 7a 65 29 28 46 74 73 35 54 6f 6b 65  kenize)(Fts5Toke
5d30: 6e 69 7a 65 72 2a 2c 20 0d 0a 20 20 20 20 20 20  nizer*, ..      
5d40: 76 6f 69 64 20 2a 70 43 74 78 2c 0d 0a 20 20 20  void *pCtx,..   
5d50: 20 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20     int flags,   
5d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
5d70: 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a   of FTS5_TOKENIZ
5d80: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20  E_* flags */..  
5d90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5da0: 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74  pText, int nText
5db0: 2c 20 0d 0a 20 20 20 20 20 20 69 6e 74 20 28 2a  , ..      int (*
5dc0: 78 54 6f 6b 65 6e 29 28 0d 0a 20 20 20 20 20 20  xToken)(..      
5dd0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
5de0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
5df0: 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   2nd argument to
5e00: 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20 2a 2f 0d   xTokenize() */.
5e10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 66 6c  .        int tfl
5e20: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
5e30: 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b  Mask of FTS5_TOK
5e40: 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20  EN_* flags */.. 
5e50: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
5e60: 72 20 2a 70 54 6f 6b 65 6e 2c 20 2f 2a 20 50 6f  r *pToken, /* Po
5e70: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
5e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
5e90: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 6e 74   */..        int
5ea0: 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20   nToken,        
5eb0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65   /* Size of toke
5ec0: 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20  n in bytes */.. 
5ed0: 20 20 20 20 20 20 20 69 6e 74 20 69 53 74 61 72         int iStar
5ee0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  t,         /* By
5ef0: 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b  te offset of tok
5f00: 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20  en within input 
5f10: 74 65 78 74 20 2a 2f 0d 0a 20 20 20 20 20 20 20  text */..       
5f20: 20 69 6e 74 20 69 45 6e 64 20 20 20 20 20 20 20   int iEnd       
5f30: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
5f40: 73 65 74 20 6f 66 20 65 6e 64 20 6f 66 20 74 6f  set of end of to
5f50: 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74  ken within input
5f60: 20 74 65 78 74 20 2a 2f 0d 0a 20 20 20 20 20 20   text */..      
5f70: 29 0d 0a 20 20 29 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f  )..  );..};..../
5f80: 2a 20 46 6c 61 67 73 20 74 68 61 74 20 6d 61 79  * Flags that may
5f90: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
5fa0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
5fb0: 20 74 6f 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20   to xTokenize() 
5fc0: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
5fd0: 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20  _TOKENIZE_QUERY 
5fe0: 20 20 20 20 30 78 30 30 30 31 0d 0a 23 64 65 66      0x0001..#def
5ff0: 69 6e 65 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a  ine FTS5_TOKENIZ
6000: 45 5f 50 52 45 46 49 58 20 20 20 20 30 78 30 30  E_PREFIX    0x00
6010: 30 32 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  02..#define FTS5
6020: 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d 45  _TOKENIZE_DOCUME
6030: 4e 54 20 20 30 78 30 30 30 34 0d 0a 23 64 65 66  NT  0x0004..#def
6040: 69 6e 65 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a  ine FTS5_TOKENIZ
6050: 45 5f 41 55 58 20 20 20 20 20 20 20 30 78 30 30  E_AUX       0x00
6060: 30 38 0d 0a 0d 0a 2f 2a 20 46 6c 61 67 73 20 74  08..../* Flags t
6070: 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
6080: 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 69 7a  d by the tokeniz
6090: 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
60a0: 6e 20 62 61 63 6b 20 74 6f 20 46 54 53 35 0d 0a  n back to FTS5..
60b0: 2a 2a 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ** as the third 
60c0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
60d0: 73 75 70 70 6c 69 65 64 20 78 54 6f 6b 65 6e 20  supplied xToken 
60e0: 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0d 0a 23 64  callback. */..#d
60f0: 65 66 69 6e 65 20 46 54 53 35 5f 54 4f 4b 45 4e  efine FTS5_TOKEN
6100: 5f 43 4f 4c 4f 43 41 54 45 44 20 20 20 20 30 78  _COLOCATED    0x
6110: 30 30 30 31 20 20 20 20 20 20 2f 2a 20 53 61 6d  0001      /* Sam
6120: 65 20 70 6f 73 69 74 69 6f 6e 20 61 73 20 70 72  e position as pr
6130: 65 76 2e 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 0d 0a  ev. token */....
6140: 2f 2a 0d 0a 2a 2a 20 45 4e 44 20 4f 46 20 43 55  /*..** END OF CU
6150: 53 54 4f 4d 20 54 4f 4b 45 4e 49 5a 45 52 53 0d  STOM TOKENIZERS.
6160: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f  **********/..../
61b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 46 54  *********..** FT
6200: 53 35 20 45 58 54 45 4e 53 49 4f 4e 20 52 45 47  S5 EXTENSION REG
6210: 49 53 54 52 41 54 49 4f 4e 20 41 50 49 0d 0a 2a  ISTRATION API..*
6220: 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
6230: 74 20 66 74 73 35 5f 61 70 69 20 66 74 73 35 5f  t fts5_api fts5_
6240: 61 70 69 3b 0d 0a 73 74 72 75 63 74 20 66 74 73  api;..struct fts
6250: 35 5f 61 70 69 20 7b 0d 0a 20 20 69 6e 74 20 69  5_api {..  int i
6260: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
6270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
6280: 72 72 65 6e 74 6c 79 20 61 6c 77 61 79 73 20 73  rrently always s
6290: 65 74 20 74 6f 20 32 20 2a 2f 0d 0a 0d 0a 20 20  et to 2 */....  
62a0: 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
62b0: 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f 0d 0a 20 20  tokenizer */..  
62c0: 69 6e 74 20 28 2a 78 43 72 65 61 74 65 54 6f 6b  int (*xCreateTok
62d0: 65 6e 69 7a 65 72 29 28 0d 0a 20 20 20 20 66 74  enizer)(..    ft
62e0: 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 0d 0a 20  s5_api *pApi,.. 
62f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6300: 4e 61 6d 65 2c 0d 0a 20 20 20 20 76 6f 69 64 20  Name,..    void 
6310: 2a 70 43 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20  *pContext,..    
6320: 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  fts5_tokenizer *
6330: 70 54 6f 6b 65 6e 69 7a 65 72 2c 0d 0a 20 20 20  pTokenizer,..   
6340: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
6350: 29 28 76 6f 69 64 2a 29 0d 0a 20 20 29 3b 0d 0a  )(void*)..  );..
6360: 0d 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
6370: 78 69 73 74 69 6e 67 20 74 6f 6b 65 6e 69 7a 65  xisting tokenize
6380: 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 46  r */..  int (*xF
6390: 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 29 28 0d 0a  indTokenizer)(..
63a0: 20 20 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41      fts5_api *pA
63b0: 70 69 2c 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63  pi,..    const c
63c0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a 20 20 20  har *zName,..   
63d0: 20 76 6f 69 64 20 2a 2a 70 70 43 6f 6e 74 65 78   void **ppContex
63e0: 74 2c 0d 0a 20 20 20 20 66 74 73 35 5f 74 6f 6b  t,..    fts5_tok
63f0: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
6400: 65 72 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 2f 2a  er..  );....  /*
6410: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 75   Create a new au
6420: 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
6430: 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 43 72   */..  int (*xCr
6440: 65 61 74 65 46 75 6e 63 74 69 6f 6e 29 28 0d 0a  eateFunction)(..
6450: 20 20 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41      fts5_api *pA
6460: 70 69 2c 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63  pi,..    const c
6470: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a 20 20 20  har *zName,..   
6480: 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
6490: 0d 0a 20 20 20 20 66 74 73 35 5f 65 78 74 65 6e  ..    fts5_exten
64a0: 73 69 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46  sion_function xF
64b0: 75 6e 63 74 69 6f 6e 2c 0d 0a 20 20 20 20 76 6f  unction,..    vo
64c0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
64d0: 6f 69 64 2a 29 0d 0a 20 20 29 3b 0d 0a 7d 3b 0d  oid*)..  );..};.
64e0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 4e 44 20 4f 46  .../*..** END OF
64f0: 20 52 45 47 49 53 54 52 41 54 49 4f 4e 20 41 50   REGISTRATION AP
6500: 49 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  I..*************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
6550: 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70  .#ifdef __cplusp
6560: 6c 75 73 0d 0a 7d 20 20 2f 2a 20 65 6e 64 20 6f  lus..}  /* end o
6570: 66 20 74 68 65 20 27 65 78 74 65 72 6e 20 22 43  f the 'extern "C
6580: 22 27 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 23 65 6e  "' block */..#en
6590: 64 69 66 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a  dif....#endif /*
65a0: 20 5f 46 54 53 35 5f 48 20 2a 2f 0d 0a 0d 0a 23   _FTS5_H */....#
65b0: 6c 69 6e 65 20 31 20 22 66 74 73 35 49 6e 74 2e  line 1 "fts5Int.
65c0: 68 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 34 20  h"../*..** 2014 
65d0: 4d 61 79 20 33 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54  May 31..**..** T
65e0: 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61  he author discla
65f0: 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f  ims copyright to
6600: 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64   this source cod
6610: 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d  e.  In place of.
6620: 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  .** a legal noti
6630: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
6640: 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  essing:..**..** 
6650: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
6660: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
6670: 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
6680: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
6690: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
66a0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
66b0: 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  ...**    May you
66c0: 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e   share freely, n
66d0: 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65  ever taking more
66e0: 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d   than you give..
66f0: 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**..***********
6700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6740: 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 23 69 66  ***..**..*/..#if
6750: 6e 64 65 66 20 5f 46 54 53 35 49 4e 54 5f 48 0d  ndef _FTS5INT_H.
6760: 0a 23 64 65 66 69 6e 65 20 5f 46 54 53 35 49 4e  .#define _FTS5IN
6770: 54 5f 48 0d 0a 0d 0a 2f 2a 20 23 69 6e 63 6c 75  T_H..../* #inclu
6780: 64 65 20 22 66 74 73 35 2e 68 22 20 2a 2f 0d 0a  de "fts5.h" */..
6790: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
67a0: 33 65 78 74 2e 68 22 0d 0a 53 51 4c 49 54 45 5f  3ext.h"..SQLITE_
67b0: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0d  EXTENSION_INIT1.
67c0: 0a 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  ...#include <str
67d0: 69 6e 67 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65  ing.h>..#include
67e0: 20 3c 61 73 73 65 72 74 2e 68 3e 0d 0a 0d 0a 23   <assert.h>....#
67f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
6800: 41 4c 47 41 4d 41 54 49 4f 4e 0d 0a 0d 0a 74 79  ALGAMATION....ty
6810: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
6820: 68 61 72 20 20 75 38 3b 0d 0a 74 79 70 65 64 65  har  u8;..typede
6830: 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 20  f unsigned int  
6840: 20 75 33 32 3b 0d 0a 74 79 70 65 64 65 66 20 75   u32;..typedef u
6850: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 75 31  nsigned short u1
6860: 36 3b 0d 0a 74 79 70 65 64 65 66 20 73 68 6f 72  6;..typedef shor
6870: 74 20 69 31 36 3b 0d 0a 74 79 70 65 64 65 66 20  t i16;..typedef 
6880: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36  sqlite3_int64 i6
6890: 34 3b 0d 0a 74 79 70 65 64 65 66 20 73 71 6c 69  4;..typedef sqli
68a0: 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 0d  te3_uint64 u64;.
68b0: 0a 0d 0a 23 69 66 6e 64 65 66 20 41 72 72 61 79  ...#ifndef Array
68c0: 53 69 7a 65 0d 0a 23 20 64 65 66 69 6e 65 20 41  Size..# define A
68d0: 72 72 61 79 53 69 7a 65 28 78 29 20 28 28 69 6e  rraySize(x) ((in
68e0: 74 29 28 73 69 7a 65 6f 66 28 78 29 20 2f 20 73  t)(sizeof(x) / s
68f0: 69 7a 65 6f 66 28 78 5b 30 5d 29 29 29 0d 0a 23  izeof(x[0])))..#
6900: 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65  endif....#define
6910: 20 74 65 73 74 63 61 73 65 28 78 29 0d 0a 23 64   testcase(x)..#d
6920: 65 66 69 6e 65 20 41 4c 57 41 59 53 28 78 29 20  efine ALWAYS(x) 
6930: 31 0d 0a 23 64 65 66 69 6e 65 20 4e 45 56 45 52  1..#define NEVER
6940: 28 78 29 20 30 0d 0a 0d 0a 23 64 65 66 69 6e 65  (x) 0....#define
6950: 20 4d 49 4e 28 78 2c 79 29 20 28 28 28 78 29 20   MIN(x,y) (((x) 
6960: 3c 20 28 79 29 29 20 3f 20 28 78 29 20 3a 20 28  < (y)) ? (x) : (
6970: 79 29 29 0d 0a 23 64 65 66 69 6e 65 20 4d 41 58  y))..#define MAX
6980: 28 78 2c 79 29 20 28 28 28 78 29 20 3e 20 28 79  (x,y) (((x) > (y
6990: 29 29 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0d  )) ? (x) : (y)).
69a0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 73 74 61  .../*..** Consta
69b0: 6e 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67  nts for the larg
69c0: 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74  est and smallest
69d0: 20 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74   possible 64-bit
69e0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
69f0: 2e 0d 0a 2a 2f 0d 0a 23 20 64 65 66 69 6e 65 20  ...*/..# define 
6a00: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28  LARGEST_INT64  (
6a10: 30 78 66 66 66 66 66 66 66 66 7c 28 28 28 69 36  0xffffffff|(((i6
6a20: 34 29 30 78 37 66 66 66 66 66 66 66 29 3c 3c 33  4)0x7fffffff)<<3
6a30: 32 29 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 4d  2))..# define SM
6a40: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 28 28 28  ALLEST_INT64 (((
6a50: 69 36 34 29 2d 31 29 20 2d 20 4c 41 52 47 45 53  i64)-1) - LARGES
6a60: 54 5f 49 4e 54 36 34 29 0d 0a 0d 0a 23 65 6e 64  T_INT64)....#end
6a70: 69 66 0d 0a 0d 0a 2f 2a 20 54 72 75 6e 63 61 74  if..../* Truncat
6a80: 65 20 76 65 72 79 20 6c 6f 6e 67 20 74 6f 6b 65  e very long toke
6a90: 6e 73 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20  ns to this many 
6aa0: 62 79 74 65 73 2e 20 48 61 72 64 20 6c 69 6d 69  bytes. Hard limi
6ab0: 74 20 69 73 20 0d 0a 2a 2a 20 28 36 35 35 33 36  t is ..** (65536
6ac0: 2d 31 2d 31 2d 34 2d 39 29 3d 3d 36 35 35 32 31  -1-1-4-9)==65521
6ad0: 20 62 79 74 65 73 2e 20 54 68 65 20 6c 69 6d 69   bytes. The limi
6ae0: 74 69 6e 67 20 66 61 63 74 6f 72 20 69 73 20 74  ting factor is t
6af0: 68 65 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74  he 16-bit offset
6b00: 0d 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ..** field that 
6b10: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
6b20: 61 72 74 20 6f 66 20 65 61 63 68 20 6c 65 61 66  art of each leaf
6b30: 20 70 61 67 65 20 28 73 65 65 20 66 74 73 35 5f   page (see fts5_
6b40: 69 6e 64 65 78 2e 63 29 2e 20 2a 2f 0d 0a 23 64  index.c). */..#d
6b50: 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58 5f 54  efine FTS5_MAX_T
6b60: 4f 4b 45 4e 5f 53 49 5a 45 20 33 32 37 36 38 0d  OKEN_SIZE 32768.
6b70: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 78 69 6d 75  .../*..** Maximu
6b80: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65 66  m number of pref
6b90: 69 78 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 69  ix indexes on si
6ba0: 6e 67 6c 65 20 46 54 53 35 20 74 61 62 6c 65 2e  ngle FTS5 table.
6bb0: 20 54 68 69 73 20 6d 75 73 74 20 62 65 0d 0a 2a   This must be..*
6bc0: 2a 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2e 20  * less than 32. 
6bd0: 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  If it is set to 
6be0: 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 74  anything large t
6bf0: 68 61 6e 20 74 68 61 74 2c 20 61 6e 20 23 65 72  han that, an #er
6c00: 72 6f 72 0d 0a 2a 2a 20 64 69 72 65 63 74 69 76  ror..** directiv
6c10: 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e  e in fts5_index.
6c20: 63 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  c will cause the
6c30: 20 62 75 69 6c 64 20 74 6f 20 66 61 69 6c 2e 0d   build to fail..
6c40: 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53  .*/..#define FTS
6c50: 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44  5_MAX_PREFIX_IND
6c60: 45 58 45 53 20 33 31 0d 0a 0d 0a 23 64 65 66 69  EXES 31....#defi
6c70: 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
6c80: 4e 45 41 52 44 49 53 54 20 31 30 0d 0a 23 64 65  NEARDIST 10..#de
6c90: 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c  fine FTS5_DEFAUL
6ca0: 54 5f 52 41 4e 4b 20 20 20 20 20 22 62 6d 32 35  T_RANK     "bm25
6cb0: 22 0d 0a 0d 0a 2f 2a 20 4e 61 6d 65 20 6f 66 20  "..../* Name of 
6cc0: 72 61 6e 6b 20 61 6e 64 20 72 6f 77 69 64 20 63  rank and rowid c
6cd0: 6f 6c 75 6d 6e 73 20 2a 2f 0d 0a 23 64 65 66 69  olumns */..#defi
6ce0: 6e 65 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d  ne FTS5_RANK_NAM
6cf0: 45 20 22 72 61 6e 6b 22 0d 0a 23 64 65 66 69 6e  E "rank"..#defin
6d00: 65 20 46 54 53 35 5f 52 4f 57 49 44 5f 4e 41 4d  e FTS5_ROWID_NAM
6d10: 45 20 22 72 6f 77 69 64 22 0d 0a 0d 0a 23 69 66  E "rowid"....#if
6d20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6d30: 0d 0a 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f  ..# define FTS5_
6d40: 43 4f 52 52 55 50 54 20 73 71 6c 69 74 65 33 46  CORRUPT sqlite3F
6d50: 74 73 35 43 6f 72 72 75 70 74 28 29 0d 0a 73 74  ts5Corrupt()..st
6d60: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
6d70: 46 74 73 35 43 6f 72 72 75 70 74 28 76 6f 69 64  Fts5Corrupt(void
6d80: 29 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66  );..#else..# def
6d90: 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55 50 54  ine FTS5_CORRUPT
6da0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6db0: 56 54 41 42 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  VTAB..#endif....
6dc0: 2f 2a 0d 0a 2a 2a 20 54 68 65 20 61 73 73 65 72  /*..** The asser
6dd0: 74 5f 6e 63 28 29 20 6d 61 63 72 6f 20 69 73 20  t_nc() macro is 
6de0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61  similar to the a
6df0: 73 73 65 72 74 28 29 20 6d 61 63 72 6f 2c 20 65  ssert() macro, e
6e00: 78 63 65 70 74 20 74 68 61 74 20 69 74 0d 0a 2a  xcept that it..*
6e10: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 73  * is used for as
6e20: 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e  sert() condition
6e30: 73 20 74 68 61 74 20 61 72 65 20 74 72 75 65 20  s that are true 
6e40: 6f 6e 6c 79 20 69 66 20 69 74 20 63 61 6e 20 62  only if it can b
6e50: 65 20 0d 0a 2a 2a 20 67 75 72 61 6e 74 65 65 64  e ..** guranteed
6e60: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6e70: 73 65 20 69 73 20 6e 6f 74 20 63 6f 72 72 75 70  se is not corrup
6e80: 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53  t...*/..#ifdef S
6e90: 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 65 78 74  QLITE_DEBUG..ext
6ea0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
6eb0: 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  fts5_may_be_corr
6ec0: 75 70 74 3b 0d 0a 23 20 64 65 66 69 6e 65 20 61  upt;..# define a
6ed0: 73 73 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65  ssert_nc(x) asse
6ee0: 72 74 28 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  rt(sqlite3_fts5_
6ef0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 7c  may_be_corrupt |
6f00: 7c 20 28 78 29 29 0d 0a 23 65 6c 73 65 0d 0a 23  | (x))..#else..#
6f10: 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e   define assert_n
6f20: 63 28 78 29 20 61 73 73 65 72 74 28 78 29 0d 0a  c(x) assert(x)..
6f30: 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 4d 61 72  #endif..../* Mar
6f40: 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  k a function par
6f50: 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73 65 64  ameter as unused
6f60: 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20 6e 75  , to suppress nu
6f70: 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 0d  isance compiler.
6f80: 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a 2f  .** warnings. */
6f90: 0d 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  ..#ifndef UNUSED
6fa0: 5f 50 41 52 41 4d 0d 0a 23 20 64 65 66 69 6e 65  _PARAM..# define
6fb0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29   UNUSED_PARAM(X)
6fc0: 20 20 28 76 6f 69 64 29 28 58 29 0d 0a 23 65 6e    (void)(X)..#en
6fd0: 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 55  dif....#ifndef U
6fe0: 4e 55 53 45 44 5f 50 41 52 41 4d 32 0d 0a 23 20  NUSED_PARAM2..# 
6ff0: 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41  define UNUSED_PA
7000: 52 41 4d 32 28 58 2c 20 59 29 20 20 28 76 6f 69  RAM2(X, Y)  (voi
7010: 64 29 28 58 29 2c 20 28 76 6f 69 64 29 28 59 29  d)(X), (void)(Y)
7020: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 74 79 70 65  ..#endif....type
7030: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 47  def struct Fts5G
7040: 6c 6f 62 61 6c 20 46 74 73 35 47 6c 6f 62 61 6c  lobal Fts5Global
7050: 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
7060: 74 20 46 74 73 35 43 6f 6c 73 65 74 20 46 74 73  t Fts5Colset Fts
7070: 35 43 6f 6c 73 65 74 3b 0d 0a 0d 0a 2f 2a 20 49  5Colset;..../* I
7080: 66 20 61 20 4e 45 41 52 28 29 20 63 6c 75 6d 70  f a NEAR() clump
7090: 20 6f 72 20 70 68 72 61 73 65 20 6d 61 79 20 6f   or phrase may o
70a0: 6e 6c 79 20 6d 61 74 63 68 20 61 20 73 70 65 63  nly match a spec
70b0: 69 66 69 63 20 73 65 74 20 6f 66 20 63 6f 6c 75  ific set of colu
70c0: 6d 6e 73 2c 20 0d 0a 2a 2a 20 74 68 65 6e 20 61  mns, ..** then a
70d0: 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65 20  n object of the 
70e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
70f0: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
7100: 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
7110: 6d 6e 73 2e 0d 0a 2a 2a 20 45 61 63 68 20 65 6e  mns...** Each en
7120: 74 72 79 20 69 6e 20 74 68 65 20 61 69 43 6f 6c  try in the aiCol
7130: 5b 5d 20 61 72 72 61 79 20 69 73 20 61 20 63 6f  [] array is a co
7140: 6c 75 6d 6e 20 74 68 61 74 20 6d 61 79 20 62 65  lumn that may be
7150: 20 6d 61 74 63 68 65 64 2e 0d 0a 2a 2a 0d 0a 2a   matched...**..*
7160: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73  * This object is
7170: 20 75 73 65 64 20 62 79 20 66 74 73 35 5f 65 78   used by fts5_ex
7180: 70 72 2e 63 20 61 6e 64 20 66 74 73 35 5f 69 6e  pr.c and fts5_in
7190: 64 65 78 2e 63 2e 0d 0a 2a 2f 0d 0a 73 74 72 75  dex.c...*/..stru
71a0: 63 74 20 46 74 73 35 43 6f 6c 73 65 74 20 7b 0d  ct Fts5Colset {.
71b0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0d 0a 20 20  .  int nCol;..  
71c0: 69 6e 74 20 61 69 43 6f 6c 5b 31 5d 3b 0d 0a 7d  int aiCol[1];..}
71d0: 3b 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  ;......../******
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7220: 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61  ****..** Interfa
7230: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
7240: 73 35 5f 63 6f 6e 66 69 67 2e 63 2e 20 66 74 73  s5_config.c. fts
7250: 35 5f 63 6f 6e 66 69 67 2e 63 20 63 6f 6e 74 61  5_config.c conta
7260: 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ins contains cod
7270: 65 0d 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20 74  e..** to parse t
7280: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  he arguments pas
7290: 73 65 64 20 74 6f 20 74 68 65 20 43 52 45 41 54  sed to the CREAT
72a0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
72b0: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a  statement...*/..
72c0: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
72d0: 20 46 74 73 35 43 6f 6e 66 69 67 20 46 74 73 35   Fts5Config Fts5
72e0: 43 6f 6e 66 69 67 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  Config;..../*..*
72f0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7300: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7310: 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65 73  tructure encodes
7320: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
7330: 20 74 68 61 74 20 63 61 6e 0d 0a 2a 2a 20 62 65   that can..** be
7340: 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74 68   gleaned from th
7350: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
7360: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7370: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6e 64 20 61 6c  ...**..** And al
7380: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f  l information lo
7390: 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  aded from the %_
73a0: 63 6f 6e 66 69 67 20 74 61 62 6c 65 2e 0d 0a 2a  config table...*
73b0: 2a 0d 0a 2a 2a 20 6e 41 75 74 6f 6d 65 72 67 65  *..** nAutomerge
73c0: 3a 0d 0a 2a 2a 20 20 20 54 68 65 20 6d 69 6e 69  :..**   The mini
73d0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  mum number of se
73e0: 67 6d 65 6e 74 73 20 74 68 61 74 20 61 6e 20 61  gments that an a
73f0: 75 74 6f 2d 6d 65 72 67 65 20 6f 70 65 72 61 74  uto-merge operat
7400: 69 6f 6e 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20  ion should..**  
7410: 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 65 72 67   attempt to merg
7420: 65 20 74 6f 67 65 74 68 65 72 2e 20 41 20 76 61  e together. A va
7430: 6c 75 65 20 6f 66 20 31 20 73 65 74 73 20 74 68  lue of 1 sets th
7440: 65 20 6f 62 6a 65 63 74 20 74 6f 20 75 73 65 20  e object to use 
7450: 74 68 65 20 0d 0a 2a 2a 20 20 20 63 6f 6d 70 69  the ..**   compi
7460: 6c 65 20 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le time default.
7470: 20 5a 65 72 6f 20 64 69 73 61 62 6c 65 73 20 61   Zero disables a
7480: 75 74 6f 2d 6d 65 72 67 65 20 61 6c 74 6f 67 65  uto-merge altoge
7490: 74 68 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 7a 43  ther...**..** zC
74a0: 6f 6e 74 65 6e 74 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  ontent:..**..** 
74b0: 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3a 0d 0a  zContentRowid:..
74c0: 2a 2a 20 20 20 54 68 65 20 76 61 6c 75 65 20 6f  **   The value o
74d0: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 5f 72 6f  f the content_ro
74e0: 77 69 64 3d 20 6f 70 74 69 6f 6e 2c 20 69 66 20  wid= option, if 
74f0: 6f 6e 65 20 77 61 73 20 73 70 65 63 69 66 69 65  one was specifie
7500: 64 2e 20 4f 72 20 0d 0a 2a 2a 20 20 20 74 68 65  d. Or ..**   the
7510: 20 73 74 72 69 6e 67 20 22 72 6f 77 69 64 22 20   string "rowid" 
7520: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
7530: 74 65 78 74 20 69 73 20 6e 6f 74 20 71 75 6f 74  text is not quot
7540: 65 64 20 2d 20 69 66 20 69 74 20 69 73 0d 0a 2a  ed - if it is..*
7550: 2a 20 20 20 75 73 65 64 20 61 73 20 70 61 72 74  *   used as part
7560: 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
7570: 6d 65 6e 74 20 69 74 20 6e 65 65 64 73 20 74 6f  ment it needs to
7580: 20 62 65 20 71 75 6f 74 65 64 20 61 70 70 72 6f   be quoted appro
7590: 70 72 69 61 74 65 6c 79 2e 0d 0a 2a 2a 0d 0a 2a  priately...**..*
75a0: 2a 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69  * zContentExprli
75b0: 73 74 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 70 7a 45 72  st:..**..** pzEr
75c0: 72 6d 73 67 3a 0d 0a 2a 2a 20 20 20 54 68 69 73  rmsg:..**   This
75d0: 20 65 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72   exists in order
75e0: 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66 74   to allow the ft
75f0: 73 35 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c  s5_index.c modul
7600: 65 20 74 6f 20 72 65 74 75 72 6e 20 61 20 0d 0a  e to return a ..
7610: 2a 2a 20 20 20 64 65 63 65 6e 74 20 65 72 72 6f  **   decent erro
7620: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
7630: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 69 6c  encounters a fil
7640: 65 2d 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e-format version
7650: 20 69 74 20 64 6f 65 73 0d 0a 2a 2a 20 20 20 6e   it does..**   n
7660: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 2e 0d 0a  ot understand...
7670: 2a 2a 0d 0a 2a 2a 20 62 43 6f 6c 75 6d 6e 73 69  **..** bColumnsi
7680: 7a 65 3a 0d 0a 2a 2a 20 20 20 54 72 75 65 20 69  ze:..**   True i
7690: 66 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20  f the %_docsize 
76a0: 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
76b0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 62 50 72 65 66 69  ...**..** bPrefi
76c0: 78 49 6e 64 65 78 3a 0d 0a 2a 2a 20 20 20 54 68  xIndex:..**   Th
76d0: 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  is is only used 
76e0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 49  for debugging. I
76f0: 66 20 73 65 74 20 74 6f 20 66 61 6c 73 65 2c 20  f set to false, 
7700: 61 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78  any prefix index
7710: 65 73 0d 0a 2a 2a 20 20 20 61 72 65 20 69 67 6e  es..**   are ign
7720: 6f 72 65 64 2e 20 54 68 69 73 20 76 61 6c 75 65  ored. This value
7730: 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 75   is configured u
7740: 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  sing:..**..**   
7750: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7760: 74 62 6c 28 74 62 6c 2c 20 72 61 6e 6b 29 20 56  tbl(tbl, rank) V
7770: 41 4c 55 45 53 28 27 70 72 65 66 69 78 2d 69 6e  ALUES('prefix-in
7780: 64 65 78 27 2c 20 24 62 50 72 65 66 69 78 49 6e  dex', $bPrefixIn
7790: 64 65 78 29 3b 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 73  dex);..**..*/..s
77a0: 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67  truct Fts5Config
77b0: 20 7b 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   {..  sqlite3 *d
77c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
77d0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
77e0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63  e handle */..  c
77f0: 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7810: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
7820: 6e 67 20 46 54 53 20 69 6e 64 65 78 20 28 65 2e  ng FTS index (e.
7830: 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0d 0a 20  g. "main") */.. 
7840: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20   /* Name of FTS 
7870: 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 20  index */..  int 
7880: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
7890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
78a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
78b0: 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 61 7a   */..  char **az
78c0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
78d0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
78e0: 20 6e 61 6d 65 73 20 2a 2f 0d 0a 20 20 75 38 20   names */..  u8 
78f0: 2a 61 62 55 6e 69 6e 64 65 78 65 64 3b 20 20 20  *abUnindexed;   
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7910: 54 72 75 65 20 66 6f 72 20 75 6e 69 6e 64 65 78  True for unindex
7920: 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0d 0a 20  ed columns */.. 
7930: 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
7960: 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a 2f 0d  efix indexes */.
7970: 0a 20 20 69 6e 74 20 2a 61 50 72 65 66 69 78 3b  .  int *aPrefix;
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 2f 2a 20 53 69 7a 65 73 20 69 6e 20 62     /* Sizes in b
79a0: 79 74 65 73 20 6f 66 20 6e 50 72 65 66 69 78 20  ytes of nPrefix 
79b0: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a  prefix indexes *
79c0: 2f 0d 0a 20 20 69 6e 74 20 65 43 6f 6e 74 65 6e  /..  int eConten
79d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
79e0: 20 20 20 20 20 2f 2a 20 41 6e 20 46 54 53 35 5f       /* An FTS5_
79f0: 43 4f 4e 54 45 4e 54 20 76 61 6c 75 65 20 2a 2f  CONTENT value */
7a00: 0d 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  ..  char *zConte
7a10: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
7a20: 20 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 74      /* content t
7a30: 61 62 6c 65 20 2a 2f 20 0d 0a 20 20 63 68 61 72  able */ ..  char
7a40: 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3b   *zContentRowid;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
7a60: 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 22 20  content_rowid=" 
7a70: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 20  option value */ 
7a80: 0d 0a 20 20 69 6e 74 20 62 43 6f 6c 75 6d 6e 73  ..  int bColumns
7a90: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7aa0: 20 20 20 20 2f 2a 20 22 63 6f 6c 75 6d 6e 73 69      /* "columnsi
7ab0: 7a 65 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75  ze=" option valu
7ac0: 65 20 28 64 66 6c 74 3d 3d 31 29 20 2a 2f 0d 0a  e (dflt==1) */..
7ad0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 3b 20 20    int eDetail;  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 2f 2a 20 46 54 53 35 5f 44 45 54 41 49 4c    /* FTS5_DETAIL
7b00: 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f 0d 0a 20  _XXX value */.. 
7b10: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 45   char *zContentE
7b20: 78 70 72 6c 69 73 74 3b 0d 0a 20 20 46 74 73 35  xprlist;..  Fts5
7b30: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b  Tokenizer *pTok;
7b40: 0d 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a  ..  fts5_tokeniz
7b50: 65 72 20 2a 70 54 6f 6b 41 70 69 3b 0d 0a 0d 0a  er *pTokApi;....
7b60: 20 20 2f 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64    /* Values load
7b70: 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f  ed from the %_co
7b80: 6e 66 69 67 20 74 61 62 6c 65 20 2a 2f 0d 0a 20  nfig table */.. 
7b90: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 65 64 20   /* Incremented 
7bc0: 77 68 65 6e 20 25 5f 63 6f 6e 66 69 67 20 69 73  when %_config is
7bd0: 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0d 0a 20 20   modified */..  
7be0: 69 6e 74 20 70 67 73 7a 3b 20 20 20 20 20 20 20  int pgsz;       
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 2f 2a 20 41 70 70 72 6f 78 69 6d 61 74 65 20 70  /* Approximate p
7c10: 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 69 6e  age size used in
7c20: 20 25 5f 64 61 74 61 20 2a 2f 0d 0a 20 20 69 6e   %_data */..  in
7c30: 74 20 6e 41 75 74 6f 6d 65 72 67 65 3b 20 20 20  t nAutomerge;   
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c50: 20 27 61 75 74 6f 6d 65 72 67 65 27 20 73 65 74   'automerge' set
7c60: 74 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e  ting */..  int n
7c70: 43 72 69 73 69 73 4d 65 72 67 65 3b 20 20 20 20  CrisisMerge;    
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7c90: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65  ximum allowed se
7ca0: 67 6d 65 6e 74 73 20 70 65 72 20 6c 65 76 65 6c  gments per level
7cb0: 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 55 73 65 72   */..  int nUser
7cc0: 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20  merge;          
7cd0: 20 20 20 20 20 20 20 2f 2a 20 27 75 73 65 72 6d         /* 'userm
7ce0: 65 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a 2f  erge' setting */
7cf0: 0d 0a 20 20 69 6e 74 20 6e 48 61 73 68 53 69 7a  ..  int nHashSiz
7d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7d10: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7d20: 6d 65 6d 6f 72 79 20 66 6f 72 20 69 6e 2d 6d 65  memory for in-me
7d30: 6d 6f 72 79 20 68 61 73 68 20 2a 2f 0d 0a 20 20  mory hash */..  
7d40: 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20  char *zRank;    
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20  /* Name of rank 
7d70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 63  function */..  c
7d80: 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 20  har *zRankArgs; 
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7da0: 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 72  * Arguments to r
7db0: 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d  ank function */.
7dc0: 0a 0d 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e  ...  /* If non-N
7dd0: 55 4c 4c 2c 20 70 6f 69 6e 74 73 20 74 6f 20 73  ULL, points to s
7de0: 71 6c 69 74 65 33 5f 76 74 61 62 2e 62 61 73 65  qlite3_vtab.base
7df0: 2e 7a 45 72 72 6d 73 67 2e 20 4f 66 74 65 6e 20  .zErrmsg. Often 
7e00: 4e 55 4c 4c 2e 20 2a 2f 0d 0a 20 20 63 68 61 72  NULL. */..  char
7e10: 20 2a 2a 70 7a 45 72 72 6d 73 67 3b 0d 0a 0d 0a   **pzErrmsg;....
7e20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7e30: 42 55 47 0d 0a 20 20 69 6e 74 20 62 50 72 65 66  BUG..  int bPref
7e40: 69 78 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  ixIndex;        
7e50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7e60: 6f 20 75 73 65 20 70 72 65 66 69 78 2d 69 6e 64  o use prefix-ind
7e70: 65 78 65 73 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d  exes */..#endif.
7e80: 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 43 75 72 72 65 6e  .};..../* Curren
7e90: 74 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65  t expected value
7ea0: 20 6f 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62   of %_config tab
7eb0: 6c 65 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65  le 'version' fie
7ec0: 6c 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46  ld */..#define F
7ed0: 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53  TS5_CURRENT_VERS
7ee0: 49 4f 4e 20 34 0d 0a 0d 0a 23 64 65 66 69 6e 65  ION 4....#define
7ef0: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
7f00: 52 4d 41 4c 20 20 20 30 0d 0a 23 64 65 66 69 6e  RMAL   0..#defin
7f10: 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e  e FTS5_CONTENT_N
7f20: 4f 4e 45 20 20 20 20 20 31 0d 0a 23 64 65 66 69  ONE     1..#defi
7f30: 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f  ne FTS5_CONTENT_
7f40: 45 58 54 45 52 4e 41 4c 20 32 0d 0a 0d 0a 23 64  EXTERNAL 2....#d
7f50: 65 66 69 6e 65 20 46 54 53 35 5f 44 45 54 41 49  efine FTS5_DETAI
7f60: 4c 5f 46 55 4c 4c 20 20 20 20 30 0d 0a 23 64 65  L_FULL    0..#de
7f70: 66 69 6e 65 20 46 54 53 35 5f 44 45 54 41 49 4c  fine FTS5_DETAIL
7f80: 5f 4e 4f 4e 45 20 20 20 20 31 0d 0a 23 64 65 66  _NONE    1..#def
7f90: 69 6e 65 20 46 54 53 35 5f 44 45 54 41 49 4c 5f  ine FTS5_DETAIL_
7fa0: 43 4f 4c 55 4d 4e 53 20 32 0d 0a 0d 0a 0d 0a 0d  COLUMNS 2.......
7fb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
7fc0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
7fd0: 73 65 28 0d 0a 20 20 20 20 46 74 73 35 47 6c 6f  se(..    Fts5Glo
7fe0: 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  bal*, sqlite3*, 
7ff0: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  int, const char 
8000: 2a 2a 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a 2a  **, Fts5Config**
8010: 2c 20 63 68 61 72 2a 2a 0d 0a 29 3b 0d 0a 73 74  , char**..);..st
8020: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
8030: 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28  3Fts5ConfigFree(
8040: 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0d 0a 0d  Fts5Config*);...
8050: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8060: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 44 65 63  te3Fts5ConfigDec
8070: 6c 61 72 65 56 74 61 62 28 46 74 73 35 43 6f 6e  lareVtab(Fts5Con
8080: 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 3b 0d 0a  fig *pConfig);..
8090: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
80a0: 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ite3Fts5Tokenize
80b0: 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  (..  Fts5Config 
80c0: 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
80d0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e       /* FTS5 Con
80e0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
80f0: 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67  t */..  int flag
8100: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
8110: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f          /* FTS5_
8120: 54 4f 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73  TOKENIZE_* flags
8130: 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
8140: 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54  r *pText, int nT
8150: 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74 20 74  ext,   /* Text t
8160: 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20  o tokenize */.. 
8170: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73 73   /* Context pass
81a0: 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a  ed to xToken() *
81b0: 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  /..  int (*xToke
81c0: 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63  n)(void*, int, c
81d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c  onst char*, int,
81e0: 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a   int, int)    /*
81f0: 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29 3b   Callback */..);
8200: 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
8210: 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f  sqlite3Fts5Dequo
8220: 74 65 28 63 68 61 72 20 2a 7a 29 3b 0d 0a 0d 0a  te(char *z);....
8230: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  /* Load the cont
8240: 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
8250: 6e 66 69 67 20 74 61 62 6c 65 20 2a 2f 0d 0a 73  nfig table */..s
8260: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8270: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
8280: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 69 6e 74  Fts5Config*, int
8290: 29 3b 0d 0a 0d 0a 2f 2a 20 53 65 74 20 74 68 65  );..../* Set the
82a0: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 69 6e 67   value of a sing
82b0: 6c 65 20 63 6f 6e 66 69 67 20 61 74 74 72 69 62  le config attrib
82c0: 75 74 65 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69  ute */..static i
82d0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
82e0: 6e 66 69 67 53 65 74 56 61 6c 75 65 28 46 74 73  nfigSetValue(Fts
82f0: 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20  5Config*, const 
8300: 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76  char*, sqlite3_v
8310: 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 0d  alue*, int*);...
8320: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8330: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
8340: 73 65 52 61 6e 6b 28 63 6f 6e 73 74 20 63 68 61  seRank(const cha
8350: 72 2a 2c 20 63 68 61 72 2a 2a 2c 20 63 68 61 72  r*, char**, char
8360: 2a 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45  **);..../*..** E
8370: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
8380: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
8390: 63 6f 6e 66 69 67 2e 63 2e 0d 0a 2a 2a 2a 2a 2a  config.c...*****
83a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83e0: 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a  *****/..../*****
83f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8430: 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66  *****..** Interf
8440: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
8450: 74 73 35 5f 62 75 66 66 65 72 2e 63 2e 0d 0a 2a  ts5_buffer.c...*
8460: 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 42 75 66 66  /..../*..** Buff
8470: 65 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  er object for th
8480: 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75  e incremental bu
8490: 69 6c 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67  ilding of string
84a0: 20 64 61 74 61 2e 0d 0a 2a 2f 0d 0a 74 79 70 65   data...*/..type
84b0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42  def struct Fts5B
84c0: 75 66 66 65 72 20 46 74 73 35 42 75 66 66 65 72  uffer Fts5Buffer
84d0: 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 42 75  ;..struct Fts5Bu
84e0: 66 66 65 72 20 7b 0d 0a 20 20 75 38 20 2a 70 3b  ffer {..  u8 *p;
84f0: 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 20 20 69 6e  ..  int n;..  in
8500: 74 20 6e 53 70 61 63 65 3b 0d 0a 7d 3b 0d 0a 0d  t nSpace;..};...
8510: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8520: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
8530: 65 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  e(int*, Fts5Buff
8540: 65 72 2a 2c 20 75 33 32 29 3b 0d 0a 73 74 61 74  er*, u32);..stat
8550: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
8560: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8570: 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35  arint(int*, Fts5
8580: 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b 0d 0a  Buffer*, i64);..
8590: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
85a0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
85b0: 65 6e 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74  endBlob(int*, Ft
85c0: 73 35 42 75 66 66 65 72 2a 2c 20 75 33 32 2c 20  s5Buffer*, u32, 
85d0: 63 6f 6e 73 74 20 75 38 2a 29 3b 0d 0a 73 74 61  const u8*);..sta
85e0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
85f0: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
8600: 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74  String(int *, Ft
8610: 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74  s5Buffer*, const
8620: 20 63 68 61 72 2a 29 3b 0d 0a 73 74 61 74 69 63   char*);..static
8630: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
8640: 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35  5BufferFree(Fts5
8650: 42 75 66 66 65 72 2a 29 3b 0d 0a 73 74 61 74 69  Buffer*);..stati
8660: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
8670: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73  s5BufferZero(Fts
8680: 35 42 75 66 66 65 72 2a 29 3b 0d 0a 73 74 61 74  5Buffer*);..stat
8690: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
86a0: 74 73 35 42 75 66 66 65 72 53 65 74 28 69 6e 74  ts5BufferSet(int
86b0: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
86c0: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b  int, const u8*);
86d0: 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
86e0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
86f0: 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e 74 20  ppendPrintf(int 
8700: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
8710: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
8720: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 63 68 61 72  ;....static char
8730: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72   *sqlite3Fts5Mpr
8740: 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63  intf(int *pRc, c
8750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
8760: 20 2e 2e 2e 29 3b 0d 0a 0d 0a 23 64 65 66 69 6e   ...);....#defin
8770: 65 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e fts5BufferZero
8780: 28 78 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (x)             
8790: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
87a0: 72 5a 65 72 6f 28 78 29 0d 0a 23 64 65 66 69 6e  rZero(x)..#defin
87b0: 65 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  e fts5BufferAppe
87c0: 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c 63 29 20  ndVarint(a,b,c) 
87d0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
87e0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c  rAppendVarint(a,
87f0: 62 2c 63 29 0d 0a 23 64 65 66 69 6e 65 20 66 74  b,c)..#define ft
8800: 73 35 42 75 66 66 65 72 46 72 65 65 28 61 29 20  s5BufferFree(a) 
8810: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8820: 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
8830: 65 28 61 29 0d 0a 23 64 65 66 69 6e 65 20 66 74  e(a)..#define ft
8840: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
8850: 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71 6c 69  ob(a,b,c,d) sqli
8860: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
8870: 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29  endBlob(a,b,c,d)
8880: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8890: 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29  fferSet(a,b,c,d)
88a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
88b0: 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c 62  ts5BufferSet(a,b
88c0: 2c 63 2c 64 29 0d 0a 0d 0a 23 64 65 66 69 6e 65  ,c,d)....#define
88d0: 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
88e0: 70 52 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20 5c  pRc,pBuf,nn) ( \
88f0: 0d 0a 20 20 28 75 33 32 29 28 28 70 42 75 66 29  ..  (u32)((pBuf)
8900: 2d 3e 6e 29 20 2b 20 28 75 33 32 29 28 6e 6e 29  ->n) + (u32)(nn)
8910: 20 3c 3d 20 28 75 33 32 29 28 28 70 42 75 66 29   <= (u32)((pBuf)
8920: 2d 3e 6e 53 70 61 63 65 29 20 3f 20 30 20 3a 20  ->nSpace) ? 0 : 
8930: 5c 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  \..    sqlite3Ft
8940: 73 35 42 75 66 66 65 72 53 69 7a 65 28 28 70 52  s5BufferSize((pR
8950: 63 29 2c 28 70 42 75 66 29 2c 28 6e 6e 29 2b 28  c),(pBuf),(nn)+(
8960: 70 42 75 66 29 2d 3e 6e 29 20 5c 0d 0a 29 0d 0a  pBuf)->n) \..)..
8970: 0d 0a 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64  ../* Write and d
8980: 65 63 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e  ecode big-endian
8990: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
89a0: 76 61 6c 75 65 73 20 2a 2f 0d 0a 73 74 61 74 69  values */..stati
89b0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
89c0: 73 35 50 75 74 33 32 28 75 38 2a 2c 20 69 6e 74  s5Put32(u8*, int
89d0: 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  );..static int s
89e0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
89f0: 63 6f 6e 73 74 20 75 38 2a 29 3b 0d 0a 0d 0a 23  const u8*);....#
8a00: 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4f 53 32  define FTS5_POS2
8a10: 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 20 28 69 6e  COLUMN(iPos) (in
8a20: 74 29 28 69 50 6f 73 20 3e 3e 20 33 32 29 0d 0a  t)(iPos >> 32)..
8a30: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4f 53  #define FTS5_POS
8a40: 32 4f 46 46 53 45 54 28 69 50 6f 73 29 20 28 69  2OFFSET(iPos) (i
8a50: 6e 74 29 28 69 50 6f 73 20 26 20 30 78 46 46 46  nt)(iPos & 0xFFF
8a60: 46 46 46 46 46 29 0d 0a 0d 0a 74 79 70 65 64 65  FFFFF)....typede
8a70: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
8a80: 6c 69 73 74 52 65 61 64 65 72 20 46 74 73 35 50  listReader Fts5P
8a90: 6f 73 6c 69 73 74 52 65 61 64 65 72 3b 0d 0a 73  oslistReader;..s
8aa0: 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73  truct Fts5Poslis
8ab0: 74 52 65 61 64 65 72 20 7b 0d 0a 20 20 2f 2a 20  tReader {..  /* 
8ac0: 56 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f  Variables used o
8ad0: 6e 6c 79 20 62 79 20 73 71 6c 69 74 65 33 46 74  nly by sqlite3Ft
8ae0: 73 35 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58  s5PoslistIterXXX
8af0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  () functions. */
8b00: 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b  ..  const u8 *a;
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
8b30: 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20  list to iterate 
8b40: 74 68 72 6f 75 67 68 20 2a 2f 0d 0a 20 20 69 6e  through */..  in
8b50: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b70: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
8b80: 61 74 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20  at a[] in bytes 
8b90: 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  */..  int i;    
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8bc0: 20 6f 66 66 73 65 74 20 69 6e 20 61 5b 5d 20 2a   offset in a[] *
8bd0: 2f 0d 0a 0d 0a 20 20 75 38 20 62 46 6c 61 67 3b  /....  u8 bFlag;
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6c         /* For cl
8c00: 69 65 6e 74 20 75 73 65 20 28 61 6e 79 20 63 75  ient use (any cu
8c10: 73 74 6f 6d 20 70 75 72 70 6f 73 65 29 20 2a 2f  stom purpose) */
8c20: 0d 0a 0d 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  ....  /* Output 
8c30: 76 61 72 69 61 62 6c 65 73 20 2a 2f 0d 0a 20 20  variables */..  
8c40: 75 38 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  u8 bEof;        
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61  /* Set to true a
8c70: 74 20 45 4f 46 20 2a 2f 0d 0a 20 20 69 36 34 20  t EOF */..  i64 
8c80: 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  iPos;           
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
8ca0: 69 43 6f 6c 3c 3c 33 32 29 20 2b 20 69 50 6f 73  iCol<<32) + iPos
8cb0: 20 2a 2f 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63 20   */..};..static 
8cc0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
8cd0: 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
8ce0: 28 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  (..  const u8 *a
8cf0: 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
8d00: 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
8d10: 62 75 66 66 65 72 20 74 6f 20 69 74 65 72 61 74  buffer to iterat
8d20: 65 20 74 68 72 6f 75 67 68 20 2a 2f 0d 0a 20 20  e through */..  
8d30: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
8d40: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
8d50: 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65  /* Iterator obje
8d60: 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ct to initialize
8d70: 20 2a 2f 0d 0a 29 3b 0d 0a 73 74 61 74 69 63 20   */..);..static 
8d80: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
8d90: 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
8da0: 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  (Fts5PoslistRead
8db0: 65 72 2a 29 3b 0d 0a 0d 0a 74 79 70 65 64 65 66  er*);....typedef
8dc0: 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c   struct Fts5Posl
8dd0: 69 73 74 57 72 69 74 65 72 20 46 74 73 35 50 6f  istWriter Fts5Po
8de0: 73 6c 69 73 74 57 72 69 74 65 72 3b 0d 0a 73 74  slistWriter;..st
8df0: 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74  ruct Fts5Poslist
8e00: 57 72 69 74 65 72 20 7b 0d 0a 20 20 69 36 34 20  Writer {..  i64 
8e10: 69 50 72 65 76 3b 0d 0a 7d 3b 0d 0a 73 74 61 74  iPrev;..};..stat
8e20: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
8e30: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
8e40: 70 70 65 6e 64 28 46 74 73 35 42 75 66 66 65 72  ppend(Fts5Buffer
8e50: 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  *, Fts5PoslistWr
8e60: 69 74 65 72 2a 2c 20 69 36 34 29 3b 0d 0a 73 74  iter*, i64);..st
8e70: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
8e80: 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
8e90: 41 70 70 65 6e 64 28 46 74 73 35 42 75 66 66 65  Append(Fts5Buffe
8ea0: 72 2a 2c 20 69 36 34 2a 2c 20 69 36 34 29 3b 0d  r*, i64*, i64);.
8eb0: 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
8ec0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
8ed0: 4e 65 78 74 36 34 28 0d 0a 20 20 63 6f 6e 73 74  Next64(..  const
8ee0: 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20   u8 *a, int n,  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
8f00: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
8f10: 70 6f 73 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e  poslist */..  in
8f20: 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20  t *pi,          
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f40: 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20   IN/OUT: Offset 
8f50: 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0d 0a 20  within a[] */.. 
8f60: 20 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20   i64 *piOff     
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
8f90: 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 29  ent offset */..)
8fa0: 3b 0d 0a 0d 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75  ;..../* Malloc u
8fb0: 74 69 6c 69 74 79 20 2a 2f 0d 0a 73 74 61 74 69  tility */..stati
8fc0: 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46  c void *sqlite3F
8fd0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e  ts5MallocZero(in
8fe0: 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42 79 74  t *pRc, int nByt
8ff0: 65 29 3b 0d 0a 73 74 61 74 69 63 20 63 68 61 72  e);..static char
9000: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 53 74 72   *sqlite3Fts5Str
9010: 6e 64 75 70 28 69 6e 74 20 2a 70 52 63 2c 20 63  ndup(int *pRc, c
9020: 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
9030: 69 6e 74 20 6e 49 6e 29 3b 0d 0a 0d 0a 2f 2a 20  int nIn);..../* 
9040: 43 68 61 72 61 63 74 65 72 20 73 65 74 20 74 65  Character set te
9050: 73 74 73 20 28 6c 69 6b 65 20 69 73 73 70 61 63  sts (like isspac
9060: 65 28 29 2c 20 69 73 61 6c 70 68 61 28 29 20 65  e(), isalpha() e
9070: 74 63 2e 29 20 2a 2f 0d 0a 73 74 61 74 69 63 20  tc.) */..static 
9080: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
9090: 73 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74  sBareword(char t
90a0: 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 20 42 75 63 6b 65  );....../* Bucke
90b0: 74 20 6f 66 20 74 65 72 6d 73 20 6f 62 6a 65 63  t of terms objec
90c0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
90d0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e  tegrity-check in
90e0: 20 6f 66 66 73 65 74 73 3d 30 20 6d 6f 64 65 2e   offsets=0 mode.
90f0: 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
9100: 75 63 74 20 46 74 73 35 54 65 72 6d 73 65 74 20  uct Fts5Termset 
9110: 46 74 73 35 54 65 72 6d 73 65 74 3b 0d 0a 73 74  Fts5Termset;..st
9120: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9130: 46 74 73 35 54 65 72 6d 73 65 74 4e 65 77 28 46  Fts5TermsetNew(F
9140: 74 73 35 54 65 72 6d 73 65 74 2a 2a 29 3b 0d 0a  ts5Termset**);..
9150: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9160: 65 33 46 74 73 35 54 65 72 6d 73 65 74 41 64 64  e3Fts5TermsetAdd
9170: 28 46 74 73 35 54 65 72 6d 73 65 74 2a 2c 20 69  (Fts5Termset*, i
9180: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  nt, const char*,
9190: 20 69 6e 74 2c 20 69 6e 74 20 2a 70 62 50 72 65   int, int *pbPre
91a0: 73 65 6e 74 29 3b 0d 0a 73 74 61 74 69 63 20 76  sent);..static v
91b0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 54  oid sqlite3Fts5T
91c0: 65 72 6d 73 65 74 46 72 65 65 28 46 74 73 35 54  ermsetFree(Fts5T
91d0: 65 72 6d 73 65 74 2a 29 3b 0d 0a 0d 0a 2f 2a 0d  ermset*);..../*.
91e0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
91f0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
9200: 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e 0d 0a  fts5_buffer.c...
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f  **********/..../
9260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49  **********..** I
92b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
92c0: 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63   in fts5_index.c
92d0: 2e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 20 63  . fts5_index.c c
92e0: 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73  ontains contains
92f0: 20 63 6f 64 65 0d 0a 2a 2a 20 74 6f 20 61 63 63   code..** to acc
9300: 65 73 73 20 74 68 65 20 64 61 74 61 20 73 74 6f  ess the data sto
9310: 72 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74  red in the %_dat
9320: 61 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 0d 0a  a table...*/....
9330: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
9340: 74 73 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64  ts5Index Fts5Ind
9350: 65 78 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72  ex;..typedef str
9360: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
9370: 72 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 3b  r Fts5IndexIter;
9380: 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73 35 49  ....struct Fts5I
9390: 6e 64 65 78 49 74 65 72 20 7b 0d 0a 20 20 69 36  ndexIter {..  i6
93a0: 34 20 69 52 6f 77 69 64 3b 0d 0a 20 20 63 6f 6e  4 iRowid;..  con
93b0: 73 74 20 75 38 20 2a 70 44 61 74 61 3b 0d 0a 20  st u8 *pData;.. 
93c0: 20 69 6e 74 20 6e 44 61 74 61 3b 0d 0a 20 20 75   int nData;..  u
93d0: 38 20 62 45 6f 66 3b 0d 0a 7d 3b 0d 0a 0d 0a 23  8 bEof;..};....#
93e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74  define sqlite3Ft
93f0: 73 35 49 74 65 72 45 6f 66 28 78 29 20 28 28 78  s5IterEof(x) ((x
9400: 29 2d 3e 62 45 6f 66 29 0d 0a 0d 0a 2f 2a 0d 0a  )->bEof)..../*..
9410: 2a 2a 20 56 61 6c 75 65 73 20 75 73 65 64 20 61  ** Values used a
9420: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
9430: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ags argument pas
9440: 73 65 64 20 74 6f 20 49 6e 64 65 78 51 75 65 72  sed to IndexQuer
9450: 79 28 29 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  y()...*/..#defin
9460: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
9470: 59 5f 50 52 45 46 49 58 20 20 20 20 20 30 78 30  Y_PREFIX     0x0
9480: 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69 78 20  001   /* Prefix 
9490: 71 75 65 72 79 20 2a 2f 0d 0a 23 64 65 66 69 6e  query */..#defin
94a0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
94b0: 59 5f 44 45 53 43 20 20 20 20 20 20 20 30 78 30  Y_DESC       0x0
94c0: 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69 6e  002   /* Docs in
94d0: 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
94e0: 64 20 6f 72 64 65 72 20 2a 2f 0d 0a 23 64 65 66  d order */..#def
94f0: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
9500: 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30  ERY_TEST_NOIDX 0
9510: 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f  x0004   /* Do no
9520: 74 20 75 73 65 20 70 72 65 66 69 78 20 69 6e 64  t use prefix ind
9530: 65 78 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46  ex */..#define F
9540: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
9550: 43 41 4e 20 20 20 20 20 20 20 30 78 30 30 30 38  CAN       0x0008
9560: 20 20 20 2f 2a 20 53 63 61 6e 20 71 75 65 72 79     /* Scan query
9570: 20 28 66 74 73 35 76 6f 63 61 62 29 20 2a 2f 0d   (fts5vocab) */.
9580: 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .../* The follow
9590: 69 6e 67 20 61 72 65 20 75 73 65 64 20 69 6e 74  ing are used int
95a0: 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 65 20 66  ernally by the f
95b0: 74 73 35 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75  ts5_index.c modu
95c0: 6c 65 2e 20 54 68 65 79 20 61 72 65 0d 0a 2a 2a  le. They are..**
95d0: 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6f 6e   defined here on
95e0: 6c 79 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  ly to make it ea
95f0: 73 69 65 72 20 74 6f 20 61 76 6f 69 64 20 63 6c  sier to avoid cl
9600: 61 73 68 65 73 20 77 69 74 68 20 74 68 65 20 66  ashes with the f
9610: 6c 61 67 73 0d 0a 2a 2a 20 61 62 6f 76 65 2e 20  lags..** above. 
9620: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
9630: 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
9640: 45 4d 50 54 59 20 20 30 78 30 30 31 30 0d 0a 23  EMPTY  0x0010..#
9650: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
9660: 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 20  _QUERY_NOOUTPUT 
9670: 20 20 30 78 30 30 32 30 0d 0a 0d 0a 2f 2a 0d 0a    0x0020..../*..
9680: 2a 2a 20 43 72 65 61 74 65 2f 64 65 73 74 72 6f  ** Create/destro
9690: 79 20 61 6e 20 46 74 73 35 49 6e 64 65 78 20 6f  y an Fts5Index o
96a0: 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  bject...*/..stat
96b0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
96c0: 73 35 49 6e 64 65 78 4f 70 65 6e 28 46 74 73 35  s5IndexOpen(Fts5
96d0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
96e0: 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 46 74   int bCreate, Ft
96f0: 73 35 49 6e 64 65 78 2a 2a 2c 20 63 68 61 72 2a  s5Index**, char*
9700: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  *);..static int 
9710: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
9720: 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
9730: 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52  *p);..../*..** R
9740: 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63  eturn a simple c
9750: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61  hecksum value ba
9760: 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d  sed on the argum
9770: 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ents...*/..stati
9780: 63 20 75 36 34 20 73 71 6c 69 74 65 33 46 74 73  c u64 sqlite3Fts
9790: 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
97a0: 28 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  (..  i64 iRowid,
97b0: 20 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0d   ..  int iCol, .
97c0: 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0d 0a 20  .  int iPos, .. 
97d0: 20 69 6e 74 20 69 49 64 78 2c 0d 0a 20 20 63 6f   int iIdx,..  co
97e0: 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
97f0: 0d 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0d 0a 29  ..  int nTerm..)
9800: 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75  ;..../*..** Argu
9810: 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
9820: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
9830: 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20  ning utf-8 text 
9840: 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20  that is n bytes 
9850: 69 6e 20 0d 0a 2a 2a 20 73 69 7a 65 2e 20 52 65  in ..** size. Re
9860: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9870: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
9880: 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
9890: 70 72 65 66 69 78 20 6f 66 20 74 68 65 0d 0a 2a  prefix of the..*
98a0: 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69  * buffer, or 0 i
98b0: 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  f there are less
98c0: 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72   than nChar char
98d0: 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e  acters in total.
98e0: 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
98f0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
9900: 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
9910: 6e 28 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  n(..  const char
9920: 20 2a 70 2c 20 0d 0a 20 20 69 6e 74 20 6e 42 79   *p, ..  int nBy
9930: 74 65 2c 20 0d 0a 20 20 69 6e 74 20 6e 43 68 61  te, ..  int nCha
9940: 72 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  r..);..../*..** 
9950: 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
9960: 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
9970: 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 73  hough all rowids
9980: 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
9990: 0d 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74  ..** specified t
99a0: 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
99b0: 65 66 69 78 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  efix...*/..stati
99c0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
99d0: 35 49 6e 64 65 78 51 75 65 72 79 28 0d 0a 20 20  5IndexQuery(..  
99e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
9a10: 71 75 65 72 79 20 2a 2f 0d 0a 20 20 63 6f 6e 73  query */..  cons
9a20: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
9a30: 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54  int nToken, /* T
9a40: 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29  oken (or prefix)
9a50: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
9a60: 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ..  int flags,  
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
9a90: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
9aa0: 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 46 74 73   flags */..  Fts
9ab0: 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
9ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9ad0: 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75  Match these colu
9ae0: 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0d 0a 20 20 46  mns only */..  F
9af0: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
9b00: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  pIter          /
9b10: 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61  * OUT: New itera
9b20: 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 29  tor object */..)
9b30: 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20  ;..../*..** The 
9b40: 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74 69 6f  various operatio
9b50: 6e 73 20 6f 6e 20 6f 70 65 6e 20 74 6f 6b 65 6e  ns on open token
9b60: 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
9b70: 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65   iterators opene
9b80: 64 0d 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  d..** using sqli
9b90: 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
9ba0: 79 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  y()...*/..static
9bb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
9bc0: 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
9bd0: 65 78 49 74 65 72 2a 29 3b 0d 0a 73 74 61 74 69  exIter*);..stati
9be0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
9bf0: 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
9c00: 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20 69 36  s5IndexIter*, i6
9c10: 34 20 69 4d 61 74 63 68 29 3b 0d 0a 0d 0a 2f 2a  4 iMatch);..../*
9c20: 0d 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  ..** Close an it
9c30: 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
9c40: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
9c50: 78 51 75 65 72 79 28 29 2e 0d 0a 2a 2f 0d 0a 73  xQuery()...*/..s
9c60: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
9c70: 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
9c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b  Fts5IndexIter*);
9c90: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20  ..../*..** This 
9ca0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73 65  interface is use
9cb0: 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63  d by the fts5voc
9cc0: 61 62 20 6d 6f 64 75 6c 65 2e 0d 0a 2a 2f 0d 0a  ab module...*/..
9cd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9ce0: 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
9cf0: 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
9d00: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 73  Iter*, int*);..s
9d10: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9d20: 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61  3Fts5IterNextSca
9d30: 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a  n(Fts5IndexIter*
9d40: 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49  );....../*..** I
9d50: 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20  nsert or remove 
9d60: 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20  data to or from 
9d70: 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20  the index. Each 
9d80: 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20  time a document 
9d90: 69 73 20 0d 0a 2a 2a 20 61 64 64 65 64 20 74 6f  is ..** added to
9da0: 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
9db0: 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73   the index, this
9dc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
9dd0: 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0d  led one or more.
9de0: 0a 2a 2a 20 74 69 6d 65 73 2e 0d 0a 2a 2a 0d 0a  .** times...**..
9df0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
9e00: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
9e10: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
9e20: 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
9e30: 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0d 0a 2a 2a  ew document...**
9e40: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
9e50: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
9e60: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
9e70: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
9e80: 20 66 6f 72 20 65 61 63 68 0d 0a 2a 2a 20 75 6e   for each..** un
9e90: 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
9ea0: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
9eb0: 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
9ec0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
9ed0: 65 20 69 50 6f 73 0d 0a 2a 2a 20 61 72 67 75 6d  e iPos..** argum
9ee0: 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66  ent is ignored f
9ef0: 6f 72 20 61 20 64 65 6c 65 74 65 2e 0d 0a 2a 2f  or a delete...*/
9f00: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
9f10: 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69  ite3Fts5IndexWri
9f20: 74 65 28 0d 0a 20 20 46 74 73 35 49 6e 64 65 78  te(..  Fts5Index
9f30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9f40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9f50: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0d 0a  to write to */..
9f60: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
9f90: 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76  n appears in (-v
9fa0: 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0d  e -> delete) */.
9fb0: 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
9fe0: 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
9ff0: 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20 63 6f 6e 73  olumn */..  cons
a000: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
a010: 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
a020: 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
a030: 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
a040: 20 69 6e 64 65 78 20 2a 2f 0d 0a 29 3b 0d 0a 0d   index */..);...
a050: 0a 2f 2a 0d 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ./*..** Indicate
a060: 20 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74   that subsequent
a070: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a080: 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
a090: 29 20 70 65 72 74 61 69 6e 20 74 6f 0d 0a 2a 2a  ) pertain to..**
a0a0: 20 64 6f 63 75 6d 65 6e 74 20 69 44 6f 63 69 64   document iDocid
a0b0: 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
a0c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a0d0: 65 78 42 65 67 69 6e 57 72 69 74 65 28 0d 0a 20  exBeginWrite(.. 
a0e0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69   /* Index to wri
a110: 74 65 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20  te to */..  int 
a120: 62 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  bDelete,        
a130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a140: 72 75 65 20 69 66 20 63 75 72 72 65 6e 74 20 6f  rue if current o
a150: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
a160: 6c 65 74 65 20 2a 2f 0d 0a 20 20 69 36 34 20 69  lete */..  i64 i
a170: 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 20  Docid           
a180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
a190: 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20 72 65  cid to add or re
a1a0: 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d 20 2a  move data from *
a1b0: 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..);..../*..** 
a1c0: 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
a1d0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
a1e0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
a1f0: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
a200: 73 65 2e 0d 0a 2a 2a 20 41 6c 73 6f 20 63 6c 6f  se...** Also clo
a210: 73 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62  se any open blob
a220: 20 68 61 6e 64 6c 65 73 2e 0d 0a 2a 2f 0d 0a 73   handles...*/..s
a230: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a240: 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
a250: 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a 0d  ts5Index *p);...
a260: 0a 2f 2a 0d 0a 2a 2a 20 44 69 73 63 61 72 64 20  ./*..** Discard 
a270: 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
a280: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
a290: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f   hash tables. Do
a2a0: 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0d 0a 2a   not write it..*
a2b0: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
a2c0: 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
a2d0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
a2e0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
a2f0: 20 25 5f 64 61 74 61 0d 0a 2a 2a 20 74 61 62 6c   %_data..** tabl
a300: 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
a310: 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
a320: 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
a330: 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0d 0a  hes of %_data ..
a340: 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20  ** records must 
a350: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0d  be invalidated..
a360: 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
a370: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
a380: 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
a390: 65 78 20 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  ex *p);..../*..*
a3a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
a3b0: 20 22 61 76 65 72 61 67 65 73 22 20 76 61 6c 75   "averages" valu
a3c0: 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  es...*/..static 
a3d0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
a3e0: 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
a3f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
a400: 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61  4 *pnRow, i64 *a
a410: 6e 53 69 7a 65 29 3b 0d 0a 73 74 61 74 69 63 20  nSize);..static 
a420: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
a430: 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
a440: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
a450: 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 3b 0d 0a  nst u8*, int);..
a460: 0d 0a 2f 2a 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f  ../*..** Functio
a470: 6e 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ns called by the
a480: 20 73 74 6f 72 61 67 65 20 6d 6f 64 75 6c 65 20   storage module 
a490: 61 73 20 70 61 72 74 20 6f 66 20 69 6e 74 65 67  as part of integ
a4a0: 72 69 74 79 2d 63 68 65 63 6b 2e 0d 0a 2a 2f 0d  rity-check...*/.
a4b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a4c0: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
a4d0: 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
a4e0: 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d  ndex*, u64 cksum
a4f0: 29 3b 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 43 61  );..../* ..** Ca
a500: 6c 6c 65 64 20 64 75 72 69 6e 67 20 76 69 72 74  lled during virt
a510: 75 61 6c 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69  ual module initi
a520: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67  alization to reg
a530: 69 73 74 65 72 20 55 44 46 20 0d 0a 2a 2a 20 66  ister UDF ..** f
a540: 74 73 35 5f 64 65 63 6f 64 65 28 29 20 77 69 74  ts5_decode() wit
a550: 68 20 53 51 4c 69 74 65 20 0d 0a 2a 2f 0d 0a 73  h SQLite ..*/..s
a560: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a570: 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
a580: 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 73 74 61  qlite3*);....sta
a590: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
a5a0: 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
a5b0: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e  e(Fts5Index*, in
a5c0: 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65  t);..../*..** Re
a5d0: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
a5e0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
a5f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
a600: 5f 64 61 74 61 20 74 61 62 6c 65 20 62 79 20 0d  _data table by .
a610: 0a 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  .** this connect
a620: 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 77 61 73  ion since it was
a630: 20 63 72 65 61 74 65 64 2e 0d 0a 2a 2f 0d 0a 73   created...*/..s
a640: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a650: 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
a660: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a  Fts5Index *p);..
a670: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
a680: 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
a690: 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nit(Fts5Index *p
a6a0: 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  );..static int s
a6b0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
a6c0: 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65  ptimize(Fts5Inde
a6d0: 78 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69  x *p);..static i
a6e0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
a6f0: 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64  dexMerge(Fts5Ind
a700: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67  ex *p, int nMerg
a710: 65 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  e);..static int 
a720: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
a730: 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
a740: 2a 70 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69  *p);....static i
a750: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
a760: 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74  dexLoadConfig(Ft
a770: 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a 0d 0a  s5Index *p);....
a780: 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  /*..** End of in
a790: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
a7a0: 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 2e  in fts5_index.c.
a7b0: 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
a7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
a800: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a  ************..**
a850: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
a860: 64 65 20 69 6e 20 66 74 73 35 5f 76 61 72 69 6e  de in fts5_varin
a870: 74 2e 63 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69  t.c. ..*/..stati
a880: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
a890: 35 47 65 74 56 61 72 69 6e 74 33 32 28 63 6f 6e  5GetVarint32(con
a8a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
a8b0: 20 2a 70 2c 20 75 33 32 20 2a 76 29 3b 0d 0a 73   *p, u32 *v);..s
a8c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a8d0: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
a8e0: 6e 28 75 33 32 20 69 56 61 6c 29 3b 0d 0a 73 74  n(u32 iVal);..st
a8f0: 61 74 69 63 20 75 38 20 73 71 6c 69 74 65 33 46  atic u8 sqlite3F
a900: 74 73 35 47 65 74 56 61 72 69 6e 74 28 63 6f 6e  ts5GetVarint(con
a910: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
a920: 2a 2c 20 75 36 34 2a 29 3b 0d 0a 73 74 61 74 69  *, u64*);..stati
a930: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
a940: 35 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67  5PutVarint(unsig
a950: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34  ned char *p, u64
a960: 20 76 29 3b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20   v);....#define 
a970: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
a980: 61 2c 62 29 20 73 71 6c 69 74 65 33 46 74 73 35  a,b) sqlite3Fts5
a990: 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 28 75  GetVarint32(a,(u
a9a0: 33 32 2a 29 26 62 29 0d 0a 23 64 65 66 69 6e 65  32*)&b)..#define
a9b0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 20 20   fts5GetVarint  
a9c0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74    sqlite3Fts5Get
a9d0: 56 61 72 69 6e 74 0d 0a 0d 0a 23 64 65 66 69 6e  Varint....#defin
a9e0: 65 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72  e fts5FastGetVar
a9f0: 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
aa00: 56 61 6c 29 20 7b 20 20 20 20 20 20 5c 0d 0a 20  Val) {      \.. 
aa10: 20 6e 56 61 6c 20 3d 20 28 61 29 5b 69 4f 66 66   nVal = (a)[iOff
aa20: 2b 2b 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ++];            
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 5c 0d 0a 20 20 69 66 28 20 6e 56 61 6c 20 26   \..  if( nVal &
aa50: 20 30 78 38 30 20 29 7b 20 20 20 20 20 20 20 20   0x80 ){        
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 69 4f 66        \..    iOf
aa80: 66 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  f--;            
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20             \..  
aab0: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
aac0: 74 56 61 72 69 6e 74 33 32 28 26 28 61 29 5b 69  tVarint32(&(a)[i
aad0: 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b 20 20 20 20  Off], nVal);    
aae0: 5c 0d 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20  \..  }          
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 5c 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f       \..}....../
ab20: 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  *..** End of int
ab30: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
ab40: 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e 63 2e  n fts5_varint.c.
ab50: 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
ab60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ab70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ab80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ab90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
aba0: 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
abb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a  **************..
abf0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
ac00: 63 6f 64 65 20 69 6e 20 66 74 73 35 2e 63 2e 20  code in fts5.c. 
ac10: 0d 0a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ..*/....static i
ac20: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
ac30: 74 54 6f 6b 65 6e 69 7a 65 72 28 0d 0a 20 20 46  tTokenizer(..  F
ac40: 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 0d 0a 20 20  ts5Global*, ..  
ac50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41  const char **azA
ac60: 72 67 2c 0d 0a 20 20 69 6e 74 20 6e 41 72 67 2c  rg,..  int nArg,
ac70: 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ..  Fts5Tokenize
ac80: 72 2a 2a 2c 0d 0a 20 20 66 74 73 35 5f 74 6f 6b  r**,..  fts5_tok
ac90: 65 6e 69 7a 65 72 2a 2a 2c 0d 0a 20 20 63 68 61  enizer**,..  cha
aca0: 72 20 2a 2a 70 7a 45 72 72 0d 0a 29 3b 0d 0a 0d  r **pzErr..);...
acb0: 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e 64 65  .static Fts5Inde
acc0: 78 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e  x *sqlite3Fts5In
acd0: 64 65 78 46 72 6f 6d 43 73 72 69 64 28 46 74 73  dexFromCsrid(Fts
ace0: 35 47 6c 6f 62 61 6c 2a 2c 20 69 36 34 2c 20 46  5Global*, i64, F
acf0: 74 73 35 43 6f 6e 66 69 67 20 2a 2a 29 3b 0d 0a  ts5Config **);..
ad00: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20  ../*..** End of 
ad10: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
ad20: 65 20 69 6e 20 66 74 73 35 2e 63 2e 0d 0a 2a 2a  e in fts5.c...**
ad30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a  ********/..../**
ad80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ada0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
adb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
adc0: 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74  ********..** Int
add0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
ade0: 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 20 0d  n fts5_hash.c. .
adf0: 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72  .*/..typedef str
ae00: 75 63 74 20 46 74 73 35 48 61 73 68 20 46 74 73  uct Fts5Hash Fts
ae10: 35 48 61 73 68 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  5Hash;..../*..**
ae20: 20 43 72 65 61 74 65 20 61 20 68 61 73 68 20 74   Create a hash t
ae30: 61 62 6c 65 2c 20 66 72 65 65 20 61 20 68 61 73  able, free a has
ae40: 68 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74  h table...*/..st
ae50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
ae60: 46 74 73 35 48 61 73 68 4e 65 77 28 46 74 73 35  Fts5HashNew(Fts5
ae70: 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 48 61 73  Config*, Fts5Has
ae80: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
ae90: 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
aea0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46  sqlite3Fts5HashF
aeb0: 72 65 65 28 46 74 73 35 48 61 73 68 2a 29 3b 0d  ree(Fts5Hash*);.
aec0: 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
aed0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
aee0: 74 65 28 0d 0a 20 20 46 74 73 35 48 61 73 68 2a  te(..  Fts5Hash*
aef0: 2c 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  ,..  i64 iRowid,
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
af20: 72 20 74 68 69 73 20 65 6e 74 72 79 20 2a 2f 0d  r this entry */.
af30: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
af60: 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
af70: 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
af80: 0d 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  ..  int iPos,   
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
afb0: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
afc0: 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20 63 68 61  column */..  cha
afd0: 72 20 62 42 79 74 65 2c 0d 0a 20 20 63 6f 6e 73  r bByte,..  cons
afe0: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
aff0: 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
b000: 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
b010: 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
b020: 20 69 6e 64 65 78 20 2a 2f 0d 0a 29 3b 0d 0a 0d   index */..);...
b030: 0a 2f 2a 0d 0a 2a 2a 20 45 6d 70 74 79 20 28 62  ./*..** Empty (b
b040: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
b050: 29 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0d  ) a hash table..
b060: 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
b070: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
b080: 43 6c 65 61 72 28 46 74 73 35 48 61 73 68 2a 29  Clear(Fts5Hash*)
b090: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  ;....static int 
b0a0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51  sqlite3Fts5HashQ
b0b0: 75 65 72 79 28 0d 0a 20 20 46 74 73 35 48 61 73  uery(..  Fts5Has
b0c0: 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h*,             
b0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
b0e0: 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20   table to query 
b0f0: 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
b100: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
b110: 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 74  rm,   /* Query t
b120: 65 72 6d 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  erm */..  const 
b130: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
b140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b150: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
b160: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
b170: 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c  /..  int *pnDocl
b180: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
b190: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
b1a0: 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
b1b0: 62 79 74 65 73 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a  bytes */..);....
b1c0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
b1d0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
b1e0: 69 74 28 0d 0a 20 20 46 74 73 35 48 61 73 68 2a  it(..  Fts5Hash*
b1f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b200: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
b210: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  able to query */
b220: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
b230: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
b240: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65      /* Query pre
b250: 66 69 78 20 2a 2f 0d 0a 29 3b 0d 0a 73 74 61 74  fix */..);..stat
b260: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
b270: 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
b280: 46 74 73 35 48 61 73 68 2a 29 3b 0d 0a 73 74 61  Fts5Hash*);..sta
b290: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
b2a0: 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 46  ts5HashScanEof(F
b2b0: 74 73 35 48 61 73 68 2a 29 3b 0d 0a 73 74 61 74  ts5Hash*);..stat
b2c0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
b2d0: 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
b2e0: 28 46 74 73 35 48 61 73 68 20 2a 2c 0d 0a 20 20  (Fts5Hash *,..  
b2f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
b300: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
b310: 2f 2a 20 4f 55 54 3a 20 74 65 72 6d 20 28 6e 75  /* OUT: term (nu
b320: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f  l-terminated) */
b330: 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  ..  const u8 **p
b340: 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  pDoclist,       
b350: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 70 6f 69 6e      /* OUT: poin
b360: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a  ter to doclist *
b370: 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c  /..  int *pnDocl
b380: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
b390: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 69 7a       /* OUT: siz
b3a0: 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
b3b0: 62 79 74 65 73 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a  bytes */..);....
b3c0: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20  ../*..** End of 
b3d0: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
b3e0: 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63  e in fts5_hash.c
b3f0: 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...*************
b400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
b440: 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
b450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a  *************..*
b490: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
b4a0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72  ode in fts5_stor
b4b0: 61 67 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72  age.c. fts5_stor
b4c0: 61 67 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63  age.c contains c
b4d0: 6f 6e 74 61 69 6e 73 20 0d 0a 2a 2a 20 63 6f 64  ontains ..** cod
b4e0: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
b4f0: 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
b500: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64  he %_content and
b510: 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65   %_docsize table
b520: 73 2e 0d 0a 2a 2f 0d 0a 0d 0a 23 64 65 66 69 6e  s...*/....#defin
b530: 65 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  e FTS5_STMT_SCAN
b540: 5f 41 53 43 20 20 30 20 20 20 20 20 2f 2a 20 53  _ASC  0     /* S
b550: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
b560: 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
b570: 20 31 20 41 53 43 20 2a 2f 0d 0a 23 64 65 66 69   1 ASC */..#defi
b580: 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41  ne FTS5_STMT_SCA
b590: 4e 5f 44 45 53 43 20 31 20 20 20 20 20 2f 2a 20  N_DESC 1     /* 
b5a0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
b5b0: 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
b5c0: 59 20 31 20 44 45 53 43 20 2a 2f 0d 0a 23 64 65  Y 1 DESC */..#de
b5d0: 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f 4c  fine FTS5_STMT_L
b5e0: 4f 4f 4b 55 50 20 20 20 20 32 20 20 20 20 20 2f  OOKUP    2     /
b5f0: 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20  * SELECT rowid, 
b600: 2a 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45  * FROM ... WHERE
b610: 20 72 6f 77 69 64 3d 3f 20 2a 2f 0d 0a 0d 0a 74   rowid=? */....t
b620: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
b630: 73 35 53 74 6f 72 61 67 65 20 46 74 73 35 53 74  s5Storage Fts5St
b640: 6f 72 61 67 65 3b 0d 0a 0d 0a 73 74 61 74 69 63  orage;....static
b650: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
b660: 53 74 6f 72 61 67 65 4f 70 65 6e 28 46 74 73 35  StorageOpen(Fts5
b670: 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 49 6e 64  Config*, Fts5Ind
b680: 65 78 2a 2c 20 69 6e 74 2c 20 46 74 73 35 53 74  ex*, int, Fts5St
b690: 6f 72 61 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29  orage**, char**)
b6a0: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
b6b0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
b6c0: 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72 61 67  Close(Fts5Storag
b6d0: 65 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69  e *p);..static i
b6e0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
b6f0: 6f 72 61 67 65 52 65 6e 61 6d 65 28 46 74 73 35  orageRename(Fts5
b700: 53 74 6f 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20  Storage*, const 
b710: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 3b 0d 0a 0d  char *zName);...
b720: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
b730: 74 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46  te3Fts5DropAll(F
b740: 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0d 0a 73 74  ts5Config*);..st
b750: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
b760: 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
b770: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e  Fts5Config*, con
b780: 73 74 20 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20  st char*, const 
b790: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72  char*, int, char
b7a0: 20 2a 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20   **);....static 
b7b0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
b7c0: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74 73  torageDelete(Fts
b7d0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34  5Storage *p, i64
b7e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
b7f0: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  *);..static int 
b800: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b810: 67 65 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28  geContentInsert(
b820: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
b830: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c  sqlite3_value**,
b840: 20 69 36 34 2a 29 3b 0d 0a 73 74 61 74 69 63 20   i64*);..static 
b850: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
b860: 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65 72  torageIndexInser
b870: 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  t(Fts5Storage *p
b880: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
b890: 2a 2c 20 69 36 34 29 3b 0d 0a 0d 0a 73 74 61 74  *, i64);....stat
b8a0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
b8b0: 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69  s5StorageIntegri
b8c0: 74 79 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ty(Fts5Storage *
b8d0: 70 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  p);....static in
b8e0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
b8f0: 72 61 67 65 53 74 6d 74 28 46 74 73 35 53 74 6f  rageStmt(Fts5Sto
b900: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74  rage *p, int eSt
b910: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  mt, sqlite3_stmt
b920: 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 73 74  **, char**);..st
b930: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
b940: 33 46 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74  3Fts5StorageStmt
b950: 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 6f 72  Release(Fts5Stor
b960: 61 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d  age *p, int eStm
b970: 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  t, sqlite3_stmt*
b980: 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  );....static int
b990: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
b9a0: 61 67 65 44 6f 63 73 69 7a 65 28 46 74 73 35 53  ageDocsize(Fts5S
b9b0: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69  torage *p, i64 i
b9c0: 52 6f 77 69 64 2c 20 69 6e 74 20 2a 61 43 6f 6c  Rowid, int *aCol
b9d0: 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  );..static int s
b9e0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
b9f0: 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67  eSize(Fts5Storag
ba00: 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  e *p, int iCol, 
ba10: 69 36 34 20 2a 70 6e 41 76 67 29 3b 0d 0a 73 74  i64 *pnAvg);..st
ba20: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
ba30: 46 74 73 35 53 74 6f 72 61 67 65 52 6f 77 43 6f  Fts5StorageRowCo
ba40: 75 6e 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  unt(Fts5Storage 
ba50: 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 29 3b  *p, i64 *pnRow);
ba60: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
ba70: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
ba80: 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61 67  eSync(Fts5Storag
ba90: 65 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69  e *p);..static i
baa0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
bab0: 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74  orageRollback(Ft
bac0: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a  s5Storage *p);..
bad0: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
bae0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43  ite3Fts5StorageC
baf0: 6f 6e 66 69 67 56 61 6c 75 65 28 0d 0a 20 20 20  onfigValue(..   
bb00: 20 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c   Fts5Storage *p,
bb10: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71   const char*, sq
bb20: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e  lite3_value*, in
bb30: 74 0d 0a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  t..);....static 
bb40: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
bb50: 74 6f 72 61 67 65 44 65 6c 65 74 65 41 6c 6c 28  torageDeleteAll(
bb60: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b  Fts5Storage *p);
bb70: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
bb80: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
bb90: 65 62 75 69 6c 64 28 46 74 73 35 53 74 6f 72 61  ebuild(Fts5Stora
bba0: 67 65 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20  ge *p);..static 
bbb0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
bbc0: 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 46  torageOptimize(F
bbd0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d  ts5Storage *p);.
bbe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
bbf0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4d 65  te3Fts5StorageMe
bc00: 72 67 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  rge(Fts5Storage 
bc10: 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b  *p, int nMerge);
bc20: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
bc30: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
bc40: 65 73 65 74 28 46 74 73 35 53 74 6f 72 61 67 65  eset(Fts5Storage
bc50: 20 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20   *p);..../*..** 
bc60: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
bc70: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
bc80: 5f 73 74 6f 72 61 67 65 2e 63 2e 0d 0a 2a 2a 2a  _storage.c...***
bc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bcd0: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a  *******/....../*
bce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e  *********..** In
bd30: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
bd40: 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20  in fts5_expr.c. 
bd50: 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74  ..*/..typedef st
bd60: 72 75 63 74 20 46 74 73 35 45 78 70 72 20 46 74  ruct Fts5Expr Ft
bd70: 73 35 45 78 70 72 3b 0d 0a 74 79 70 65 64 65 66  s5Expr;..typedef
bd80: 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
bd90: 4e 6f 64 65 20 46 74 73 35 45 78 70 72 4e 6f 64  Node Fts5ExprNod
bda0: 65 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  e;..typedef stru
bdb0: 63 74 20 46 74 73 35 50 61 72 73 65 20 46 74 73  ct Fts5Parse Fts
bdc0: 35 50 61 72 73 65 3b 0d 0a 74 79 70 65 64 65 66  5Parse;..typedef
bdd0: 20 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65   struct Fts5Toke
bde0: 6e 20 46 74 73 35 54 6f 6b 65 6e 3b 0d 0a 74 79  n Fts5Token;..ty
bdf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
be00: 35 45 78 70 72 50 68 72 61 73 65 20 46 74 73 35  5ExprPhrase Fts5
be10: 45 78 70 72 50 68 72 61 73 65 3b 0d 0a 74 79 70  ExprPhrase;..typ
be20: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
be30: 45 78 70 72 4e 65 61 72 73 65 74 20 46 74 73 35  ExprNearset Fts5
be40: 45 78 70 72 4e 65 61 72 73 65 74 3b 0d 0a 0d 0a  ExprNearset;....
be50: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
be60: 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   {..  const char
be70: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
be80: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74        /* Token t
be90: 65 78 74 20 28 6e 6f 74 20 4e 55 4c 4c 20 74 65  ext (not NULL te
bea0: 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0d 0a 20 20  rminated) */..  
beb0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
bee0: 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  r p in bytes */.
bef0: 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 50 61 72 73 65 20  .};..../* Parse 
bf00: 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69  a MATCH expressi
bf10: 6f 6e 2e 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69  on. */..static i
bf20: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
bf30: 70 72 4e 65 77 28 0d 0a 20 20 46 74 73 35 43 6f  prNew(..  Fts5Co
bf40: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0d  nfig *pConfig, .
bf50: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 6e 20     /* Column on 
bf80: 4c 48 53 20 6f 66 20 4d 41 54 43 48 20 6f 70 65  LHS of MATCH ope
bf90: 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 63 6f 6e 73  rator */..  cons
bfa0: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 0d 0a  t char *zExpr,..
bfb0: 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e    Fts5Expr **ppN
bfc0: 65 77 2c 20 0d 0a 20 20 63 68 61 72 20 2a 2a 70  ew, ..  char **p
bfd0: 7a 45 72 72 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a  zErr..);..../*..
bfe0: 2a 2a 20 66 6f 72 28 72 63 20 3d 20 73 71 6c 69  ** for(rc = sqli
bff0: 74 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74  te3Fts5ExprFirst
c000: 28 70 45 78 70 72 2c 20 70 49 64 78 2c 20 62 44  (pExpr, pIdx, bD
c010: 65 73 63 29 3b 0d 0a 2a 2a 20 20 20 20 20 72 63  esc);..**     rc
c020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
c030: 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  ==sqlite3Fts5Exp
c040: 72 45 6f 66 28 70 45 78 70 72 29 3b 0d 0a 2a 2a  rEof(pExpr);..**
c050: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c060: 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 70 45  3Fts5ExprNext(pE
c070: 78 70 72 29 0d 0a 2a 2a 20 29 7b 0d 0a 2a 2a 20  xpr)..** ){..** 
c080: 20 20 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65 6e    // The documen
c090: 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f  t with rowid iRo
c0a0: 77 69 64 20 6d 61 74 63 68 65 73 20 74 68 65 20  wid matches the 
c0b0: 65 78 70 72 65 73 73 69 6f 6e 21 0d 0a 2a 2a 20  expression!..** 
c0c0: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73    i64 iRowid = s
c0d0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f  qlite3Fts5ExprRo
c0e0: 77 69 64 28 70 45 78 70 72 29 3b 0d 0a 2a 2a 20  wid(pExpr);..** 
c0f0: 7d 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  }..*/..static in
c100: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
c110: 72 46 69 72 73 74 28 46 74 73 35 45 78 70 72 2a  rFirst(Fts5Expr*
c120: 2c 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64  , Fts5Index *pId
c130: 78 2c 20 69 36 34 20 69 4d 69 6e 2c 20 69 6e 74  x, i64 iMin, int
c140: 20 62 44 65 73 63 29 3b 0d 0a 73 74 61 74 69 63   bDesc);..static
c150: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
c160: 45 78 70 72 4e 65 78 74 28 46 74 73 35 45 78 70  ExprNext(Fts5Exp
c170: 72 2a 2c 20 69 36 34 20 69 4d 61 78 29 3b 0d 0a  r*, i64 iMax);..
c180: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
c190: 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74  e3Fts5ExprEof(Ft
c1a0: 73 35 45 78 70 72 2a 29 3b 0d 0a 73 74 61 74 69  s5Expr*);..stati
c1b0: 63 20 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  c i64 sqlite3Fts
c1c0: 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35 45  5ExprRowid(Fts5E
c1d0: 78 70 72 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  xpr*);....static
c1e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
c1f0: 35 45 78 70 72 46 72 65 65 28 46 74 73 35 45 78  5ExprFree(Fts5Ex
c200: 70 72 2a 29 3b 0d 0a 0d 0a 2f 2a 20 43 61 6c 6c  pr*);..../* Call
c210: 65 64 20 64 75 72 69 6e 67 20 73 74 61 72 74 75  ed during startu
c220: 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 20  p to register a 
c230: 55 44 46 20 77 69 74 68 20 53 51 4c 69 74 65 20  UDF with SQLite 
c240: 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
c250: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 49 6e  qlite3Fts5ExprIn
c260: 69 74 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20  it(Fts5Global*, 
c270: 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 73 74  sqlite3*);....st
c280: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c290: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f  Fts5ExprPhraseCo
c2a0: 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29 3b 0d  unt(Fts5Expr*);.
c2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c2c0: 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
c2d0: 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 2a 2c  eSize(Fts5Expr*,
c2e0: 20 69 6e 74 20 69 50 68 72 61 73 65 29 3b 0d 0a   int iPhrase);..
c2f0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
c300: 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73  e3Fts5ExprPoslis
c310: 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  t(Fts5Expr*, int
c320: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29 3b 0d  , const u8 **);.
c330: 0a 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ...typedef struc
c340: 74 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70  t Fts5PoslistPop
c350: 75 6c 61 74 6f 72 20 46 74 73 35 50 6f 73 6c 69  ulator Fts5Posli
c360: 73 74 50 6f 70 75 6c 61 74 6f 72 3b 0d 0a 73 74  stPopulator;..st
c370: 61 74 69 63 20 46 74 73 35 50 6f 73 6c 69 73 74  atic Fts5Poslist
c380: 50 6f 70 75 6c 61 74 6f 72 20 2a 73 71 6c 69 74  Populator *sqlit
c390: 65 33 46 74 73 35 45 78 70 72 43 6c 65 61 72 50  e3Fts5ExprClearP
c3a0: 6f 73 6c 69 73 74 73 28 46 74 73 35 45 78 70 72  oslists(Fts5Expr
c3b0: 2a 2c 20 69 6e 74 29 3b 0d 0a 73 74 61 74 69 63  *, int);..static
c3c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
c3d0: 45 78 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c  ExprPopulatePosl
c3e0: 69 73 74 73 28 0d 0a 20 20 20 20 46 74 73 35 43  ists(..    Fts5C
c3f0: 6f 6e 66 69 67 2a 2c 20 46 74 73 35 45 78 70 72  onfig*, Fts5Expr
c400: 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  *, Fts5PoslistPo
c410: 70 75 6c 61 74 6f 72 2a 2c 20 69 6e 74 2c 20 63  pulator*, int, c
c420: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 0d  onst char*, int.
c430: 0a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .);..static void
c440: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
c450: 43 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 46 74  CheckPoslists(Ft
c460: 73 35 45 78 70 72 2a 2c 20 69 36 34 29 3b 0d 0a  s5Expr*, i64);..
c470: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
c480: 69 74 65 33 46 74 73 35 45 78 70 72 43 6c 6f 6e  ite3Fts5ExprClon
c490: 65 50 68 72 61 73 65 28 46 74 73 35 45 78 70 72  ePhrase(Fts5Expr
c4a0: 2a 2c 20 69 6e 74 2c 20 46 74 73 35 45 78 70 72  *, int, Fts5Expr
c4b0: 2a 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69  **);....static i
c4c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
c4d0: 70 72 50 68 72 61 73 65 43 6f 6c 6c 69 73 74 28  prPhraseCollist(
c4e0: 46 74 73 35 45 78 70 72 20 2a 2c 20 69 6e 74 2c  Fts5Expr *, int,
c4f0: 20 63 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69 6e   const u8 **, in
c500: 74 20 2a 29 3b 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  t *);..../******
c510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c530: 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 74  *****..** The ft
c540: 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20 61 62  s5_expr.c API ab
c550: 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ove this point i
c560: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 74  s used by the ot
c570: 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74 65 6e  her hand-written
c580: 0d 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20 74  ..** C code in t
c590: 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20  his module. The 
c5a0: 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f 77  interfaces below
c5b0: 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
c5c0: 63 61 6c 6c 65 64 20 62 79 0d 0a 2a 2a 20 74 68  called by..** th
c5d0: 65 20 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e  e parser code in
c5e0: 20 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a   fts5parse.y.  *
c5f0: 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  /....static void
c600: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
c610: 65 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65  eError(Fts5Parse
c620: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
c630: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
c640: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35  ;....static Fts5
c650: 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65  ExprNode *sqlite
c660: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0d  3Fts5ParseNode(.
c670: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
c680: 61 72 73 65 2c 0d 0a 20 20 69 6e 74 20 65 54 79  arse,..  int eTy
c690: 70 65 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  pe,..  Fts5ExprN
c6a0: 6f 64 65 20 2a 70 4c 65 66 74 2c 0d 0a 20 20 46  ode *pLeft,..  F
c6b0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 69  ts5ExprNode *pRi
c6c0: 67 68 74 2c 0d 0a 20 20 46 74 73 35 45 78 70 72  ght,..  Fts5Expr
c6d0: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 0d 0a  Nearset *pNear..
c6e0: 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73  );....static Fts
c6f0: 35 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74  5ExprNode *sqlit
c700: 65 33 46 74 73 35 50 61 72 73 65 49 6d 70 6c 69  e3Fts5ParseImpli
c710: 63 69 74 41 6e 64 28 0d 0a 20 20 46 74 73 35 50  citAnd(..  Fts5P
c720: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0d 0a 20  arse *pParse,.. 
c730: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
c740: 4c 65 66 74 2c 0d 0a 20 20 46 74 73 35 45 78 70  Left,..  Fts5Exp
c750: 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 0d 0a 29  rNode *pRight..)
c760: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35  ;....static Fts5
c770: 45 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69  ExprPhrase *sqli
c780: 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72 6d  te3Fts5ParseTerm
c790: 28 0d 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  (..  Fts5Parse *
c7a0: 70 50 61 72 73 65 2c 20 0d 0a 20 20 46 74 73 35  pParse, ..  Fts5
c7b0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
c7c0: 61 73 65 2c 20 0d 0a 20 20 46 74 73 35 54 6f 6b  ase, ..  Fts5Tok
c7d0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 0d 0a 20 20 69  en *pToken,..  i
c7e0: 6e 74 20 62 50 72 65 66 69 78 0d 0a 29 3b 0d 0a  nt bPrefix..);..
c7f0: 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
c800: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65  lite3Fts5ParseSe
c810: 74 43 61 72 65 74 28 46 74 73 35 45 78 70 72 50  tCaret(Fts5ExprP
c820: 68 72 61 73 65 2a 29 3b 0d 0a 0d 0a 73 74 61 74  hrase*);....stat
c830: 69 63 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ic Fts5ExprNears
c840: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
c850: 61 72 73 65 4e 65 61 72 73 65 74 28 0d 0a 20 20  arseNearset(..  
c860: 46 74 73 35 50 61 72 73 65 2a 2c 20 0d 0a 20 20  Fts5Parse*, ..  
c870: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a  Fts5ExprNearset*
c880: 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  ,..  Fts5ExprPhr
c890: 61 73 65 2a 20 0d 0a 29 3b 0d 0a 0d 0a 73 74 61  ase* ..);....sta
c8a0: 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  tic Fts5Colset *
c8b0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
c8c0: 43 6f 6c 73 65 74 28 0d 0a 20 20 46 74 73 35 50  Colset(..  Fts5P
c8d0: 61 72 73 65 2a 2c 20 0d 0a 20 20 46 74 73 35 43  arse*, ..  Fts5C
c8e0: 6f 6c 73 65 74 2a 2c 20 0d 0a 20 20 46 74 73 35  olset*, ..  Fts5
c8f0: 54 6f 6b 65 6e 20 2a 0d 0a 29 3b 0d 0a 0d 0a 73  Token *..);....s
c900: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
c910: 65 33 46 74 73 35 50 61 72 73 65 50 68 72 61 73  e3Fts5ParsePhras
c920: 65 46 72 65 65 28 46 74 73 35 45 78 70 72 50 68  eFree(Fts5ExprPh
c930: 72 61 73 65 2a 29 3b 0d 0a 73 74 61 74 69 63 20  rase*);..static 
c940: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
c950: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
c960: 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
c970: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  *);..static void
c980: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
c990: 65 4e 6f 64 65 46 72 65 65 28 46 74 73 35 45 78  eNodeFree(Fts5Ex
c9a0: 70 72 4e 6f 64 65 2a 29 3b 0d 0a 0d 0a 73 74 61  prNode*);....sta
c9b0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
c9c0: 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73 74  Fts5ParseSetDist
c9d0: 61 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c  ance(Fts5Parse*,
c9e0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
c9f0: 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0d  *, Fts5Token*);.
ca00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
ca10: 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
ca20: 43 6f 6c 73 65 74 28 46 74 73 35 50 61 72 73 65  Colset(Fts5Parse
ca30: 2a 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  *, Fts5ExprNode*
ca40: 2c 20 46 74 73 35 43 6f 6c 73 65 74 2a 29 3b 0d  , Fts5Colset*);.
ca50: 0a 73 74 61 74 69 63 20 46 74 73 35 43 6f 6c 73  .static Fts5Cols
ca60: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
ca70: 61 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74  arseColsetInvert
ca80: 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73  (Fts5Parse*, Fts
ca90: 35 43 6f 6c 73 65 74 2a 29 3b 0d 0a 73 74 61 74  5Colset*);..stat
caa0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
cab0: 74 73 35 50 61 72 73 65 46 69 6e 69 73 68 65 64  ts5ParseFinished
cac0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
cad0: 73 65 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  se, Fts5ExprNode
cae0: 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f   *p);..static vo
caf0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
cb00: 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72 73  rseNear(Fts5Pars
cb10: 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54  e *pParse, Fts5T
cb20: 6f 6b 65 6e 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  oken*);..../*..*
cb30: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
cb40: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
cb50: 73 35 5f 65 78 70 72 2e 63 2e 0d 0a 2a 2a 2a 2a  s5_expr.c...****
cb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cba0: 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f  ******/......../
cbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49  **********..** I
cc00: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
cc10: 20 69 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 20   in fts5_aux.c. 
cc20: 0d 0a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ..*/....static i
cc30: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 41 75  nt sqlite3Fts5Au
cc40: 78 49 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29  xInit(fts5_api*)
cc50: 3b 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66  ;../*..** End of
cc60: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   interface to co
cc70: 64 65 20 69 6e 20 66 74 73 35 5f 61 75 78 2e 63  de in fts5_aux.c
cc80: 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...*************
cc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ccb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ccc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
ccd0: 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
cce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ccf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a  *************..*
cd20: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
cd30: 6f 64 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b 65  ode in fts5_toke
cd40: 6e 69 7a 65 72 2e 63 2e 20 0d 0a 2a 2f 0d 0a 0d  nizer.c. ..*/...
cd50: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
cd60: 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  te3Fts5Tokenizer
cd70: 49 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b  Init(fts5_api*);
cd80: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20  ../*..** End of 
cd90: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
cda0: 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b 65 6e 69  e in fts5_tokeni
cdb0: 7a 65 72 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  zer.c...********
cdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce00: 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  **/..../********
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce50: 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  **..** Interface
ce60: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
ce70: 5f 76 6f 63 61 62 2e 63 2e 20 0d 0a 2a 2f 0d 0a  _vocab.c. ..*/..
ce80: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
ce90: 69 74 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69  ite3Fts5VocabIni
cea0: 74 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73  t(Fts5Global*, s
ceb0: 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 2f 2a 0d  qlite3*);..../*.
cec0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
ced0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
cee0: 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 0d 0a 2a  fts5_vocab.c...*
cef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a  *********/......
cf40: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
cf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20  ***********..** 
cf90: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 61 75 74  Interface to aut
cfa0: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
cfb0: 61 74 65 64 20 63 6f 64 65 20 69 6e 20 66 74 73  ated code in fts
cfc0: 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 20 0d 0a  5_unicode2.c. ..
cfd0: 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
cfe0: 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
cff0: 65 49 73 64 69 61 63 72 69 74 69 63 28 69 6e 74  eIsdiacritic(int
d000: 20 63 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74   c);..static int
d010: 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63   sqlite3Fts5Unic
d020: 6f 64 65 46 6f 6c 64 28 69 6e 74 20 63 2c 20 69  odeFold(int c, i
d030: 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69  nt bRemoveDiacri
d040: 74 69 63 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  tic);....static 
d050: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55  int sqlite3Fts5U
d060: 6e 69 63 6f 64 65 43 61 74 50 61 72 73 65 28 63  nicodeCatParse(c
d070: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 75 38 2a 29  onst char*, u8*)
d080: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
d090: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
d0a0: 43 61 74 65 67 6f 72 79 28 69 6e 74 20 69 43 6f  Category(int iCo
d0b0: 64 65 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69  de);..static voi
d0c0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  d sqlite3Fts5Uni
d0d0: 63 6f 64 65 41 73 63 69 69 28 75 38 2a 2c 20 75  codeAscii(u8*, u
d0e0: 38 2a 29 3b 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64  8*);../*..** End
d0f0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
d100: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75 6e   code in fts5_un
d110: 69 63 6f 64 65 32 2e 63 2e 0d 0a 2a 2a 2a 2a 2a  icode2.c...*****
d120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d160: 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 23 65 6e 64 69 66  *****/....#endif
d170: 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73  ....#line 1 "fts
d180: 35 70 61 72 73 65 2e 68 22 0d 0a 23 64 65 66 69  5parse.h"..#defi
d190: 6e 65 20 46 54 53 35 5f 4f 52 20 20 20 20 20 20  ne FTS5_OR      
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 31 0d 0a 23 64 65 66           1..#def
d1c0: 69 6e 65 20 46 54 53 35 5f 41 4e 44 20 20 20 20  ine FTS5_AND    
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 32 0d 0a 23 64 65            2..#de
d1f0: 66 69 6e 65 20 46 54 53 35 5f 4e 4f 54 20 20 20  fine FTS5_NOT   
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 20 20 20 20 20 20 33 0d 0a 23 64             3..#d
d220: 65 66 69 6e 65 20 46 54 53 35 5f 54 45 52 4d 20  efine FTS5_TERM 
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 34 0d 0a 23              4..#
d250: 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 4c 4f  define FTS5_COLO
d260: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0d 0a               5..
d280: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e  #define FTS5_MIN
d290: 55 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  US              
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 0d                6.
d2b0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 43  .#define FTS5_LC
d2c0: 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P               
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37                 7
d2e0: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52  ..#define FTS5_R
d2f0: 43 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  CP              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 38 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  8..#define FTS5_
d320: 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 20 20  STRING          
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 39 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35   9..#define FTS5
d350: 5f 4c 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _LP             
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 31 30 0d 0a 23 64 65 66 69 6e 65 20 46 54 53   10..#define FTS
d380: 35 5f 52 50 20 20 20 20 20 20 20 20 20 20 20 20  5_RP            
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 31 31 0d 0a 23 64 65 66 69 6e 65 20 46 54    11..#define FT
d3b0: 53 35 5f 43 41 52 45 54 20 20 20 20 20 20 20 20  S5_CARET        
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 31 32 0d 0a 23 64 65 66 69 6e 65 20 46     12..#define F
d3e0: 54 53 35 5f 43 4f 4d 4d 41 20 20 20 20 20 20 20  TS5_COMMA       
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 31 33 0d 0a 23 64 65 66 69 6e 65 20      13..#define 
d410: 46 54 53 35 5f 50 4c 55 53 20 20 20 20 20 20 20  FTS5_PLUS       
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 31 34 0d 0a 23 64 65 66 69 6e 65       14..#define
d440: 20 46 54 53 35 5f 53 54 41 52 20 20 20 20 20 20   FTS5_STAR      
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 31 35 0d 0a 0d 0a 23 6c 69 6e        15....#lin
d470: 65 20 31 20 22 66 74 73 35 70 61 72 73 65 2e 63  e 1 "fts5parse.c
d480: 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 30 2d 30  "../*..** 2000-0
d490: 35 2d 32 39 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  5-29..**..** The
d4a0: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
d4b0: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
d4c0: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
d4d0: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a    In place of..*
d4e0: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
d4f0: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
d500: 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  sing:..**..**   
d510: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
d520: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a   and not evil...
d530: 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  **    May you fi
d540: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
d550: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
d560: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d  forgive others..
d570: 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73  .**    May you s
d580: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
d590: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
d5a0: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a  han you give...*
d5b0: 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *..*************
d5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a  ************..**
d600: 20 44 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65   Driver template
d610: 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
d620: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
d630: 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 22 6c 65  ..**..** The "le
d640: 6d 6f 6e 22 20 70 72 6f 67 72 61 6d 20 70 72 6f  mon" program pro
d650: 63 65 73 73 65 73 20 61 6e 20 4c 41 4c 52 28 31  cesses an LALR(1
d660: 29 20 69 6e 70 75 74 20 67 72 61 6d 6d 61 72 20  ) input grammar 
d670: 66 69 6c 65 2c 20 74 68 65 6e 20 75 73 65 73 0d  file, then uses.
d680: 0a 2a 2a 20 74 68 69 73 20 74 65 6d 70 6c 61 74  .** this templat
d690: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  e to construct a
d6a0: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 22 6c   parser.  The "l
d6b0: 65 6d 6f 6e 22 20 70 72 6f 67 72 61 6d 20 69 6e  emon" program in
d6c0: 73 65 72 74 73 20 74 65 78 74 0d 0a 2a 2a 20 61  serts text..** a
d6d0: 74 20 65 61 63 68 20 22 25 25 22 20 6c 69 6e 65  t each "%%" line
d6e0: 2e 20 20 41 6c 73 6f 2c 20 61 6e 79 20 22 50 2d  .  Also, any "P-
d6f0: 61 2d 72 2d 73 2d 65 22 20 69 64 65 6e 74 69 66  a-r-s-e" identif
d700: 65 72 20 70 72 65 66 69 78 20 28 77 69 74 68 6f  er prefix (witho
d710: 75 74 20 74 68 65 0d 0a 2a 2a 20 69 6e 74 65 72  ut the..** inter
d720: 73 74 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  stitial "-" char
d730: 61 63 74 65 72 73 29 20 63 6f 6e 74 61 69 6e 65  acters) containe
d740: 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6c 61  d in this templa
d750: 74 65 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  te is changed in
d760: 74 6f 0d 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  to..** the value
d770: 20 6f 66 20 74 68 65 20 25 6e 61 6d 65 20 64 69   of the %name di
d780: 72 65 63 74 69 76 65 20 66 72 6f 6d 20 74 68 65  rective from the
d790: 20 67 72 61 6d 6d 61 72 2e 20 20 4f 74 68 65 72   grammar.  Other
d7a0: 77 69 73 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e  wise, the conten
d7b0: 74 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 74 65  t..** of this te
d7c0: 6d 70 6c 61 74 65 20 69 73 20 63 6f 70 69 65 64  mplate is copied
d7d0: 20 73 74 72 61 69 67 68 74 20 74 68 72 6f 75 67   straight throug
d7e0: 68 20 69 6e 74 6f 20 74 68 65 20 67 65 6e 65 72  h into the gener
d7f0: 61 74 65 20 70 61 72 73 65 72 0d 0a 2a 2a 20 73  ate parser..** s
d800: 6f 75 72 63 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d  ource file...**.
d810: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
d820: 67 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65  g is the concate
d830: 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 25 69  nation of all %i
d840: 6e 63 6c 75 64 65 20 64 69 72 65 63 74 69 76 65  nclude directive
d850: 73 20 66 72 6f 6d 20 74 68 65 0d 0a 2a 2a 20 69  s from the..** i
d860: 6e 70 75 74 20 67 72 61 6d 6d 61 72 20 66 69 6c  nput grammar fil
d870: 65 3a 0d 0a 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65  e:..*/..#include
d880: 20 3c 73 74 64 69 6f 2e 68 3e 0d 0a 23 69 6e 63   <stdio.h>..#inc
d890: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0d  lude <assert.h>.
d8a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ./************ B
d8b0: 65 67 69 6e 20 25 69 6e 63 6c 75 64 65 20 73 65  egin %include se
d8c0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20  ctions from the 
d8d0: 67 72 61 6d 6d 61 72 20 2a 2a 2a 2a 2a 2a 2a 2a  grammar ********
d8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d8f0: 2f 0d 0a 23 6c 69 6e 65 20 34 37 20 22 66 74 73  /..#line 47 "fts
d900: 35 70 61 72 73 65 2e 79 22 0d 0a 0d 0a 2f 2a 20  5parse.y"..../* 
d910: 23 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e  #include "fts5In
d920: 74 2e 68 22 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63  t.h" */../* #inc
d930: 6c 75 64 65 20 22 66 74 73 35 70 61 72 73 65 2e  lude "fts5parse.
d940: 68 22 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  h" */..../*..** 
d950: 44 69 73 61 62 6c 65 20 61 6c 6c 20 65 72 72 6f  Disable all erro
d960: 72 20 72 65 63 6f 76 65 72 79 20 70 72 6f 63 65  r recovery proce
d970: 73 73 69 6e 67 20 69 6e 20 74 68 65 20 70 61 72  ssing in the par
d980: 73 65 72 20 70 75 73 68 2d 64 6f 77 6e 0d 0a 2a  ser push-down..*
d990: 2a 20 61 75 74 6f 6d 61 74 6f 6e 2e 0d 0a 2a 2f  * automaton...*/
d9a0: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59  ..#define fts5YY
d9b0: 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 20  NOERRORRECOVERY 
d9c0: 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65  1..../*..** Make
d9d0: 20 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28   fts5yytestcase(
d9e0: 29 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 65  ) the same as te
d9f0: 73 74 63 61 73 65 28 29 0d 0a 2a 2f 0d 0a 23 64  stcase()..*/..#d
da00: 65 66 69 6e 65 20 66 74 73 35 79 79 74 65 73 74  efine fts5yytest
da10: 63 61 73 65 28 58 29 20 74 65 73 74 63 61 73 65  case(X) testcase
da20: 28 58 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e  (X)..../*..** In
da30: 64 69 63 61 74 65 20 74 68 61 74 20 73 71 6c 69  dicate that sqli
da40: 74 65 33 50 61 72 73 65 72 46 72 65 65 28 29 20  te3ParserFree() 
da50: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61  will never be ca
da60: 6c 6c 65 64 20 77 69 74 68 20 61 20 6e 75 6c 6c  lled with a null
da70: 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a  ..** pointer...*
da80: 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  /..#define fts5Y
da90: 59 50 41 52 53 45 46 52 45 45 4e 4f 54 4e 55 4c  YPARSEFREENOTNUL
daa0: 4c 20 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c  L 1..../*..** Al
dab0: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 74 79  ternative dataty
dac0: 70 65 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d  pe for the argum
dad0: 65 6e 74 20 74 6f 20 74 68 65 20 6d 61 6c 6c 6f  ent to the mallo
dae0: 63 28 29 20 72 6f 75 74 69 6e 65 20 70 61 73 73  c() routine pass
daf0: 65 64 0d 0a 2a 2a 20 69 6e 74 6f 20 73 71 6c 69  ed..** into sqli
db00: 74 65 33 50 61 72 73 65 72 41 6c 6c 6f 63 28 29  te3ParserAlloc()
db10: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
db20: 73 20 73 69 7a 65 5f 74 2e 0d 0a 2a 2f 0d 0a 23  s size_t...*/..#
db30: 64 65 66 69 6e 65 20 66 74 73 35 59 59 4d 41 4c  define fts5YYMAL
db40: 4c 4f 43 41 52 47 54 59 50 45 20 20 75 36 34 0d  LOCARGTYPE  u64.
db50: 0a 0d 0a 23 6c 69 6e 65 20 35 37 20 22 66 74 73  ...#line 57 "fts
db60: 35 70 61 72 73 65 2e 63 22 0d 0a 2f 2a 2a 2a 2a  5parse.c"../****
db70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
db80: 20 6f 66 20 25 69 6e 63 6c 75 64 65 20 64 69 72   of %include dir
db90: 65 63 74 69 76 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a  ectives ********
dba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 20  **********/../* 
dbc0: 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20  These constants 
dbd0: 73 70 65 63 69 66 79 20 74 68 65 20 76 61 72 69  specify the vari
dbe0: 6f 75 73 20 6e 75 6d 65 72 69 63 20 76 61 6c 75  ous numeric valu
dbf0: 65 73 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20  es for terminal 
dc00: 73 79 6d 62 6f 6c 73 0d 0a 2a 2a 20 69 6e 20 61  symbols..** in a
dc10: 20 66 6f 72 6d 61 74 20 75 6e 64 65 72 73 74 61   format understa
dc20: 6e 64 61 62 6c 65 20 74 6f 20 22 6d 61 6b 65 68  ndable to "makeh
dc30: 65 61 64 65 72 73 22 2e 20 20 54 68 69 73 20 73  eaders".  This s
dc40: 65 63 74 69 6f 6e 20 69 73 20 62 6c 61 6e 6b 20  ection is blank 
dc50: 75 6e 6c 65 73 73 0d 0a 2a 2a 20 22 6c 65 6d 6f  unless..** "lemo
dc60: 6e 22 20 69 73 20 72 75 6e 20 77 69 74 68 20 74  n" is run with t
dc70: 68 65 20 22 2d 6d 22 20 63 6f 6d 6d 61 6e 64 2d  he "-m" command-
dc80: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0d 0a 2a 2a  line option...**
dc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
dca0: 42 65 67 69 6e 20 6d 61 6b 65 68 65 61 64 65 72  Begin makeheader
dcb0: 73 20 74 6f 6b 65 6e 20 64 65 66 69 6e 69 74 69  s token definiti
dcc0: 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons ************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
dce0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
dcf0: 2a 20 45 6e 64 20 6d 61 6b 65 68 65 61 64 65 72  * End makeheader
dd00: 73 20 74 6f 6b 65 6e 20 64 65 66 69 6e 69 74 69  s token definiti
dd10: 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons ************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
dd30: 0d 0a 0d 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..../* The next 
dd40: 73 65 63 74 69 6f 6e 73 20 69 73 20 61 20 73 65  sections is a se
dd50: 72 69 65 73 20 6f 66 20 63 6f 6e 74 72 6f 6c 20  ries of control 
dd60: 23 64 65 66 69 6e 65 73 2e 0d 0a 2a 2a 20 76 61  #defines...** va
dd70: 72 69 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66  rious aspects of
dd80: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
dd90: 61 72 73 65 72 2e 0d 0a 2a 2a 20 20 20 20 66 74  arser...**    ft
dda0: 73 35 59 59 43 4f 44 45 54 59 50 45 20 20 20 20  s5YYCODETYPE    
ddb0: 20 20 20 20 20 69 73 20 74 68 65 20 64 61 74 61       is the data
ddc0: 20 74 79 70 65 20 75 73 65 64 20 74 6f 20 73 74   type used to st
ddd0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ore the integer 
dde0: 63 6f 64 65 73 0d 0a 2a 2a 20 20 20 20 20 20 20  codes..**       
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 74  that represent t
de10: 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 2d  erminal and non-
de20: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
de30: 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
de40: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 73              "uns
de50: 69 67 6e 65 64 20 63 68 61 72 22 20 69 73 20 75  igned char" is u
de60: 73 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  sed if there are
de70: 20 66 65 77 65 72 20 74 68 61 6e 0d 0a 2a 2a 20   fewer than..** 
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 20 32 35 36 20 73 79 6d 62 6f 6c        256 symbol
dea0: 73 2e 20 20 4c 61 72 67 65 72 20 74 79 70 65 73  s.  Larger types
deb0: 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 20   otherwise...** 
dec0: 20 20 20 66 74 73 35 59 59 4e 4f 43 4f 44 45 20     fts5YYNOCODE 
ded0: 20 20 20 20 20 20 20 20 20 20 69 73 20 61 20 6e            is a n
dee0: 75 6d 62 65 72 20 6f 66 20 74 79 70 65 20 66 74  umber of type ft
def0: 73 35 59 59 43 4f 44 45 54 59 50 45 20 74 68 61  s5YYCODETYPE tha
df00: 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
df10: 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r..**           
df20: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
df30: 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
df40: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 2e 0d  erminal symbol..
df50: 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 46 41 4c  .**    fts5YYFAL
df60: 4c 42 41 43 4b 20 20 20 20 20 20 20 20 20 49 66  LBACK         If
df70: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 69   defined, this i
df80: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e  ndicates that on
df90: 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73  e or more tokens
dfa0: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
dfb0: 20 20 20 20 20 20 20 20 20 20 20 28 61 6c 73 6f             (also
dfc0: 20 6b 6e 6f 77 6e 20 61 73 3a 20 22 74 65 72 6d   known as: "term
dfd0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 29 20 68  inal symbols") h
dfe0: 61 76 65 20 66 61 6c 6c 2d 62 61 63 6b 0d 0a 2a  ave fall-back..*
dff0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e000: 20 20 20 20 20 20 20 20 76 61 6c 75 65 73 20 77          values w
e010: 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 75  hich should be u
e020: 73 65 64 20 69 66 20 74 68 65 20 6f 72 69 67 69  sed if the origi
e030: 6e 61 6c 20 73 79 6d 62 6f 6c 0d 0a 2a 2a 20 20  nal symbol..**  
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 20 77 6f 75 6c 64 20 6e 6f 74 20 70       would not p
e060: 61 72 73 65 2e 20 20 54 68 69 73 20 70 65 72 6d  arse.  This perm
e070: 69 74 73 20 6b 65 79 77 6f 72 64 73 20 74 6f 20  its keywords to 
e080: 73 6f 6d 65 74 69 6d 65 73 0d 0a 2a 2a 20 20 20  sometimes..**   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 62 65 20 75 73 65 64 20 61 73 20 69      be used as i
e0b0: 64 65 6e 74 69 66 69 65 72 73 2c 20 66 6f 72 20  dentifiers, for 
e0c0: 65 78 61 6d 70 6c 65 2e 0d 0a 2a 2a 20 20 20 20  example...**    
e0d0: 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45  fts5YYACTIONTYPE
e0e0: 20 20 20 20 20 20 20 69 73 20 74 68 65 20 64 61         is the da
e0f0: 74 61 20 74 79 70 65 20 75 73 65 64 20 66 6f 72  ta type used for
e100: 20 22 61 63 74 69 6f 6e 20 63 6f 64 65 73 22 20   "action codes" 
e110: 2d 20 6e 75 6d 62 65 72 73 0d 0a 2a 2a 20 20 20  - numbers..**   
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 74 68 61 74 20 69 6e 64 69 63 61 74      that indicat
e140: 65 20 77 68 61 74 20 74 6f 20 64 6f 20 69 6e 20  e what to do in 
e150: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20  response to the 
e160: 6e 65 78 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20  next..**        
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e180: 6f 6b 65 6e 2e 0d 0a 2a 2a 20 20 20 20 73 71 6c  oken...**    sql
e190: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 54  ite3Fts5ParserFT
e1a0: 53 35 54 4f 4b 45 4e 54 59 50 45 20 20 20 20 20  S5TOKENTYPE     
e1b0: 69 73 20 74 68 65 20 64 61 74 61 20 74 79 70 65  is the data type
e1c0: 20 75 73 65 64 20 66 6f 72 20 6d 69 6e 6f 72 20   used for minor 
e1d0: 74 79 70 65 20 66 6f 72 20 74 65 72 6d 69 6e 61  type for termina
e1e0: 6c 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  l..**           
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6d 62              symb
e200: 6f 6c 73 2e 20 20 42 61 63 6b 67 72 6f 75 6e 64  ols.  Background
e210: 3a 20 41 20 22 6d 69 6e 6f 72 20 74 79 70 65 22  : A "minor type"
e220: 20 69 73 20 61 20 73 65 6d 61 6e 74 69 63 0d 0a   is a semantic..
e230: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e240: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 61           value a
e250: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
e260: 20 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e   terminal or non
e270: 2d 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 20 20  -terminal..**   
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 73 79 6d 62 6f 6c 73 2e 20 20 46 6f      symbols.  Fo
e2a0: 72 20 65 78 61 6d 70 6c 65 2c 20 66 6f 72 20 61  r example, for a
e2b0: 6e 20 22 49 44 22 20 74 65 72 6d 69 6e 61 6c 20  n "ID" terminal 
e2c0: 73 79 6d 62 6f 6c 2c 0d 0a 2a 2a 20 20 20 20 20  symbol,..**     
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 74 68 65 20 6d 69 6e 6f 72 20 74 79 70 65    the minor type
e2f0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 6e 61   might be the na
e300: 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  me of the identi
e310: 66 69 65 72 2e 0d 0a 2a 2a 20 20 20 20 20 20 20  fier...**       
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 45 61 63 68 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  Each non-termina
e340: 6c 20 63 61 6e 20 68 61 76 65 20 61 20 64 69 66  l can have a dif
e350: 66 65 72 65 6e 74 20 6d 69 6e 6f 72 20 74 79 70  ferent minor typ
e360: 65 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e...**          
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65 72               Ter
e380: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 61 6c  minal symbols al
e390: 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
e3a0: 6d 69 6e 6f 72 20 74 79 70 65 2c 20 74 68 6f 75  minor type, thou
e3b0: 67 68 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  gh...**         
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
e3d0: 69 73 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  is macros define
e3e0: 73 20 74 68 65 20 6d 69 6e 6f 72 20 74 79 70 65  s the minor type
e3f0: 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 0d 0a   for terminal ..
e400: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e410: 20 20 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 73           symbols
e420: 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 4d  ...**    fts5YYM
e430: 49 4e 4f 52 54 59 50 45 20 20 20 20 20 20 20 20  INORTYPE        
e440: 69 73 20 74 68 65 20 64 61 74 61 20 74 79 70 65  is the data type
e450: 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 6d 69   used for all mi
e460: 6e 6f 72 20 74 79 70 65 73 2e 0d 0a 2a 2a 20 20  nor types...**  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 54 68 69 73 20 69 73 20 74 79 70       This is typ
e490: 69 63 61 6c 6c 79 20 61 20 75 6e 69 6f 6e 20 6f  ically a union o
e4a0: 66 20 6d 61 6e 79 20 74 79 70 65 73 2c 20 6f 6e  f many types, on
e4b0: 65 20 6f 66 0d 0a 2a 2a 20 20 20 20 20 20 20 20  e of..**        
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
e4d0: 68 69 63 68 20 69 73 20 73 71 6c 69 74 65 33 46  hich is sqlite3F
e4e0: 74 73 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b  ts5ParserFTS5TOK
e4f0: 45 4e 54 59 50 45 2e 20 20 54 68 65 20 65 6e 74  ENTYPE.  The ent
e500: 72 79 20 69 6e 20 74 68 65 20 75 6e 69 6f 6e 0d  ry in the union.
e510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e520: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
e530: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69  rminal symbols i
e540: 73 20 63 61 6c 6c 65 64 20 22 66 74 73 35 79 79  s called "fts5yy
e550: 30 22 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59  0"...**    fts5Y
e560: 59 53 54 41 43 4b 44 45 50 54 48 20 20 20 20 20  YSTACKDEPTH     
e570: 20 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d    is the maximum
e580: 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 70 61   depth of the pa
e590: 72 73 65 72 27 73 20 73 74 61 63 6b 2e 20 20 49  rser's stack.  I
e5a0: 66 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  f..**           
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 65 72 6f              zero
e5c0: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 64 79   the stack is dy
e5d0: 6e 61 6d 69 63 61 6c 6c 79 20 73 69 7a 65 64 20  namically sized 
e5e0: 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 0d  using realloc().
e5f0: 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 46 74  .**    sqlite3Ft
e600: 73 35 50 61 72 73 65 72 41 52 47 5f 53 44 45 43  s5ParserARG_SDEC
e610: 4c 20 20 20 20 20 41 20 73 74 61 74 69 63 20 76  L     A static v
e620: 61 72 69 61 62 6c 65 20 64 65 63 6c 61 72 61 74  ariable declarat
e630: 69 6f 6e 20 66 6f 72 20 74 68 65 20 25 65 78 74  ion for the %ext
e640: 72 61 5f 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20  ra_argument..** 
e650: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
e660: 72 73 65 72 41 52 47 5f 50 44 45 43 4c 20 20 20  rserARG_PDECL   
e670: 20 20 41 20 70 61 72 61 6d 65 74 65 72 20 64 65    A parameter de
e680: 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68  claration for th
e690: 65 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  e %extra_argumen
e6a0: 74 0d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t..**    sqlite3
e6b0: 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 50 41  Fts5ParserARG_PA
e6c0: 52 41 4d 20 20 20 20 20 43 6f 64 65 20 74 6f 20  RAM     Code to 
e6d0: 70 61 73 73 20 25 65 78 74 72 61 5f 61 72 67 75  pass %extra_argu
e6e0: 6d 65 6e 74 20 61 73 20 61 20 73 75 62 72 6f 75  ment as a subrou
e6f0: 74 69 6e 65 20 70 61 72 61 6d 65 74 65 72 0d 0a  tine parameter..
e700: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  **    sqlite3Fts
e710: 35 50 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45  5ParserARG_STORE
e720: 20 20 20 20 20 43 6f 64 65 20 74 6f 20 73 74 6f       Code to sto
e730: 72 65 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65  re %extra_argume
e740: 6e 74 20 69 6e 74 6f 20 66 74 73 35 79 79 70 50  nt into fts5yypP
e750: 61 72 73 65 72 0d 0a 2a 2a 20 20 20 20 73 71 6c  arser..**    sql
e760: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52  ite3Fts5ParserAR
e770: 47 5f 46 45 54 43 48 20 20 20 20 20 43 6f 64 65  G_FETCH     Code
e780: 20 74 6f 20 65 78 74 72 61 63 74 20 25 65 78 74   to extract %ext
e790: 72 61 5f 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d  ra_argument from
e7a0: 20 66 74 73 35 79 79 70 50 61 72 73 65 72 0d 0a   fts5yypParser..
e7b0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  **    sqlite3Fts
e7c0: 35 50 61 72 73 65 72 43 54 58 5f 2a 20 20 20 20  5ParserCTX_*    
e7d0: 20 20 20 20 20 41 73 20 73 71 6c 69 74 65 33 46       As sqlite3F
e7e0: 74 73 35 50 61 72 73 65 72 41 52 47 5f 20 65 78  ts5ParserARG_ ex
e7f0: 63 65 70 74 20 66 6f 72 20 25 65 78 74 72 61 5f  cept for %extra_
e800: 63 6f 6e 74 65 78 74 0d 0a 2a 2a 20 20 20 20 66  context..**    f
e810: 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ts5YYERRORSYMBOL
e820: 20 20 20 20 20 20 69 73 20 74 68 65 20 63 6f 64        is the cod
e830: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
e840: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 2e 20 20 49  error symbol.  I
e850: 66 20 6e 6f 74 0d 0a 2a 2a 20 20 20 20 20 20 20  f not..**       
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f  defined, then do
e880: 20 6e 6f 20 65 72 72 6f 72 20 70 72 6f 63 65 73   no error proces
e890: 73 69 6e 67 2e 0d 0a 2a 2a 20 20 20 20 66 74 73  sing...**    fts
e8a0: 35 59 59 4e 53 54 41 54 45 20 20 20 20 20 20 20  5YYNSTATE       
e8b0: 20 20 20 20 74 68 65 20 63 6f 6d 62 69 6e 65 64      the combined
e8c0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   number of state
e8d0: 73 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59  s...**    fts5YY
e8e0: 4e 52 55 4c 45 20 20 20 20 20 20 20 20 20 20 20  NRULE           
e8f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e900: 75 6c 65 73 20 69 6e 20 74 68 65 20 67 72 61 6d  ules in the gram
e910: 6d 61 72 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59  mar..**    fts5Y
e920: 59 4e 46 54 53 35 54 4f 4b 45 4e 20 20 20 20 20  YNFTS5TOKEN     
e930: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
e940: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
e950: 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 4d  ..**    fts5YY_M
e960: 41 58 5f 53 48 49 46 54 20 20 20 20 20 20 20 4d  AX_SHIFT       M
e970: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f 72  aximum value for
e980: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 73 0d 0a   shift actions..
e990: 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 4d 49 4e  **    fts5YY_MIN
e9a0: 5f 53 48 49 46 54 52 45 44 55 43 45 20 4d 69 6e  _SHIFTREDUCE Min
e9b0: 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 73  imum value for s
e9c0: 68 69 66 74 2d 72 65 64 75 63 65 20 61 63 74 69  hift-reduce acti
e9d0: 6f 6e 73 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59  ons..**    fts5Y
e9e0: 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43  Y_MAX_SHIFTREDUC
e9f0: 45 20 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  E Maximum value 
ea00: 66 6f 72 20 73 68 69 66 74 2d 72 65 64 75 63 65  for shift-reduce
ea10: 20 61 63 74 69 6f 6e 73 0d 0a 2a 2a 20 20 20 20   actions..**    
ea20: 66 74 73 35 59 59 5f 45 52 52 4f 52 5f 41 43 54  fts5YY_ERROR_ACT
ea30: 49 4f 4e 20 20 20 20 54 68 65 20 66 74 73 35 79  ION    The fts5y
ea40: 79 5f 61 63 74 69 6f 6e 5b 5d 20 63 6f 64 65 20  y_action[] code 
ea50: 66 6f 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72  for syntax error
ea60: 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 41  ..**    fts5YY_A
ea70: 43 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 54  CCEPT_ACTION   T
ea80: 68 65 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e  he fts5yy_action
ea90: 5b 5d 20 63 6f 64 65 20 66 6f 72 20 61 63 63 65  [] code for acce
eaa0: 70 74 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59  pt..**    fts5YY
eab0: 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  _NO_ACTION      
eac0: 20 54 68 65 20 66 74 73 35 79 79 5f 61 63 74 69   The fts5yy_acti
ead0: 6f 6e 5b 5d 20 63 6f 64 65 20 66 6f 72 20 6e 6f  on[] code for no
eae0: 2d 6f 70 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59  -op..**    fts5Y
eaf0: 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20  Y_MIN_REDUCE    
eb00: 20 20 4d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20    Minimum value 
eb10: 66 6f 72 20 72 65 64 75 63 65 20 61 63 74 69 6f  for reduce actio
eb20: 6e 73 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59  ns..**    fts5YY
eb30: 5f 4d 41 58 5f 52 45 44 55 43 45 20 20 20 20 20  _MAX_REDUCE     
eb40: 20 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 66   Maximum value f
eb50: 6f 72 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  or reduce action
eb60: 73 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 49  s..*/..#ifndef I
eb70: 4e 54 45 52 46 41 43 45 0d 0a 23 20 64 65 66 69  NTERFACE..# defi
eb80: 6e 65 20 49 4e 54 45 52 46 41 43 45 20 31 0d 0a  ne INTERFACE 1..
eb90: 23 65 6e 64 69 66 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  #endif../*******
eba0: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ****** Begin con
ebb0: 74 72 6f 6c 20 23 64 65 66 69 6e 65 73 20 2a 2a  trol #defines **
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebe0: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 64 65 66 69 6e  *******/..#defin
ebf0: 65 20 66 74 73 35 59 59 43 4f 44 45 54 59 50 45  e fts5YYCODETYPE
ec00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 0d 0a   unsigned char..
ec10: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 4e 4f  #define fts5YYNO
ec20: 43 4f 44 45 20 32 37 0d 0a 23 64 65 66 69 6e 65  CODE 27..#define
ec30: 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50   fts5YYACTIONTYP
ec40: 45 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 0d  E unsigned char.
ec50: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
ec60: 46 74 73 35 50 61 72 73 65 72 46 54 53 35 54 4f  Fts5ParserFTS5TO
ec70: 4b 45 4e 54 59 50 45 20 46 74 73 35 54 6f 6b 65  KENTYPE Fts5Toke
ec80: 6e 0d 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e  n..typedef union
ec90: 20 7b 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79   {..  int fts5yy
eca0: 69 6e 69 74 3b 0d 0a 20 20 73 71 6c 69 74 65 33  init;..  sqlite3
ecb0: 46 74 73 35 50 61 72 73 65 72 46 54 53 35 54 4f  Fts5ParserFTS5TO
ecc0: 4b 45 4e 54 59 50 45 20 66 74 73 35 79 79 30 3b  KENTYPE fts5yy0;
ecd0: 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 34 3b  ..  int fts5yy4;
ece0: 0d 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 2a 20  ..  Fts5Colset* 
ecf0: 66 74 73 35 79 79 31 31 3b 0d 0a 20 20 46 74 73  fts5yy11;..  Fts
ed00: 35 45 78 70 72 4e 6f 64 65 2a 20 66 74 73 35 79  5ExprNode* fts5y
ed10: 79 32 34 3b 0d 0a 20 20 46 74 73 35 45 78 70 72  y24;..  Fts5Expr
ed20: 4e 65 61 72 73 65 74 2a 20 66 74 73 35 79 79 34  Nearset* fts5yy4
ed30: 36 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68  6;..  Fts5ExprPh
ed40: 72 61 73 65 2a 20 66 74 73 35 79 79 35 33 3b 0d  rase* fts5yy53;.
ed50: 0a 7d 20 66 74 73 35 59 59 4d 49 4e 4f 52 54 59  .} fts5YYMINORTY
ed60: 50 45 3b 0d 0a 23 69 66 6e 64 65 66 20 66 74 73  PE;..#ifndef fts
ed70: 35 59 59 53 54 41 43 4b 44 45 50 54 48 0d 0a 23  5YYSTACKDEPTH..#
ed80: 64 65 66 69 6e 65 20 66 74 73 35 59 59 53 54 41  define fts5YYSTA
ed90: 43 4b 44 45 50 54 48 20 31 30 30 0d 0a 23 65 6e  CKDEPTH 100..#en
eda0: 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c  dif..#define sql
edb0: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52  ite3Fts5ParserAR
edc0: 47 5f 53 44 45 43 4c 20 46 74 73 35 50 61 72 73  G_SDECL Fts5Pars
edd0: 65 20 2a 70 50 61 72 73 65 3b 0d 0a 23 64 65 66  e *pParse;..#def
ede0: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35 50  ine sqlite3Fts5P
edf0: 61 72 73 65 72 41 52 47 5f 50 44 45 43 4c 20 2c  arserARG_PDECL ,
ee00: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
ee10: 65 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  e..#define sqlit
ee20: 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
ee30: 50 41 52 41 4d 20 2c 70 50 61 72 73 65 0d 0a 23  PARAM ,pParse..#
ee40: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74  define sqlite3Ft
ee50: 73 35 50 61 72 73 65 72 41 52 47 5f 46 45 54 43  s5ParserARG_FETC
ee60: 48 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61  H Fts5Parse *pPa
ee70: 72 73 65 3d 66 74 73 35 79 79 70 50 61 72 73 65  rse=fts5yypParse
ee80: 72 2d 3e 70 50 61 72 73 65 3b 0d 0a 23 64 65 66  r->pParse;..#def
ee90: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35 50  ine sqlite3Fts5P
eea0: 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45 20 66  arserARG_STORE f
eeb0: 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 70 50  ts5yypParser->pP
eec0: 61 72 73 65 3d 70 50 61 72 73 65 3b 0d 0a 23 64  arse=pParse;..#d
eed0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73  efine sqlite3Fts
eee0: 35 50 61 72 73 65 72 43 54 58 5f 53 44 45 43 4c  5ParserCTX_SDECL
eef0: 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  ..#define sqlite
ef00: 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 50  3Fts5ParserCTX_P
ef10: 44 45 43 4c 0d 0a 23 64 65 66 69 6e 65 20 73 71  DECL..#define sq
ef20: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43  lite3Fts5ParserC
ef30: 54 58 5f 50 41 52 41 4d 0d 0a 23 64 65 66 69 6e  TX_PARAM..#defin
ef40: 65 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  e sqlite3Fts5Par
ef50: 73 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 64  serCTX_FETCH..#d
ef60: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73  efine sqlite3Fts
ef70: 35 50 61 72 73 65 72 43 54 58 5f 53 54 4f 52 45  5ParserCTX_STORE
ef80: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59  ..#define fts5YY
ef90: 4e 53 54 41 54 45 20 20 20 20 20 20 20 20 20 20  NSTATE          
efa0: 20 20 20 33 35 0d 0a 23 64 65 66 69 6e 65 20 66     35..#define f
efb0: 74 73 35 59 59 4e 52 55 4c 45 20 20 20 20 20 20  ts5YYNRULE      
efc0: 20 20 20 20 20 20 20 20 32 38 0d 0a 23 64 65 66          28..#def
efd0: 69 6e 65 20 66 74 73 35 59 59 4e 46 54 53 35 54  ine fts5YYNFTS5T
efe0: 4f 4b 45 4e 20 20 20 20 20 20 20 20 20 20 20 20  OKEN            
eff0: 20 31 36 0d 0a 23 64 65 66 69 6e 65 20 66 74 73   16..#define fts
f000: 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20  5YY_MAX_SHIFT   
f010: 20 20 20 20 20 20 33 34 0d 0a 23 64 65 66 69 6e        34..#defin
f020: 65 20 66 74 73 35 59 59 5f 4d 49 4e 5f 53 48 49  e fts5YY_MIN_SHI
f030: 46 54 52 45 44 55 43 45 20 20 20 35 32 0d 0a 23  FTREDUCE   52..#
f040: 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 4d 41  define fts5YY_MA
f050: 58 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20  X_SHIFTREDUCE   
f060: 37 39 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35  79..#define fts5
f070: 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20  YY_ERROR_ACTION 
f080: 20 20 20 20 20 38 30 0d 0a 23 64 65 66 69 6e 65       80..#define
f090: 20 66 74 73 35 59 59 5f 41 43 43 45 50 54 5f 41   fts5YY_ACCEPT_A
f0a0: 43 54 49 4f 4e 20 20 20 20 20 38 31 0d 0a 23 64  CTION     81..#d
f0b0: 65 66 69 6e 65 20 66 74 73 35 59 59 5f 4e 4f 5f  efine fts5YY_NO_
f0c0: 41 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 38  ACTION         8
f0d0: 32 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  2..#define fts5Y
f0e0: 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20  Y_MIN_REDUCE    
f0f0: 20 20 20 20 38 33 0d 0a 23 64 65 66 69 6e 65 20      83..#define 
f100: 66 74 73 35 59 59 5f 4d 41 58 5f 52 45 44 55 43  fts5YY_MAX_REDUC
f110: 45 20 20 20 20 20 20 20 20 31 31 30 0d 0a 2f 2a  E        110../*
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f130: 20 63 6f 6e 74 72 6f 6c 20 23 64 65 66 69 6e 65   control #define
f140: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
f170: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 4e  #define fts5YY_N
f180: 4c 4f 4f 4b 41 48 45 41 44 20 28 28 69 6e 74 29  LOOKAHEAD ((int)
f190: 28 73 69 7a 65 6f 66 28 66 74 73 35 79 79 5f 6c  (sizeof(fts5yy_l
f1a0: 6f 6f 6b 61 68 65 61 64 29 2f 73 69 7a 65 6f 66  ookahead)/sizeof
f1b0: 28 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61  (fts5yy_lookahea
f1c0: 64 5b 30 5d 29 29 29 0d 0a 0d 0a 2f 2a 20 44 65  d[0])))..../* De
f1d0: 66 69 6e 65 20 74 68 65 20 66 74 73 35 79 79 74  fine the fts5yyt
f1e0: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
f1f0: 74 6f 20 62 65 20 61 20 6e 6f 2d 6f 70 20 69 66  to be a no-op if
f200: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
f210: 64 65 66 69 6e 65 64 0d 0a 2a 2a 20 6f 74 68 65  defined..** othe
f220: 72 77 69 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41  rwise...**..** A
f230: 70 70 6c 69 63 61 74 69 6f 6e 73 20 63 61 6e 20  pplications can 
f240: 63 68 6f 6f 73 65 20 74 6f 20 64 65 66 69 6e 65  choose to define
f250: 20 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28   fts5yytestcase(
f260: 29 20 69 6e 20 74 68 65 20 25 69 6e 63 6c 75 64  ) in the %includ
f270: 65 20 73 65 63 74 69 6f 6e 0d 0a 2a 2a 20 74 6f  e section..** to
f280: 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
f290: 6e 20 61 73 73 69 73 74 20 69 6e 20 76 65 72 69  n assist in veri
f2a0: 66 79 69 6e 67 20 63 6f 64 65 20 63 6f 76 65 72  fying code cover
f2b0: 61 67 65 2e 20 20 46 6f 72 20 70 72 6f 64 75 63  age.  For produc
f2c0: 74 69 6f 6e 0d 0a 2a 2a 20 63 6f 64 65 20 74 68  tion..** code th
f2d0: 65 20 66 74 73 35 79 79 74 65 73 74 63 61 73 65  e fts5yytestcase
f2e0: 28 29 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  () macro should 
f2f0: 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20  be turned off.  
f300: 42 75 74 20 69 74 20 69 73 20 75 73 65 66 75 6c  But it is useful
f310: 0d 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  ..** for testing
f320: 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 66  ...*/..#ifndef f
f330: 74 73 35 79 79 74 65 73 74 63 61 73 65 0d 0a 23  ts5yytestcase..#
f340: 20 64 65 66 69 6e 65 20 66 74 73 35 79 79 74 65   define fts5yyte
f350: 73 74 63 61 73 65 28 58 29 0d 0a 23 65 6e 64 69  stcase(X)..#endi
f360: 66 0d 0a 0d 0a 0d 0a 2f 2a 20 4e 65 78 74 20 61  f....../* Next a
f370: 72 65 20 74 68 65 20 74 61 62 6c 65 73 20 75 73  re the tables us
f380: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
f390: 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74  what action to t
f3a0: 61 6b 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ake based on the
f3b0: 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61  ..** current sta
f3c0: 74 65 20 61 6e 64 20 6c 6f 6f 6b 61 68 65 61 64  te and lookahead
f3d0: 20 74 6f 6b 65 6e 2e 20 20 54 68 65 73 65 20 74   token.  These t
f3e0: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74  ables are used t
f3f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0d 0a 2a 2a 20  o implement..** 
f400: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 74  functions that t
f410: 61 6b 65 20 61 20 73 74 61 74 65 20 6e 75 6d 62  ake a state numb
f420: 65 72 20 61 6e 64 20 6c 6f 6f 6b 61 68 65 61 64  er and lookahead
f430: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
f440: 6e 20 61 6e 0d 0a 2a 2a 20 61 63 74 69 6f 6e 20  n an..** action 
f450: 69 6e 74 65 67 65 72 2e 20 20 0d 0a 2a 2a 0d 0a  integer.  ..**..
f460: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 61  ** Suppose the a
f470: 63 74 69 6f 6e 20 69 6e 74 65 67 65 72 20 69 73  ction integer is
f480: 20 4e 2e 20 20 54 68 65 6e 20 74 68 65 20 61 63   N.  Then the ac
f490: 74 69 6f 6e 20 69 73 20 64 65 74 65 72 6d 69 6e  tion is determin
f4a0: 65 64 20 61 73 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77  ed as..** follow
f4b0: 73 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 30 20 3c 3d  s..**..**   0 <=
f4c0: 20 4e 20 3c 3d 20 66 74 73 35 59 59 5f 4d 41 58   N <= fts5YY_MAX
f4d0: 5f 53 48 49 46 54 20 20 20 20 20 20 20 20 20 20  _SHIFT          
f4e0: 20 20 20 53 68 69 66 74 20 4e 2e 20 20 54 68 61     Shift N.  Tha
f4f0: 74 20 69 73 2c 20 70 75 73 68 20 74 68 65 20 6c  t is, push the l
f500: 6f 6f 6b 61 68 65 61 64 0d 0a 2a 2a 20 20 20 20  ookahead..**    
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 74 6f 6b 65 6e 20 6f 6e 74 6f 20 74 68 65    token onto the
f540: 20 73 74 61 63 6b 20 61 6e 64 20 67 6f 74 6f 20   stack and goto 
f550: 73 74 61 74 65 20 4e 2e 0d 0a 2a 2a 0d 0a 2a 2a  state N...**..**
f560: 20 20 20 4e 20 62 65 74 77 65 65 6e 20 66 74 73     N between fts
f570: 35 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45 44  5YY_MIN_SHIFTRED
f580: 55 43 45 20 20 20 20 20 20 20 53 68 69 66 74 20  UCE       Shift 
f590: 74 6f 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  to an arbitrary 
f5a0: 73 74 61 74 65 20 74 68 65 6e 0d 0a 2a 2a 20 20  state then..**  
f5b0: 20 20 20 61 6e 64 20 66 74 73 35 59 59 5f 4d 41     and fts5YY_MA
f5c0: 58 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20  X_SHIFTREDUCE   
f5d0: 20 20 20 20 20 20 20 20 72 65 64 75 63 65 20 62          reduce b
f5e0: 79 20 72 75 6c 65 20 4e 2d 66 74 73 35 59 59 5f  y rule N-fts5YY_
f5f0: 4d 49 4e 5f 53 48 49 46 54 52 45 44 55 43 45 2e  MIN_SHIFTREDUCE.
f600: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 4e 20 3d 3d 20  ..**..**   N == 
f610: 66 74 73 35 59 59 5f 45 52 52 4f 52 5f 41 43 54  fts5YY_ERROR_ACT
f620: 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  ION             
f630: 20 20 41 20 73 79 6e 74 61 78 20 65 72 72 6f 72    A syntax error
f640: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0d 0a   has occurred...
f650: 2a 2a 0d 0a 2a 2a 20 20 20 4e 20 3d 3d 20 66 74  **..**   N == ft
f660: 73 35 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49  s5YY_ACCEPT_ACTI
f670: 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ON              
f680: 54 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  The parser accep
f690: 74 73 20 69 74 73 20 69 6e 70 75 74 2e 0d 0a 2a  ts its input...*
f6a0: 2a 0d 0a 2a 2a 20 20 20 4e 20 3d 3d 20 66 74 73  *..**   N == fts
f6b0: 35 59 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20  5YY_NO_ACTION   
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
f6d0: 6f 20 73 75 63 68 20 61 63 74 69 6f 6e 2e 20 20  o such action.  
f6e0: 44 65 6e 6f 74 65 73 20 75 6e 75 73 65 64 0d 0a  Denotes unused..
f6f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 73 6c 6f 74 73 20 69 6e          slots in
f720: 20 74 68 65 20 66 74 73 35 79 79 5f 61 63 74 69   the fts5yy_acti
f730: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d  on[] table...**.
f740: 0a 2a 2a 20 20 20 4e 20 62 65 74 77 65 65 6e 20  .**   N between 
f750: 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43  fts5YY_MIN_REDUC
f760: 45 20 20 20 20 20 20 20 20 20 20 20 20 52 65 64  E            Red
f770: 75 63 65 20 62 79 20 72 75 6c 65 20 4e 2d 66 74  uce by rule N-ft
f780: 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 0d  s5YY_MIN_REDUCE.
f790: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 66 74 73 35  .**     and fts5
f7a0: 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 0d 0a 2a  YY_MAX_REDUCE..*
f7b0: 2a 0d 0a 2a 2a 20 54 68 65 20 61 63 74 69 6f 6e  *..** The action
f7c0: 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 74 72   table is constr
f7d0: 75 63 74 65 64 20 61 73 20 61 20 73 69 6e 67 6c  ucted as a singl
f7e0: 65 20 6c 61 72 67 65 20 74 61 62 6c 65 20 6e 61  e large table na
f7f0: 6d 65 64 20 66 74 73 35 79 79 5f 61 63 74 69 6f  med fts5yy_actio
f800: 6e 5b 5d 2e 0d 0a 2a 2a 20 47 69 76 65 6e 20 73  n[]...** Given s
f810: 74 61 74 65 20 53 20 61 6e 64 20 6c 6f 6f 6b 61  tate S and looka
f820: 68 65 61 64 20 58 2c 20 74 68 65 20 61 63 74 69  head X, the acti
f830: 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  on is computed a
f840: 73 20 65 69 74 68 65 72 3a 0d 0a 2a 2a 0d 0a 2a  s either:..**..*
f850: 2a 20 20 20 20 28 41 29 20 20 20 4e 20 3d 20 66  *    (A)   N = f
f860: 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b 20 66 74  ts5yy_action[ ft
f870: 73 35 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  s5yy_shift_ofst[
f880: 53 5d 20 2b 20 58 20 5d 0d 0a 2a 2a 20 20 20 20  S] + X ]..**    
f890: 28 42 29 20 20 20 4e 20 3d 20 66 74 73 35 79 79  (B)   N = fts5yy
f8a0: 5f 64 65 66 61 75 6c 74 5b 53 5d 0d 0a 2a 2a 0d  _default[S]..**.
f8b0: 0a 2a 2a 20 54 68 65 20 28 41 29 20 66 6f 72 6d  .** The (A) form
f8c0: 75 6c 61 20 69 73 20 70 72 65 66 65 72 72 65 64  ula is preferred
f8d0: 2e 20 20 54 68 65 20 42 20 66 6f 72 6d 75 6c 61  .  The B formula
f8e0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
f8f0: 20 69 66 0d 0a 2a 2a 20 66 74 73 35 79 79 5f 6c   if..** fts5yy_l
f900: 6f 6f 6b 61 68 65 61 64 5b 66 74 73 35 79 79 5f  ookahead[fts5yy_
f910: 73 68 69 66 74 5f 6f 66 73 74 5b 53 5d 2b 58 5d  shift_ofst[S]+X]
f920: 20 69 73 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f   is not equal to
f930: 20 58 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20   X...**..** The 
f940: 66 6f 72 6d 75 6c 61 73 20 61 62 6f 76 65 20 61  formulas above a
f950: 72 65 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  re for computing
f960: 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68 65 6e   the action when
f970: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69   the lookahead i
f980: 73 0d 0a 2a 2a 20 61 20 74 65 72 6d 69 6e 61 6c  s..** a terminal
f990: 20 73 79 6d 62 6f 6c 2e 20 20 49 66 20 74 68 65   symbol.  If the
f9a0: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 61 20   lookahead is a 
f9b0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 28 61 73  non-terminal (as
f9c0: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0d 0a 2a   occurs after..*
f9d0: 2a 20 61 20 72 65 64 75 63 65 20 61 63 74 69 6f  * a reduce actio
f9e0: 6e 29 20 74 68 65 6e 20 74 68 65 20 66 74 73 35  n) then the fts5
f9f0: 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
fa00: 20 61 72 72 61 79 20 69 73 20 75 73 65 64 20 69   array is used i
fa10: 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 74  n place of..** t
fa20: 68 65 20 66 74 73 35 79 79 5f 73 68 69 66 74 5f  he fts5yy_shift_
fa30: 6f 66 73 74 5b 5d 20 61 72 72 61 79 2e 0d 0a 2a  ofst[] array...*
fa40: 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  *..** The follow
fa50: 69 6e 67 20 61 72 65 20 74 68 65 20 74 61 62 6c  ing are the tabl
fa60: 65 73 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  es generated in 
fa70: 74 68 69 73 20 73 65 63 74 69 6f 6e 3a 0d 0a 2a  this section:..*
fa80: 2a 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f 61 63  *..**  fts5yy_ac
fa90: 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20  tion[]        A 
faa0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e  single table con
fab0: 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69  taining all acti
fac0: 6f 6e 73 2e 0d 0a 2a 2a 20 20 66 74 73 35 79 79  ons...**  fts5yy
fad0: 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20  _lookahead[]    
fae0: 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   A table contain
faf0: 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61  ing the lookahea
fb00: 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79  d for each entry
fb10: 20 69 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20   in..**         
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
fb30: 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64  yy_action.  Used
fb40: 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20   to detect hash 
fb50: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0d 0a 2a 2a 20  collisions...** 
fb60: 20 66 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66   fts5yy_shift_of
fb70: 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
fb80: 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
fb90: 65 74 20 69 6e 74 6f 20 66 74 73 35 79 79 5f 61  et into fts5yy_a
fba0: 63 74 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 20 20  ction for..**   
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69    shifting termi
fbd0: 6e 61 6c 73 2e 0d 0a 2a 2a 20 20 66 74 73 35 79  nals...**  fts5y
fbe0: 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20  y_reduce_ofst[] 
fbf0: 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65    For each state
fc00: 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  , the offset int
fc10: 6f 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 20  o fts5yy_action 
fc20: 66 6f 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  for..**         
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
fc40: 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ting non-termina
fc50: 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75 63  ls after a reduc
fc60: 65 2e 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f 64  e...**  fts5yy_d
fc70: 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
fc80: 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
fc90: 72 20 65 61 63 68 20 73 74 61 74 65 2e 0d 0a 2a  r each state...*
fca0: 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  *..*********** B
fcb0: 65 67 69 6e 20 70 61 72 73 69 6e 67 20 74 61 62  egin parsing tab
fcc0: 6c 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  les ************
fcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcf0: 2a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73  **/..#define fts
fd00: 35 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54  5YY_ACTTAB_COUNT
fd10: 20 28 31 30 35 29 0d 0a 73 74 61 74 69 63 20 63   (105)..static c
fd20: 6f 6e 73 74 20 66 74 73 35 59 59 41 43 54 49 4f  onst fts5YYACTIO
fd30: 4e 54 59 50 45 20 66 74 73 35 79 79 5f 61 63 74  NTYPE fts5yy_act
fd40: 69 6f 6e 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20  ion[] = {.. /*  
fd50: 20 20 20 30 20 2a 2f 20 20 20 20 38 31 2c 20 20     0 */    81,  
fd60: 20 32 30 2c 20 20 20 39 36 2c 20 20 20 20 36 2c   20,   96,    6,
fd70: 20 20 20 32 38 2c 20 20 20 39 39 2c 20 20 20 39     28,   99,   9
fd80: 38 2c 20 20 20 32 36 2c 20 20 20 32 36 2c 20 20  8,   26,   26,  
fd90: 20 31 38 2c 0d 0a 20 2f 2a 20 20 20 20 31 30 20   18,.. /*    10 
fda0: 2a 2f 20 20 20 20 39 36 2c 20 20 20 20 36 2c 20  */    96,    6, 
fdb0: 20 20 32 38 2c 20 20 20 31 37 2c 20 20 20 39 38    28,   17,   98
fdc0: 2c 20 20 20 35 36 2c 20 20 20 32 36 2c 20 20 20  ,   56,   26,   
fdd0: 31 39 2c 20 20 20 39 36 2c 20 20 20 20 36 2c 0d  19,   96,    6,.
fde0: 0a 20 2f 2a 20 20 20 20 32 30 20 2a 2f 20 20 20  . /*    20 */   
fdf0: 20 32 38 2c 20 20 20 31 34 2c 20 20 20 39 38 2c   28,   14,   98,
fe00: 20 20 20 31 34 2c 20 20 20 32 36 2c 20 20 20 33     14,   26,   3
fe10: 31 2c 20 20 20 39 32 2c 20 20 20 39 36 2c 20 20  1,   92,   96,  
fe20: 20 20 36 2c 20 20 20 32 38 2c 0d 0a 20 2f 2a 20    6,   28,.. /* 
fe30: 20 20 20 33 30 20 2a 2f 20 20 20 31 30 38 2c 20     30 */   108, 
fe40: 20 20 39 38 2c 20 20 20 32 35 2c 20 20 20 32 36    98,   25,   26
fe50: 2c 20 20 20 32 31 2c 20 20 20 39 36 2c 20 20 20  ,   21,   96,   
fe60: 20 36 2c 20 20 20 32 38 2c 20 20 20 37 38 2c 20   6,   28,   78, 
fe70: 20 20 39 38 2c 0d 0a 20 2f 2a 20 20 20 20 34 30    98,.. /*    40
fe80: 20 2a 2f 20 20 20 20 35 38 2c 20 20 20 32 36 2c   */    58,   26,
fe90: 20 20 20 32 39 2c 20 20 20 39 36 2c 20 20 20 20     29,   96,    
fea0: 36 2c 20 20 20 32 38 2c 20 20 31 30 37 2c 20 20  6,   28,  107,  
feb0: 20 39 38 2c 20 20 20 32 32 2c 20 20 20 32 36 2c   98,   22,   26,
fec0: 0d 0a 20 2f 2a 20 20 20 20 35 30 20 2a 2f 20 20  .. /*    50 */  
fed0: 20 20 32 34 2c 20 20 20 31 36 2c 20 20 20 31 32    24,   16,   12
fee0: 2c 20 20 20 31 31 2c 20 20 20 20 31 2c 20 20 20  ,   11,    1,   
fef0: 31 33 2c 20 20 20 31 33 2c 20 20 20 32 34 2c 20  13,   13,   24, 
ff00: 20 20 31 36 2c 20 20 20 32 33 2c 0d 0a 20 2f 2a    16,   23,.. /*
ff10: 20 20 20 20 36 30 20 2a 2f 20 20 20 20 31 31 2c      60 */    11,
ff20: 20 20 20 33 33 2c 20 20 20 33 34 2c 20 20 20 31     33,   34,   1
ff30: 33 2c 20 20 20 39 37 2c 20 20 20 20 38 2c 20 20  3,   97,    8,  
ff40: 20 32 37 2c 20 20 20 33 32 2c 20 20 20 39 38 2c   27,   32,   98,
ff50: 20 20 20 20 37 2c 0d 0a 20 2f 2a 20 20 20 20 37      7,.. /*    7
ff60: 30 20 2a 2f 20 20 20 20 32 36 2c 20 20 20 20 33  0 */    26,    3
ff70: 2c 20 20 20 20 34 2c 20 20 20 20 35 2c 20 20 20  ,    4,    5,   
ff80: 20 33 2c 20 20 20 20 34 2c 20 20 20 20 35 2c 20   3,    4,    5, 
ff90: 20 20 20 33 2c 20 20 20 38 33 2c 20 20 20 20 34     3,   83,    4
ffa0: 2c 0d 0a 20 2f 2a 20 20 20 20 38 30 20 2a 2f 20  ,.. /*    80 */ 
ffb0: 20 20 20 20 35 2c 20 20 20 20 33 2c 20 20 20 36      5,    3,   6
ffc0: 33 2c 20 20 20 20 35 2c 20 20 20 20 33 2c 20 20  3,    5,    3,  
ffd0: 20 36 32 2c 20 20 20 31 32 2c 20 20 20 20 32 2c   62,   12,    2,
ffe0: 20 20 20 38 36 2c 20 20 20 31 33 2c 0d 0a 20 2f     86,   13,.. /
fff0: 2a 20 20 20 20 39 30 20 2a 2f 20 20 20 20 20 39  *    90 */     9
10000 2c 20 20 20 33 30 2c 20 20 20 31 30 2c 20 20 20  ,   30,   10,   
10010 31 30 2c 20 20 20 35 34 2c 20 20 20 35 37 2c 20  10,   54,   57, 
10020 20 20 37 35 2c 20 20 20 37 38 2c 20 20 20 37 38    75,   78,   78
10030 2c 20 20 20 35 33 2c 0d 0a 20 2f 2a 20 20 20 31  ,   53,.. /*   1
10040 30 30 20 2a 2f 20 20 20 20 35 37 2c 20 20 20 31  00 */    57,   1
10050 35 2c 20 20 20 38 32 2c 20 20 20 38 32 2c 20 20  5,   82,   82,  
10060 20 37 31 2c 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63   71,..};..static
10070 20 63 6f 6e 73 74 20 66 74 73 35 59 59 43 4f 44   const fts5YYCOD
10080 45 54 59 50 45 20 66 74 73 35 79 79 5f 6c 6f 6f  ETYPE fts5yy_loo
10090 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 0d 0a 20 2f  kahead[] = {.. /
100a0 2a 20 20 20 20 20 30 20 2a 2f 20 20 20 20 31 36  *     0 */    16
100b0 2c 20 20 20 31 37 2c 20 20 20 31 38 2c 20 20 20  ,   17,   18,   
100c0 31 39 2c 20 20 20 32 30 2c 20 20 20 32 32 2c 20  19,   20,   22, 
100d0 20 20 32 32 2c 20 20 20 32 34 2c 20 20 20 32 34    22,   24,   24
100e0 2c 20 20 20 31 37 2c 0d 0a 20 2f 2a 20 20 20 20  ,   17,.. /*    
100f0 31 30 20 2a 2f 20 20 20 20 31 38 2c 20 20 20 31  10 */    18,   1
10100 39 2c 20 20 20 32 30 2c 20 20 20 20 37 2c 20 20  9,   20,    7,  
10110 20 32 32 2c 20 20 20 20 39 2c 20 20 20 32 34 2c   22,    9,   24,
10120 20 20 20 31 37 2c 20 20 20 31 38 2c 20 20 20 31     17,   18,   1
10130 39 2c 0d 0a 20 2f 2a 20 20 20 20 32 30 20 2a 2f  9,.. /*    20 */
10140 20 20 20 20 32 30 2c 20 20 20 20 39 2c 20 20 20      20,    9,   
10150 32 32 2c 20 20 20 20 39 2c 20 20 20 32 34 2c 20  22,    9,   24, 
10160 20 20 31 33 2c 20 20 20 31 37 2c 20 20 20 31 38    13,   17,   18
10170 2c 20 20 20 31 39 2c 20 20 20 32 30 2c 0d 0a 20  ,   19,   20,.. 
10180 2f 2a 20 20 20 20 33 30 20 2a 2f 20 20 20 20 32  /*    30 */    2
10190 36 2c 20 20 20 32 32 2c 20 20 20 32 34 2c 20 20  6,   22,   24,  
101a0 20 32 34 2c 20 20 20 31 37 2c 20 20 20 31 38 2c   24,   17,   18,
101b0 20 20 20 31 39 2c 20 20 20 32 30 2c 20 20 20 31     19,   20,   1
101c0 35 2c 20 20 20 32 32 2c 0d 0a 20 2f 2a 20 20 20  5,   22,.. /*   
101d0 20 34 30 20 2a 2f 20 20 20 20 20 39 2c 20 20 20   40 */     9,   
101e0 32 34 2c 20 20 20 31 37 2c 20 20 20 31 38 2c 20  24,   17,   18, 
101f0 20 20 31 39 2c 20 20 20 32 30 2c 20 20 20 32 36    19,   20,   26
10200 2c 20 20 20 32 32 2c 20 20 20 32 31 2c 20 20 20  ,   22,   21,   
10210 32 34 2c 0d 0a 20 2f 2a 20 20 20 20 35 30 20 2a  24,.. /*    50 *
10220 2f 20 20 20 20 20 36 2c 20 20 20 20 37 2c 20 20  /     6,    7,  
10230 20 20 39 2c 20 20 20 20 39 2c 20 20 20 31 30 2c    9,    9,   10,
10240 20 20 20 31 32 2c 20 20 20 31 32 2c 20 20 20 20     12,   12,    
10250 36 2c 20 20 20 20 37 2c 20 20 20 32 31 2c 0d 0a  6,    7,   21,..
10260 20 2f 2a 20 20 20 20 36 30 20 2a 2f 20 20 20 20   /*    60 */    
10270 20 39 2c 20 20 20 32 34 2c 20 20 20 32 35 2c 20   9,   24,   25, 
10280 20 20 31 32 2c 20 20 20 31 38 2c 20 20 20 20 35    12,   18,    5
10290 2c 20 20 20 32 30 2c 20 20 20 31 34 2c 20 20 20  ,   20,   14,   
102a0 32 32 2c 20 20 20 20 35 2c 0d 0a 20 2f 2a 20 20  22,    5,.. /*  
102b0 20 20 37 30 20 2a 2f 20 20 20 20 32 34 2c 20 20    70 */    24,  
102c0 20 20 33 2c 20 20 20 20 31 2c 20 20 20 20 32 2c    3,    1,    2,
102d0 20 20 20 20 33 2c 20 20 20 20 31 2c 20 20 20 20      3,    1,    
102e0 32 2c 20 20 20 20 33 2c 20 20 20 20 30 2c 20 20  2,    3,    0,  
102f0 20 20 31 2c 0d 0a 20 2f 2a 20 20 20 20 38 30 20    1,.. /*    80 
10300 2a 2f 20 20 20 20 20 32 2c 20 20 20 20 33 2c 20  */     2,    3, 
10310 20 20 31 31 2c 20 20 20 20 32 2c 20 20 20 20 33    11,    2,    3
10320 2c 20 20 20 31 31 2c 20 20 20 20 39 2c 20 20 20  ,   11,    9,   
10330 31 30 2c 20 20 20 20 35 2c 20 20 20 31 32 2c 0d  10,    5,   12,.
10340 0a 20 2f 2a 20 20 20 20 39 30 20 2a 2f 20 20 20  . /*    90 */   
10350 20 32 33 2c 20 20 20 32 34 2c 20 20 20 31 30 2c   23,   24,   10,
10360 20 20 20 31 30 2c 20 20 20 20 38 2c 20 20 20 20     10,    8,    
10370 39 2c 20 20 20 20 39 2c 20 20 20 31 35 2c 20 20  9,    9,   15,  
10380 20 31 35 2c 20 20 20 20 38 2c 0d 0a 20 2f 2a 20   15,    8,.. /* 
10390 20 20 31 30 30 20 2a 2f 20 20 20 20 20 39 2c 20    100 */     9, 
103a0 20 20 20 39 2c 20 20 20 32 37 2c 20 20 20 32 37     9,   27,   27
103b0 2c 20 20 20 31 31 2c 20 20 20 32 37 2c 20 20 20  ,   11,   27,   
103c0 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20  27,   27,   27, 
103d0 20 20 32 37 2c 0d 0a 20 2f 2a 20 20 20 31 31 30    27,.. /*   110
103e0 20 2a 2f 20 20 20 20 32 37 2c 20 20 20 32 37 2c   */    27,   27,
103f0 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32     27,   27,   2
10400 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20  7,   27,   27,  
10410 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c   27,   27,   27,
10420 0d 0a 20 2f 2a 20 20 20 31 32 30 20 2a 2f 20 20  .. /*   120 */  
10430 20 20 32 37 2c 0d 0a 7d 3b 0d 0a 23 64 65 66 69    27,..};..#defi
10440 6e 65 20 66 74 73 35 59 59 5f 53 48 49 46 54 5f  ne fts5YY_SHIFT_
10450 43 4f 55 4e 54 20 20 20 20 28 33 34 29 0d 0a 23  COUNT    (34)..#
10460 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 53 48  define fts5YY_SH
10470 49 46 54 5f 4d 49 4e 20 20 20 20 20 20 28 30 29  IFT_MIN      (0)
10480 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59  ..#define fts5YY
10490 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 20 20 20  _SHIFT_MAX      
104a0 28 39 33 29 0d 0a 73 74 61 74 69 63 20 63 6f 6e  (93)..static con
104b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
104c0 20 66 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66   fts5yy_shift_of
104d0 73 74 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20  st[] = {.. /*   
104e0 20 20 30 20 2a 2f 20 20 20 20 34 34 2c 20 20 20    0 */    44,   
104f0 34 34 2c 20 20 20 34 34 2c 20 20 20 34 34 2c 20  44,   44,   44, 
10500 20 20 34 34 2c 20 20 20 34 34 2c 20 20 20 35 31    44,   44,   51
10510 2c 20 20 20 37 37 2c 20 20 20 34 33 2c 20 20 20  ,   77,   43,   
10520 31 32 2c 0d 0a 20 2f 2a 20 20 20 20 31 30 20 2a  12,.. /*    10 *
10530 2f 20 20 20 20 31 34 2c 20 20 20 38 33 2c 20 20  /    14,   83,  
10540 20 38 32 2c 20 20 20 31 34 2c 20 20 20 32 33 2c   82,   14,   23,
10550 20 20 20 32 33 2c 20 20 20 33 31 2c 20 20 20 33     23,   31,   3
10560 31 2c 20 20 20 37 31 2c 20 20 20 37 34 2c 0d 0a  1,   71,   74,..
10570 20 2f 2a 20 20 20 20 32 30 20 2a 2f 20 20 20 20   /*    20 */    
10580 37 38 2c 20 20 20 38 31 2c 20 20 20 38 36 2c 20  78,   81,   86, 
10590 20 20 39 31 2c 20 20 20 20 36 2c 20 20 20 35 33    91,    6,   53
105a0 2c 20 20 20 35 33 2c 20 20 20 36 30 2c 20 20 20  ,   53,   60,   
105b0 36 34 2c 20 20 20 36 38 2c 0d 0a 20 2f 2a 20 20  64,   68,.. /*  
105c0 20 20 33 30 20 2a 2f 20 20 20 20 35 33 2c 20 20    30 */    53,  
105d0 20 38 37 2c 20 20 20 39 32 2c 20 20 20 35 33 2c   87,   92,   53,
105e0 20 20 20 39 33 2c 0d 0a 7d 3b 0d 0a 23 64 65 66     93,..};..#def
105f0 69 6e 65 20 66 74 73 35 59 59 5f 52 45 44 55 43  ine fts5YY_REDUC
10600 45 5f 43 4f 55 4e 54 20 28 31 37 29 0d 0a 23 64  E_COUNT (17)..#d
10610 65 66 69 6e 65 20 66 74 73 35 59 59 5f 52 45 44  efine fts5YY_RED
10620 55 43 45 5f 4d 49 4e 20 20 20 28 2d 31 37 29 0d  UCE_MIN   (-17).
10630 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f  .#define fts5YY_
10640 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 36 37  REDUCE_MAX   (67
10650 29 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  )..static const 
10660 73 69 67 6e 65 64 20 63 68 61 72 20 66 74 73 35  signed char fts5
10670 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
10680 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20 20 30 20   = {.. /*     0 
10690 2a 2f 20 20 20 2d 31 36 2c 20 20 20 2d 38 2c 20  */   -16,   -8, 
106a0 20 20 20 30 2c 20 20 20 20 39 2c 20 20 20 31 37     0,    9,   17
106b0 2c 20 20 20 32 35 2c 20 20 20 34 36 2c 20 20 2d  ,   25,   46,  -
106c0 31 37 2c 20 20 2d 31 37 2c 20 20 20 33 37 2c 0d  17,  -17,   37,.
106d0 0a 20 2f 2a 20 20 20 20 31 30 20 2a 2f 20 20 20  . /*    10 */   
106e0 20 36 37 2c 20 20 20 20 34 2c 20 20 20 20 34 2c   67,    4,    4,
106f0 20 20 20 20 38 2c 20 20 20 20 34 2c 20 20 20 32      8,    4,   2
10700 30 2c 20 20 20 32 37 2c 20 20 20 33 38 2c 0d 0a  0,   27,   38,..
10710 7d 3b 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  };..static const
10720 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50   fts5YYACTIONTYP
10730 45 20 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74  E fts5yy_default
10740 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20 20  [] = {.. /*     
10750 30 20 2a 2f 20 20 20 20 38 30 2c 20 20 20 38 30  0 */    80,   80
10760 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20 20 20  ,   80,   80,   
10770 38 30 2c 20 20 20 38 30 2c 20 20 20 39 35 2c 20  80,   80,   95, 
10780 20 20 38 30 2c 20 20 20 38 30 2c 20 20 31 30 35    80,   80,  105
10790 2c 0d 0a 20 2f 2a 20 20 20 20 31 30 20 2a 2f 20  ,.. /*    10 */ 
107a0 20 20 20 38 30 2c 20 20 31 31 30 2c 20 20 31 31     80,  110,  11
107b0 30 2c 20 20 20 38 30 2c 20 20 31 31 30 2c 20 20  0,   80,  110,  
107c0 31 31 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c  110,   80,   80,
107d0 20 20 20 38 30 2c 20 20 20 38 30 2c 0d 0a 20 2f     80,   80,.. /
107e0 2a 20 20 20 20 32 30 20 2a 2f 20 20 20 20 38 30  *    20 */    80
107f0 2c 20 20 20 39 31 2c 20 20 20 38 30 2c 20 20 20  ,   91,   80,   
10800 38 30 2c 20 20 20 38 30 2c 20 20 31 30 31 2c 20  80,   80,  101, 
10810 20 31 30 30 2c 20 20 20 38 30 2c 20 20 20 38 30   100,   80,   80
10820 2c 20 20 20 39 30 2c 0d 0a 20 2f 2a 20 20 20 20  ,   90,.. /*    
10830 33 30 20 2a 2f 20 20 20 31 30 33 2c 20 20 20 38  30 */   103,   8
10840 30 2c 20 20 20 38 30 2c 20 20 31 30 34 2c 20 20  0,   80,  104,  
10850 20 38 30 2c 0d 0a 7d 3b 0d 0a 2f 2a 2a 2a 2a 2a   80,..};../*****
10860 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6c 65 6d  ***** End of lem
10870 6f 6e 2d 67 65 6e 65 72 61 74 65 64 20 70 61 72  on-generated par
10880 73 69 6e 67 20 74 61 62 6c 65 73 20 2a 2a 2a 2a  sing tables ****
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a  *********/..../*
108b0 20 54 68 65 20 6e 65 78 74 20 74 61 62 6c 65 20   The next table 
108c0 6d 61 70 73 20 74 6f 6b 65 6e 73 20 28 74 65 72  maps tokens (ter
108d0 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 29 20 69  minal symbols) i
108e0 6e 74 6f 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b  nto fallback tok
108f0 65 6e 73 2e 20 20 0d 0a 2a 2a 20 49 66 20 61 20  ens.  ..** If a 
10900 63 6f 6e 73 74 72 75 63 74 20 6c 69 6b 65 20 74  construct like t
10910 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a  he following:..*
10920 2a 20 0d 0a 2a 2a 20 20 20 20 20 20 25 66 61 6c  * ..**      %fal
10930 6c 62 61 63 6b 20 49 44 20 58 20 59 20 5a 2e 0d  lback ID X Y Z..
10940 0a 2a 2a 0d 0a 2a 2a 20 61 70 70 65 61 72 73 20  .**..** appears 
10950 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20  in the grammar, 
10960 74 68 65 6e 20 49 44 20 62 65 63 6f 6d 65 73 20  then ID becomes 
10970 61 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  a fallback token
10980 20 66 6f 72 20 58 2c 20 59 2c 0d 0a 2a 2a 20 61   for X, Y,..** a
10990 6e 64 20 5a 2e 20 20 57 68 65 6e 65 76 65 72 20  nd Z.  Whenever 
109a0 6f 6e 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  one of the token
109b0 73 20 58 2c 20 59 2c 20 6f 72 20 5a 20 69 73 20  s X, Y, or Z is 
109c0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 70 61 72  input to the par
109d0 73 65 72 0d 0a 2a 2a 20 62 75 74 20 69 74 20 64  ser..** but it d
109e0 6f 65 73 20 6e 6f 74 20 70 61 72 73 65 2c 20 74  oes not parse, t
109f0 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 74  he type of the t
10a00 6f 6b 65 6e 20 69 73 20 63 68 61 6e 67 65 64 20  oken is changed 
10a10 74 6f 20 49 44 20 61 6e 64 0d 0a 2a 2a 20 74 68  to ID and..** th
10a20 65 20 70 61 72 73 65 20 69 73 20 72 65 74 72 69  e parse is retri
10a30 65 64 20 62 65 66 6f 72 65 20 61 6e 20 65 72 72  ed before an err
10a40 6f 72 20 69 73 20 74 68 72 6f 77 6e 2e 0d 0a 2a  or is thrown...*
10a50 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  *..** This featu
10a60 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  re can be used, 
10a70 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
10a80 63 61 75 73 65 20 73 6f 6d 65 20 6b 65 79 77 6f  cause some keywo
10a90 72 64 73 20 69 6e 20 61 20 6c 61 6e 67 75 61 67  rds in a languag
10aa0 65 0d 0a 2a 2a 20 74 6f 20 72 65 76 65 72 74 20  e..** to revert 
10ab0 74 6f 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  to identifiers i
10ac0 66 20 74 68 65 79 20 6b 65 79 77 6f 72 64 20 64  f they keyword d
10ad0 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 6e  oes not apply in
10ae0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 77 68 65   the context whe
10af0 72 65 0d 0a 2a 2a 20 69 74 20 61 70 70 65 61 72  re..** it appear
10b00 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 66  s...*/..#ifdef f
10b10 74 73 35 59 59 46 41 4c 4c 42 41 43 4b 0d 0a 73  ts5YYFALLBACK..s
10b20 74 61 74 69 63 20 63 6f 6e 73 74 20 66 74 73 35  tatic const fts5
10b30 59 59 43 4f 44 45 54 59 50 45 20 66 74 73 35 79  YYCODETYPE fts5y
10b40 79 46 61 6c 6c 62 61 63 6b 5b 5d 20 3d 20 7b 0d  yFallback[] = {.
10b50 0a 7d 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 66  .};..#endif /* f
10b60 74 73 35 59 59 46 41 4c 4c 42 41 43 4b 20 2a 2f  ts5YYFALLBACK */
10b70 0d 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..../* The follo
10b80 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  wing structure r
10b90 65 70 72 65 73 65 6e 74 73 20 61 20 73 69 6e 67  epresents a sing
10ba0 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  le element of th
10bb0 65 0d 0a 2a 2a 20 70 61 72 73 65 72 27 73 20 73  e..** parser's s
10bc0 74 61 63 6b 2e 20 20 49 6e 66 6f 72 6d 61 74 69  tack.  Informati
10bd0 6f 6e 20 73 74 6f 72 65 64 20 69 6e 63 6c 75 64  on stored includ
10be0 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20  es:..**..**   + 
10bf0 20 54 68 65 20 73 74 61 74 65 20 6e 75 6d 62 65   The state numbe
10c00 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  r for the parser
10c10 20 61 74 20 74 68 69 73 20 6c 65 76 65 6c 20 6f   at this level o
10c20 66 20 74 68 65 20 73 74 61 63 6b 2e 0d 0a 2a 2a  f the stack...**
10c30 0d 0a 2a 2a 20 20 20 2b 20 20 54 68 65 20 76 61  ..**   +  The va
10c40 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  lue of the token
10c50 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 20   stored at this 
10c60 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 73 74 61  level of the sta
10c70 63 6b 2e 0d 0a 2a 2a 20 20 20 20 20 20 28 49 6e  ck...**      (In
10c80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
10c90 65 20 22 6d 61 6a 6f 72 22 20 74 6f 6b 65 6e 2e  e "major" token.
10ca0 29 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 20 54  )..**..**   +  T
10cb0 68 65 20 73 65 6d 61 6e 74 69 63 20 76 61 6c 75  he semantic valu
10cc0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  e stored at this
10cd0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 73 74   level of the st
10ce0 61 63 6b 2e 20 20 54 68 69 73 20 69 73 0d 0a 2a  ack.  This is..*
10cf0 2a 20 20 20 20 20 20 74 68 65 20 69 6e 66 6f 72  *      the infor
10d00 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  mation used by t
10d10 68 65 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  he action routin
10d20 65 73 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  es in the gramma
10d30 72 2e 0d 0a 2a 2a 20 20 20 20 20 20 49 74 20 69  r...**      It i
10d40 73 20 73 6f 6d 65 74 69 6d 65 73 20 63 61 6c 6c  s sometimes call
10d50 65 64 20 74 68 65 20 22 6d 69 6e 6f 72 22 20 74  ed the "minor" t
10d60 6f 6b 65 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66  oken...**..** Af
10d70 74 65 72 20 74 68 65 20 22 73 68 69 66 74 22 20  ter the "shift" 
10d80 68 61 6c 66 20 6f 66 20 61 20 53 48 49 46 54 52  half of a SHIFTR
10d90 45 44 55 43 45 20 61 63 74 69 6f 6e 2c 20 74 68  EDUCE action, th
10da0 65 20 73 74 61 74 65 6e 6f 20 66 69 65 6c 64 0d  e stateno field.
10db0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e  .** actually con
10dc0 74 61 69 6e 73 20 74 68 65 20 72 65 64 75 63 65  tains the reduce
10dd0 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
10de0 73 65 63 6f 6e 64 20 68 61 6c 66 20 6f 66 20 74  second half of t
10df0 68 65 0d 0a 2a 2a 20 53 48 49 46 54 52 45 44 55  he..** SHIFTREDU
10e00 43 45 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20  CE...*/..struct 
10e10 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79  fts5yyStackEntry
10e20 20 7b 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49   {..  fts5YYACTI
10e30 4f 4e 54 59 50 45 20 73 74 61 74 65 6e 6f 3b 20  ONTYPE stateno; 
10e40 20 2f 2a 20 54 68 65 20 73 74 61 74 65 2d 6e 75   /* The state-nu
10e50 6d 62 65 72 2c 20 6f 72 20 72 65 64 75 63 65 20  mber, or reduce 
10e60 61 63 74 69 6f 6e 20 69 6e 20 53 48 49 46 54 52  action in SHIFTR
10e70 45 44 55 43 45 20 2a 2f 0d 0a 20 20 66 74 73 35  EDUCE */..  fts5
10e80 59 59 43 4f 44 45 54 59 50 45 20 6d 61 6a 6f 72  YYCODETYPE major
10e90 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;      /* The ma
10ea0 6a 6f 72 20 74 6f 6b 65 6e 20 76 61 6c 75 65 2e  jor token value.
10eb0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f    This is the co
10ec0 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  de..            
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
10ee0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
10ef0 6f 6b 65 6e 20 61 74 20 74 68 69 73 20 73 74 61  oken at this sta
10f00 63 6b 20 6c 65 76 65 6c 20 2a 2f 0d 0a 20 20 66  ck level */..  f
10f10 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45 20 6d  ts5YYMINORTYPE m
10f20 69 6e 6f 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  inor;     /* The
10f30 20 75 73 65 72 2d 73 75 70 70 6c 69 65 64 20 6d   user-supplied m
10f40 69 6e 6f 72 20 74 6f 6b 65 6e 20 76 61 6c 75 65  inor token value
10f50 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 20  .  This..       
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 2a 2a 20 69 73 20 74 68 65 20 76 61 6c 75    ** is the valu
10f80 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 20  e of the token  
10f90 2a 2f 0d 0a 7d 3b 0d 0a 74 79 70 65 64 65 66 20  */..};..typedef 
10fa0 73 74 72 75 63 74 20 66 74 73 35 79 79 53 74 61  struct fts5yySta
10fb0 63 6b 45 6e 74 72 79 20 66 74 73 35 79 79 53 74  ckEntry fts5yySt
10fc0 61 63 6b 45 6e 74 72 79 3b 0d 0a 0d 0a 2f 2a 20  ackEntry;..../* 
10fd0 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
10fe0 20 70 61 72 73 65 72 20 69 73 20 63 6f 6d 70 6c   parser is compl
10ff0 65 74 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  etely contained 
11000 69 6e 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  in an instance o
11010 66 0d 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  f..** the follow
11020 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
11030 0d 0a 73 74 72 75 63 74 20 66 74 73 35 79 79 50  ..struct fts5yyP
11040 61 72 73 65 72 20 7b 0d 0a 20 20 66 74 73 35 79  arser {..  fts5y
11050 79 53 74 61 63 6b 45 6e 74 72 79 20 2a 66 74 73  yStackEntry *fts
11060 35 79 79 74 6f 73 3b 20 20 20 20 20 20 20 20 20  5yytos;         
11070 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
11080 6f 70 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  op element of th
11090 65 20 73 74 61 63 6b 20 2a 2f 0d 0a 23 69 66 64  e stack */..#ifd
110a0 65 66 20 66 74 73 35 59 59 54 52 41 43 4b 4d 41  ef fts5YYTRACKMA
110b0 58 53 54 41 43 4b 44 45 50 54 48 0d 0a 20 20 69  XSTACKDEPTH..  i
110c0 6e 74 20 66 74 73 35 79 79 68 77 6d 3b 20 20 20  nt fts5yyhwm;   
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 2f 2a 20 48 69 67 68 2d 77 61 74 65 72 20 6d   /* High-water m
110f0 61 72 6b 20 6f 66 20 74 68 65 20 73 74 61 63 6b  ark of the stack
11100 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66   */..#endif..#if
11110 6e 64 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52  ndef fts5YYNOERR
11120 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20 20 69 6e  ORRECOVERY..  in
11130 74 20 66 74 73 35 79 79 65 72 72 63 6e 74 3b 20  t fts5yyerrcnt; 
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 2f 2a 20 53 68 69 66 74 73 20 6c 65 66 74 20 62  /* Shifts left b
11160 65 66 6f 72 65 20 6f 75 74 20 6f 66 20 74 68 65  efore out of the
11170 20 65 72 72 6f 72 20 2a 2f 0d 0a 23 65 6e 64 69   error */..#endi
11180 66 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  f..  sqlite3Fts5
11190 50 61 72 73 65 72 41 52 47 5f 53 44 45 43 4c 20  ParserARG_SDECL 
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
111b0 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 68 6f 6c  * A place to hol
111c0 64 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  d %extra_argumen
111d0 74 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46  t */..  sqlite3F
111e0 74 73 35 50 61 72 73 65 72 43 54 58 5f 53 44 45  ts5ParserCTX_SDE
111f0 43 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  CL              
11200 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
11210 68 6f 6c 64 20 25 65 78 74 72 61 5f 63 6f 6e 74  hold %extra_cont
11220 65 78 74 20 2a 2f 0d 0a 23 69 66 20 66 74 73 35  ext */..#if fts5
11230 59 59 53 54 41 43 4b 44 45 50 54 48 3c 3d 30 0d  YYSTACKDEPTH<=0.
11240 0a 20 20 69 6e 74 20 66 74 73 35 79 79 73 74 6b  .  int fts5yystk
11250 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
11260 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
11270 73 69 64 65 20 6f 66 20 74 68 65 20 73 74 61 63  side of the stac
11280 6b 20 2a 2f 0d 0a 20 20 66 74 73 35 79 79 53 74  k */..  fts5yySt
11290 61 63 6b 45 6e 74 72 79 20 2a 66 74 73 35 79 79  ackEntry *fts5yy
112a0 73 74 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  stack;        /*
112b0 20 54 68 65 20 70 61 72 73 65 72 27 73 20 73 74   The parser's st
112c0 61 63 6b 20 2a 2f 0d 0a 20 20 66 74 73 35 79 79  ack */..  fts5yy
112d0 53 74 61 63 6b 45 6e 74 72 79 20 66 74 73 35 79  StackEntry fts5y
112e0 79 73 74 6b 30 3b 20 20 20 20 20 20 20 20 20 20  ystk0;          
112f0 2f 2a 20 46 69 72 73 74 20 73 74 61 63 6b 20 65  /* First stack e
11300 6e 74 72 79 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a  ntry */..#else..
11310 20 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74    fts5yyStackEnt
11320 72 79 20 66 74 73 35 79 79 73 74 61 63 6b 5b 66  ry fts5yystack[f
11330 74 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 5d  ts5YYSTACKDEPTH]
11340 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72  ;  /* The parser
11350 27 73 20 73 74 61 63 6b 20 2a 2f 0d 0a 20 20 66  's stack */..  f
11360 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20  ts5yyStackEntry 
11370 2a 66 74 73 35 79 79 73 74 61 63 6b 45 6e 64 3b  *fts5yystackEnd;
11380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11390 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
113a0 20 73 74 61 63 6b 20 2a 2f 0d 0a 23 65 6e 64 69   stack */..#endi
113b0 66 0d 0a 7d 3b 0d 0a 74 79 70 65 64 65 66 20 73  f..};..typedef s
113c0 74 72 75 63 74 20 66 74 73 35 79 79 50 61 72 73  truct fts5yyPars
113d0 65 72 20 66 74 73 35 79 79 50 61 72 73 65 72 3b  er fts5yyParser;
113e0 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ....#ifndef NDEB
113f0 55 47 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  UG..#include <st
11400 64 69 6f 2e 68 3e 0d 0a 73 74 61 74 69 63 20 46  dio.h>..static F
11410 49 4c 45 20 2a 66 74 73 35 79 79 54 72 61 63 65  ILE *fts5yyTrace
11420 46 49 4c 45 20 3d 20 30 3b 0d 0a 73 74 61 74 69  FILE = 0;..stati
11430 63 20 63 68 61 72 20 2a 66 74 73 35 79 79 54 72  c char *fts5yyTr
11440 61 63 65 50 72 6f 6d 70 74 20 3d 20 30 3b 0d 0a  acePrompt = 0;..
11450 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
11460 20 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e   */....#ifndef N
11470 44 45 42 55 47 0d 0a 2f 2a 20 0d 0a 2a 2a 20 54  DEBUG../* ..** T
11480 75 72 6e 20 70 61 72 73 65 72 20 74 72 61 63 69  urn parser traci
11490 6e 67 20 6f 6e 20 62 79 20 67 69 76 69 6e 67 20  ng on by giving 
114a0 61 20 73 74 72 65 61 6d 20 74 6f 20 77 68 69 63  a stream to whic
114b0 68 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 74  h to write the t
114c0 72 61 63 65 0d 0a 2a 2a 20 61 6e 64 20 61 20 70  race..** and a p
114d0 72 6f 6d 70 74 20 74 6f 20 70 72 65 66 61 63 65  rompt to preface
114e0 20 65 61 63 68 20 74 72 61 63 65 20 6d 65 73 73   each trace mess
114f0 61 67 65 2e 20 20 54 72 61 63 69 6e 67 20 69 73  age.  Tracing is
11500 20 74 75 72 6e 65 64 20 6f 66 66 0d 0a 2a 2a 20   turned off..** 
11510 62 79 20 6d 61 6b 69 6e 67 20 65 69 74 68 65 72  by making either
11520 20 61 72 67 75 6d 65 6e 74 20 4e 55 4c 4c 20 0d   argument NULL .
11530 0a 2a 2a 0d 0a 2a 2a 20 49 6e 70 75 74 73 3a 0d  .**..** Inputs:.
11540 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69  .** <ul>..** <li
11550 3e 20 41 20 46 49 4c 45 2a 20 74 6f 20 77 68 69  > A FILE* to whi
11560 63 68 20 74 72 61 63 65 20 6f 75 74 70 75 74 20  ch trace output 
11570 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
11580 6e 2e 0d 0a 2a 2a 20 20 20 20 20 20 49 66 20 4e  n...**      If N
11590 55 4c 4c 2c 20 74 68 65 6e 20 74 72 61 63 69 6e  ULL, then tracin
115a0 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2e  g is turned off.
115b0 0d 0a 2a 2a 20 3c 6c 69 3e 20 41 20 70 72 65 66  ..** <li> A pref
115c0 69 78 20 73 74 72 69 6e 67 20 77 72 69 74 74 65  ix string writte
115d0 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
115e0 6e 67 20 6f 66 20 65 76 65 72 79 0d 0a 2a 2a 20  ng of every..** 
115f0 20 20 20 20 20 6c 69 6e 65 20 6f 66 20 74 72 61       line of tra
11600 63 65 20 6f 75 74 70 75 74 2e 20 20 49 66 20 4e  ce output.  If N
11610 55 4c 4c 2c 20 74 68 65 6e 20 74 72 61 63 69 6e  ULL, then tracin
11620 67 20 69 73 0d 0a 2a 2a 20 20 20 20 20 20 74 75  g is..**      tu
11630 72 6e 65 64 20 6f 66 66 2e 0d 0a 2a 2a 20 3c 2f  rned off...** </
11640 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 75 74 70  ul>..**..** Outp
11650 75 74 73 3a 0d 0a 2a 2a 20 4e 6f 6e 65 2e 0d 0a  uts:..** None...
11660 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
11670 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
11680 72 54 72 61 63 65 28 46 49 4c 45 20 2a 54 72 61  rTrace(FILE *Tra
11690 63 65 46 49 4c 45 2c 20 63 68 61 72 20 2a 7a 54  ceFILE, char *zT
116a0 72 61 63 65 50 72 6f 6d 70 74 29 7b 0d 0a 20 20  racePrompt){..  
116b0 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20  fts5yyTraceFILE 
116c0 3d 20 54 72 61 63 65 46 49 4c 45 3b 0d 0a 20 20  = TraceFILE;..  
116d0 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70  fts5yyTracePromp
116e0 74 20 3d 20 7a 54 72 61 63 65 50 72 6f 6d 70 74  t = zTracePrompt
116f0 3b 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 54  ;..  if( fts5yyT
11700 72 61 63 65 46 49 4c 45 3d 3d 30 20 29 20 66 74  raceFILE==0 ) ft
11710 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 20  s5yyTracePrompt 
11720 3d 20 30 3b 0d 0a 20 20 65 6c 73 65 20 69 66 28  = 0;..  else if(
11730 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d   fts5yyTraceProm
11740 70 74 3d 3d 30 20 29 20 66 74 73 35 79 79 54 72  pt==0 ) fts5yyTr
11750 61 63 65 46 49 4c 45 20 3d 20 30 3b 0d 0a 7d 0d  aceFILE = 0;..}.
11760 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
11770 47 20 2a 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69  G */....#if defi
11780 6e 65 64 28 66 74 73 35 59 59 43 4f 56 45 52 41  ned(fts5YYCOVERA
11790 47 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  GE) || !defined(
117a0 4e 44 45 42 55 47 29 0d 0a 2f 2a 20 46 6f 72 20  NDEBUG)../* For 
117b0 74 72 61 63 69 6e 67 20 73 68 69 66 74 73 2c 20  tracing shifts, 
117c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
117d0 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
117e0 6f 6e 74 65 72 6d 69 6e 61 6c 73 0d 0a 2a 2a 20  onterminals..** 
117f0 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 20 54  are required.  T
11800 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
11810 6c 65 20 73 75 70 70 6c 69 65 73 20 74 68 65 73  le supplies thes
11820 65 20 6e 61 6d 65 73 20 2a 2f 0d 0a 73 74 61 74  e names */..stat
11830 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
11840 6f 6e 73 74 20 66 74 73 35 79 79 54 6f 6b 65 6e  onst fts5yyToken
11850 4e 61 6d 65 5b 5d 20 3d 20 7b 20 0d 0a 20 20 2f  Name[] = { ..  /
11860 2a 20 20 20 20 30 20 2a 2f 20 22 24 22 2c 0d 0a  *    0 */ "$",..
11870 20 20 2f 2a 20 20 20 20 31 20 2a 2f 20 22 4f 52    /*    1 */ "OR
11880 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 32 20 2a 2f  ",..  /*    2 */
11890 20 22 41 4e 44 22 2c 0d 0a 20 20 2f 2a 20 20 20   "AND",..  /*   
118a0 20 33 20 2a 2f 20 22 4e 4f 54 22 2c 0d 0a 20 20   3 */ "NOT",..  
118b0 2f 2a 20 20 20 20 34 20 2a 2f 20 22 54 45 52 4d  /*    4 */ "TERM
118c0 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 35 20 2a 2f  ",..  /*    5 */
118d0 20 22 43 4f 4c 4f 4e 22 2c 0d 0a 20 20 2f 2a 20   "COLON",..  /* 
118e0 20 20 20 36 20 2a 2f 20 22 4d 49 4e 55 53 22 2c     6 */ "MINUS",
118f0 0d 0a 20 20 2f 2a 20 20 20 20 37 20 2a 2f 20 22  ..  /*    7 */ "
11900 4c 43 50 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 38  LCP",..  /*    8
11910 20 2a 2f 20 22 52 43 50 22 2c 0d 0a 20 20 2f 2a   */ "RCP",..  /*
11920 20 20 20 20 39 20 2a 2f 20 22 53 54 52 49 4e 47      9 */ "STRING
11930 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 30 20 2a 2f  ",..  /*   10 */
11940 20 22 4c 50 22 2c 0d 0a 20 20 2f 2a 20 20 20 31   "LP",..  /*   1
11950 31 20 2a 2f 20 22 52 50 22 2c 0d 0a 20 20 2f 2a  1 */ "RP",..  /*
11960 20 20 20 31 32 20 2a 2f 20 22 43 41 52 45 54 22     12 */ "CARET"
11970 2c 0d 0a 20 20 2f 2a 20 20 20 31 33 20 2a 2f 20  ,..  /*   13 */ 
11980 22 43 4f 4d 4d 41 22 2c 0d 0a 20 20 2f 2a 20 20  "COMMA",..  /*  
11990 20 31 34 20 2a 2f 20 22 50 4c 55 53 22 2c 0d 0a   14 */ "PLUS",..
119a0 20 20 2f 2a 20 20 20 31 35 20 2a 2f 20 22 53 54    /*   15 */ "ST
119b0 41 52 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 36 20  AR",..  /*   16 
119c0 2a 2f 20 22 69 6e 70 75 74 22 2c 0d 0a 20 20 2f  */ "input",..  /
119d0 2a 20 20 20 31 37 20 2a 2f 20 22 65 78 70 72 22  *   17 */ "expr"
119e0 2c 0d 0a 20 20 2f 2a 20 20 20 31 38 20 2a 2f 20  ,..  /*   18 */ 
119f0 22 63 6e 65 61 72 73 65 74 22 2c 0d 0a 20 20 2f  "cnearset",..  /
11a00 2a 20 20 20 31 39 20 2a 2f 20 22 65 78 70 72 6c  *   19 */ "exprl
11a10 69 73 74 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 30  ist",..  /*   20
11a20 20 2a 2f 20 22 63 6f 6c 73 65 74 22 2c 0d 0a 20   */ "colset",.. 
11a30 20 2f 2a 20 20 20 32 31 20 2a 2f 20 22 63 6f 6c   /*   21 */ "col
11a40 73 65 74 6c 69 73 74 22 2c 0d 0a 20 20 2f 2a 20  setlist",..  /* 
11a50 20 20 32 32 20 2a 2f 20 22 6e 65 61 72 73 65 74    22 */ "nearset
11a60 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 33 20 2a 2f  ",..  /*   23 */
11a70 20 22 6e 65 61 72 70 68 72 61 73 65 73 22 2c 0d   "nearphrases",.
11a80 0a 20 20 2f 2a 20 20 20 32 34 20 2a 2f 20 22 70  .  /*   24 */ "p
11a90 68 72 61 73 65 22 2c 0d 0a 20 20 2f 2a 20 20 20  hrase",..  /*   
11aa0 32 35 20 2a 2f 20 22 6e 65 61 72 64 69 73 74 5f  25 */ "neardist_
11ab0 6f 70 74 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 36  opt",..  /*   26
11ac0 20 2a 2f 20 22 73 74 61 72 5f 6f 70 74 22 2c 0d   */ "star_opt",.
11ad0 0a 7d 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  .};..#endif /* d
11ae0 65 66 69 6e 65 64 28 66 74 73 35 59 59 43 4f 56  efined(fts5YYCOV
11af0 45 52 41 47 45 29 20 7c 7c 20 21 64 65 66 69 6e  ERAGE) || !defin
11b00 65 64 28 4e 44 45 42 55 47 29 20 2a 2f 0d 0a 0d  ed(NDEBUG) */...
11b10 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d  .#ifndef NDEBUG.
11b20 0a 2f 2a 20 46 6f 72 20 74 72 61 63 69 6e 67 20  ./* For tracing 
11b30 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
11b40 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
11b50 20 72 75 6c 65 73 20 61 72 65 20 72 65 71 75 69   rules are requi
11b60 72 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  red...*/..static
11b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
11b80 73 74 20 66 74 73 35 79 79 52 75 6c 65 4e 61 6d  st fts5yyRuleNam
11b90 65 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 30  e[] = {.. /*   0
11ba0 20 2a 2f 20 22 69 6e 70 75 74 20 3a 3a 3d 20 65   */ "input ::= e
11bb0 78 70 72 22 2c 0d 0a 20 2f 2a 20 20 20 31 20 2a  xpr",.. /*   1 *
11bc0 2f 20 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49  / "colset ::= MI
11bd0 4e 55 53 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69  NUS LCP colsetli
11be0 73 74 20 52 43 50 22 2c 0d 0a 20 2f 2a 20 20 20  st RCP",.. /*   
11bf0 32 20 2a 2f 20 22 63 6f 6c 73 65 74 20 3a 3a 3d  2 */ "colset ::=
11c00 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 20   LCP colsetlist 
11c10 52 43 50 22 2c 0d 0a 20 2f 2a 20 20 20 33 20 2a  RCP",.. /*   3 *
11c20 2f 20 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 53 54  / "colset ::= ST
11c30 52 49 4e 47 22 2c 0d 0a 20 2f 2a 20 20 20 34 20  RING",.. /*   4 
11c40 2a 2f 20 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d  */ "colset ::= M
11c50 49 4e 55 53 20 53 54 52 49 4e 47 22 2c 0d 0a 20  INUS STRING",.. 
11c60 2f 2a 20 20 20 35 20 2a 2f 20 22 63 6f 6c 73 65  /*   5 */ "colse
11c70 74 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 73 65 74  tlist ::= colset
11c80 6c 69 73 74 20 53 54 52 49 4e 47 22 2c 0d 0a 20  list STRING",.. 
11c90 2f 2a 20 20 20 36 20 2a 2f 20 22 63 6f 6c 73 65  /*   6 */ "colse
11ca0 74 6c 69 73 74 20 3a 3a 3d 20 53 54 52 49 4e 47  tlist ::= STRING
11cb0 22 2c 0d 0a 20 2f 2a 20 20 20 37 20 2a 2f 20 22  ",.. /*   7 */ "
11cc0 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20 41 4e  expr ::= expr AN
11cd0 44 20 65 78 70 72 22 2c 0d 0a 20 2f 2a 20 20 20  D expr",.. /*   
11ce0 38 20 2a 2f 20 22 65 78 70 72 20 3a 3a 3d 20 65  8 */ "expr ::= e
11cf0 78 70 72 20 4f 52 20 65 78 70 72 22 2c 0d 0a 20  xpr OR expr",.. 
11d00 2f 2a 20 20 20 39 20 2a 2f 20 22 65 78 70 72 20  /*   9 */ "expr 
11d10 3a 3a 3d 20 65 78 70 72 20 4e 4f 54 20 65 78 70  ::= expr NOT exp
11d20 72 22 2c 0d 0a 20 2f 2a 20 20 31 30 20 2a 2f 20  r",.. /*  10 */ 
11d30 22 65 78 70 72 20 3a 3a 3d 20 63 6f 6c 73 65 74  "expr ::= colset
11d40 20 43 4f 4c 4f 4e 20 4c 50 20 65 78 70 72 20 52   COLON LP expr R
11d50 50 22 2c 0d 0a 20 2f 2a 20 20 31 31 20 2a 2f 20  P",.. /*  11 */ 
11d60 22 65 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78 70  "expr ::= LP exp
11d70 72 20 52 50 22 2c 0d 0a 20 2f 2a 20 20 31 32 20  r RP",.. /*  12 
11d80 2a 2f 20 22 65 78 70 72 20 3a 3a 3d 20 65 78 70  */ "expr ::= exp
11d90 72 6c 69 73 74 22 2c 0d 0a 20 2f 2a 20 20 31 33  rlist",.. /*  13
11da0 20 2a 2f 20 22 65 78 70 72 6c 69 73 74 20 3a 3a   */ "exprlist ::
11db0 3d 20 63 6e 65 61 72 73 65 74 22 2c 0d 0a 20 2f  = cnearset",.. /
11dc0 2a 20 20 31 34 20 2a 2f 20 22 65 78 70 72 6c 69  *  14 */ "exprli
11dd0 73 74 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74 20  st ::= exprlist 
11de0 63 6e 65 61 72 73 65 74 22 2c 0d 0a 20 2f 2a 20  cnearset",.. /* 
11df0 20 31 35 20 2a 2f 20 22 63 6e 65 61 72 73 65 74   15 */ "cnearset
11e00 20 3a 3a 3d 20 6e 65 61 72 73 65 74 22 2c 0d 0a   ::= nearset",..
11e10 20 2f 2a 20 20 31 36 20 2a 2f 20 22 63 6e 65 61   /*  16 */ "cnea
11e20 72 73 65 74 20 3a 3a 3d 20 63 6f 6c 73 65 74 20  rset ::= colset 
11e30 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74 22 2c 0d  COLON nearset",.
11e40 0a 20 2f 2a 20 20 31 37 20 2a 2f 20 22 6e 65 61  . /*  17 */ "nea
11e50 72 73 65 74 20 3a 3a 3d 20 70 68 72 61 73 65 22  rset ::= phrase"
11e60 2c 0d 0a 20 2f 2a 20 20 31 38 20 2a 2f 20 22 6e  ,.. /*  18 */ "n
11e70 65 61 72 73 65 74 20 3a 3a 3d 20 43 41 52 45 54  earset ::= CARET
11e80 20 70 68 72 61 73 65 22 2c 0d 0a 20 2f 2a 20 20   phrase",.. /*  
11e90 31 39 20 2a 2f 20 22 6e 65 61 72 73 65 74 20 3a  19 */ "nearset :
11ea0 3a 3d 20 53 54 52 49 4e 47 20 4c 50 20 6e 65 61  := STRING LP nea
11eb0 72 70 68 72 61 73 65 73 20 6e 65 61 72 64 69 73  rphrases neardis
11ec0 74 5f 6f 70 74 20 52 50 22 2c 0d 0a 20 2f 2a 20  t_opt RP",.. /* 
11ed0 20 32 30 20 2a 2f 20 22 6e 65 61 72 70 68 72 61   20 */ "nearphra
11ee0 73 65 73 20 3a 3a 3d 20 70 68 72 61 73 65 22 2c  ses ::= phrase",
11ef0 0d 0a 20 2f 2a 20 20 32 31 20 2a 2f 20 22 6e 65  .. /*  21 */ "ne
11f00 61 72 70 68 72 61 73 65 73 20 3a 3a 3d 20 6e 65  arphrases ::= ne
11f10 61 72 70 68 72 61 73 65 73 20 70 68 72 61 73 65  arphrases phrase
11f20 22 2c 0d 0a 20 2f 2a 20 20 32 32 20 2a 2f 20 22  ",.. /*  22 */ "
11f30 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d  neardist_opt ::=
11f40 22 2c 0d 0a 20 2f 2a 20 20 32 33 20 2a 2f 20 22  ",.. /*  23 */ "
11f50 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d  neardist_opt ::=
11f60 20 43 4f 4d 4d 41 20 53 54 52 49 4e 47 22 2c 0d   COMMA STRING",.
11f70 0a 20 2f 2a 20 20 32 34 20 2a 2f 20 22 70 68 72  . /*  24 */ "phr
11f80 61 73 65 20 3a 3a 3d 20 70 68 72 61 73 65 20 50  ase ::= phrase P
11f90 4c 55 53 20 53 54 52 49 4e 47 20 73 74 61 72 5f  LUS STRING star_
11fa0 6f 70 74 22 2c 0d 0a 20 2f 2a 20 20 32 35 20 2a  opt",.. /*  25 *
11fb0 2f 20 22 70 68 72 61 73 65 20 3a 3a 3d 20 53 54  / "phrase ::= ST
11fc0 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 22 2c 0d  RING star_opt",.
11fd0 0a 20 2f 2a 20 20 32 36 20 2a 2f 20 22 73 74 61  . /*  26 */ "sta
11fe0 72 5f 6f 70 74 20 3a 3a 3d 20 53 54 41 52 22 2c  r_opt ::= STAR",
11ff0 0d 0a 20 2f 2a 20 20 32 37 20 2a 2f 20 22 73 74  .. /*  27 */ "st
12000 61 72 5f 6f 70 74 20 3a 3a 3d 22 2c 0d 0a 7d 3b  ar_opt ::=",..};
12010 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  ..#endif /* NDEB
12020 55 47 20 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 20 66  UG */......#if f
12030 74 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 3c  ts5YYSTACKDEPTH<
12040 3d 30 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 79 20 74  =0../*..** Try t
12050 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  o increase the s
12060 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ize of the parse
12070 72 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  r stack.  Return
12080 20 74 68 65 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20   the number..** 
12090 6f 66 20 65 72 72 6f 72 73 2e 20 20 52 65 74 75  of errors.  Retu
120a0 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
120b0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
120c0 20 66 74 73 35 79 79 47 72 6f 77 53 74 61 63 6b   fts5yyGrowStack
120d0 28 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 70  (fts5yyParser *p
120e0 29 7b 0d 0a 20 20 69 6e 74 20 6e 65 77 53 69 7a  ){..  int newSiz
120f0 65 3b 0d 0a 20 20 69 6e 74 20 69 64 78 3b 0d 0a  e;..  int idx;..
12100 20 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74    fts5yyStackEnt
12110 72 79 20 2a 70 4e 65 77 3b 0d 0a 0d 0a 20 20 6e  ry *pNew;....  n
12120 65 77 53 69 7a 65 20 3d 20 70 2d 3e 66 74 73 35  ewSize = p->fts5
12130 79 79 73 74 6b 73 7a 2a 32 20 2b 20 31 30 30 3b  yystksz*2 + 100;
12140 0d 0a 20 20 69 64 78 20 3d 20 70 2d 3e 66 74 73  ..  idx = p->fts
12150 35 79 79 74 6f 73 20 3f 20 28 69 6e 74 29 28 70  5yytos ? (int)(p
12160 2d 3e 66 74 73 35 79 79 74 6f 73 20 2d 20 70 2d  ->fts5yytos - p-
12170 3e 66 74 73 35 79 79 73 74 61 63 6b 29 20 3a 20  >fts5yystack) : 
12180 30 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 66 74 73  0;..  if( p->fts
12190 35 79 79 73 74 61 63 6b 3d 3d 26 70 2d 3e 66 74  5yystack==&p->ft
121a0 73 35 79 79 73 74 6b 30 20 29 7b 0d 0a 20 20 20  s5yystk0 ){..   
121b0 20 70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 6e   pNew = malloc(n
121c0 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70 4e  ewSize*sizeof(pN
121d0 65 77 5b 30 5d 29 29 3b 0d 0a 20 20 20 20 69 66  ew[0]));..    if
121e0 28 20 70 4e 65 77 20 29 20 70 4e 65 77 5b 30 5d  ( pNew ) pNew[0]
121f0 20 3d 20 70 2d 3e 66 74 73 35 79 79 73 74 6b 30   = p->fts5yystk0
12200 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
12210 20 70 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28   pNew = realloc(
12220 70 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 2c 20  p->fts5yystack, 
12230 6e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  newSize*sizeof(p
12240 4e 65 77 5b 30 5d 29 29 3b 0d 0a 20 20 7d 0d 0a  New[0]));..  }..
12250 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0d 0a 20    if( pNew ){.. 
12260 20 20 20 70 2d 3e 66 74 73 35 79 79 73 74 61 63     p->fts5yystac
12270 6b 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20 20 70  k = pNew;..    p
12280 2d 3e 66 74 73 35 79 79 74 6f 73 20 3d 20 26 70  ->fts5yytos = &p
12290 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 5b 69 64  ->fts5yystack[id
122a0 78 5d 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45  x];..#ifndef NDE
122b0 42 55 47 0d 0a 20 20 20 20 69 66 28 20 66 74 73  BUG..    if( fts
122c0 35 79 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d  5yyTraceFILE ){.
122d0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
122e0 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22  ts5yyTraceFILE,"
122f0 25 73 53 74 61 63 6b 20 67 72 6f 77 73 20 66 72  %sStack grows fr
12300 6f 6d 20 25 64 20 74 6f 20 25 64 20 65 6e 74 72  om %d to %d entr
12310 69 65 73 2e 5c 6e 22 2c 0d 0a 20 20 20 20 20 20  ies.\n",..      
12320 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54 72          fts5yyTr
12330 61 63 65 50 72 6f 6d 70 74 2c 20 70 2d 3e 66 74  acePrompt, p->ft
12340 73 35 79 79 73 74 6b 73 7a 2c 20 6e 65 77 53 69  s5yystksz, newSi
12350 7a 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e  ze);..    }..#en
12360 64 69 66 0d 0a 20 20 20 20 70 2d 3e 66 74 73 35  dif..    p->fts5
12370 79 79 73 74 6b 73 7a 20 3d 20 6e 65 77 53 69 7a  yystksz = newSiz
12380 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72  e;..  }..  retur
12390 6e 20 70 4e 65 77 3d 3d 30 3b 20 0d 0a 7d 0d 0a  n pNew==0; ..}..
123a0 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 44 61 74  #endif..../* Dat
123b0 61 74 79 70 65 20 6f 66 20 74 68 65 20 61 72 67  atype of the arg
123c0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d 65 6d  ument to the mem
123d0 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  ory allocated pa
123e0 73 73 65 64 20 61 73 20 74 68 65 0d 0a 2a 2a 20  ssed as the..** 
123f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12400 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  to sqlite3Fts5Pa
12410 72 73 65 72 41 6c 6c 6f 63 28 29 20 62 65 6c 6f  rserAlloc() belo
12420 77 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  w.  This can be 
12430 63 68 61 6e 67 65 64 20 62 79 0d 0a 2a 2a 20 70  changed by..** p
12440 75 74 74 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  utting an approp
12450 72 69 61 74 65 20 23 64 65 66 69 6e 65 20 69 6e  riate #define in
12460 20 74 68 65 20 25 69 6e 63 6c 75 64 65 20 73 65   the %include se
12470 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70  ction of the inp
12480 75 74 0d 0a 2a 2a 20 67 72 61 6d 6d 61 72 2e 0d  ut..** grammar..
12490 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 66 74 73  .*/..#ifndef fts
124a0 35 59 59 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45  5YYMALLOCARGTYPE
124b0 0d 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 59  ..# define fts5Y
124c0 59 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45 20 73  YMALLOCARGTYPE s
124d0 69 7a 65 5f 74 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ize_t..#endif...
124e0 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  ./* Initialize a
124f0 20 6e 65 77 20 70 61 72 73 65 72 20 74 68 61 74   new parser that
12500 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
12510 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0d 0a 2a 2f  n allocated...*/
12520 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
12530 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 49  lite3Fts5ParserI
12540 6e 69 74 28 76 6f 69 64 20 2a 66 74 73 35 79 79  nit(void *fts5yy
12550 70 52 61 77 50 61 72 73 65 72 20 73 71 6c 69 74  pRawParser sqlit
12560 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f  e3Fts5ParserCTX_
12570 50 44 45 43 4c 29 7b 0d 0a 20 20 66 74 73 35 79  PDECL){..  fts5y
12580 79 50 61 72 73 65 72 20 2a 66 74 73 35 79 79 70  yParser *fts5yyp
12590 50 61 72 73 65 72 20 3d 20 28 66 74 73 35 79 79  Parser = (fts5yy
125a0 50 61 72 73 65 72 2a 29 66 74 73 35 79 79 70 52  Parser*)fts5yypR
125b0 61 77 50 61 72 73 65 72 3b 0d 0a 20 20 73 71 6c  awParser;..  sql
125c0 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
125d0 58 5f 53 54 4f 52 45 0d 0a 23 69 66 64 65 66 20  X_STORE..#ifdef 
125e0 66 74 73 35 59 59 54 52 41 43 4b 4d 41 58 53 54  fts5YYTRACKMAXST
125f0 41 43 4b 44 45 50 54 48 0d 0a 20 20 66 74 73 35  ACKDEPTH..  fts5
12600 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
12610 79 68 77 6d 20 3d 20 30 3b 0d 0a 23 65 6e 64 69  yhwm = 0;..#endi
12620 66 0d 0a 23 69 66 20 66 74 73 35 59 59 53 54 41  f..#if fts5YYSTA
12630 43 4b 44 45 50 54 48 3c 3d 30 0d 0a 20 20 66 74  CKDEPTH<=0..  ft
12640 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
12650 35 79 79 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0d 0a  5yytos = NULL;..
12660 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d    fts5yypParser-
12670 3e 66 74 73 35 79 79 73 74 61 63 6b 20 3d 20 4e  >fts5yystack = N
12680 55 4c 4c 3b 0d 0a 20 20 66 74 73 35 79 79 70 50  ULL;..  fts5yypP
12690 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 6b  arser->fts5yystk
126a0 73 7a 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 66  sz = 0;..  if( f
126b0 74 73 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66  ts5yyGrowStack(f
126c0 74 73 35 79 79 70 50 61 72 73 65 72 29 20 29 7b  ts5yypParser) ){
126d0 0d 0a 20 20 20 20 66 74 73 35 79 79 70 50 61 72  ..    fts5yypPar
126e0 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b  ser->fts5yystack
126f0 20 3d 20 26 66 74 73 35 79 79 70 50 61 72 73 65   = &fts5yypParse
12700 72 2d 3e 66 74 73 35 79 79 73 74 6b 30 3b 0d 0a  r->fts5yystk0;..
12710 20 20 20 20 66 74 73 35 79 79 70 50 61 72 73 65      fts5yypParse
12720 72 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 20 3d  r->fts5yystksz =
12730 20 31 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66   1;..  }..#endif
12740 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59 59  ..#ifndef fts5YY
12750 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 0d  NOERRORRECOVERY.
12760 0a 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72  .  fts5yypParser
12770 2d 3e 66 74 73 35 79 79 65 72 72 63 6e 74 20 3d  ->fts5yyerrcnt =
12780 20 2d 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20   -1;..#endif..  
12790 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
127a0 74 73 35 79 79 74 6f 73 20 3d 20 66 74 73 35 79  ts5yytos = fts5y
127b0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
127c0 73 74 61 63 6b 3b 0d 0a 20 20 66 74 73 35 79 79  stack;..  fts5yy
127d0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
127e0 74 61 63 6b 5b 30 5d 2e 73 74 61 74 65 6e 6f 20  tack[0].stateno 
127f0 3d 20 30 3b 0d 0a 20 20 66 74 73 35 79 79 70 50  = 0;..  fts5yypP
12800 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
12810 63 6b 5b 30 5d 2e 6d 61 6a 6f 72 20 3d 20 30 3b  ck[0].major = 0;
12820 0d 0a 23 69 66 20 66 74 73 35 59 59 53 54 41 43  ..#if fts5YYSTAC
12830 4b 44 45 50 54 48 3e 30 0d 0a 20 20 66 74 73 35  KDEPTH>0..  fts5
12840 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
12850 79 73 74 61 63 6b 45 6e 64 20 3d 20 26 66 74 73  ystackEnd = &fts
12860 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
12870 79 79 73 74 61 63 6b 5b 66 74 73 35 59 59 53 54  yystack[fts5YYST
12880 41 43 4b 44 45 50 54 48 2d 31 5d 3b 0d 0a 23 65  ACKDEPTH-1];..#e
12890 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64  ndif..}....#ifnd
128a0 65 66 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  ef sqlite3Fts5Pa
128b0 72 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59  rser_ENGINEALWAY
128c0 53 4f 4e 53 54 41 43 4b 0d 0a 2f 2a 20 0d 0a 2a  SONSTACK../* ..*
128d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
128e0 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20  allocates a new 
128f0 70 61 72 73 65 72 2e 0d 0a 2a 2a 20 54 68 65 20  parser...** The 
12900 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
12910 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
12920 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 77  function which w
12930 6f 72 6b 73 20 6c 69 6b 65 0d 0a 2a 2a 20 6d 61  orks like..** ma
12940 6c 6c 6f 63 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e  lloc...**..** In
12950 70 75 74 73 3a 0d 0a 2a 2a 20 41 20 70 6f 69 6e  puts:..** A poin
12960 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ter to the funct
12970 69 6f 6e 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  ion used to allo
12980 63 61 74 65 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a  cate memory...**
12990 0d 0a 2a 2a 20 4f 75 74 70 75 74 73 3a 0d 0a 2a  ..** Outputs:..*
129a0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
129b0 20 70 61 72 73 65 72 2e 20 20 54 68 69 73 20 70   parser.  This p
129c0 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 69  ointer is used i
129d0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  n subsequent cal
129e0 6c 73 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  ls..** to sqlite
129f0 33 46 74 73 35 50 61 72 73 65 72 20 61 6e 64 20  3Fts5Parser and 
12a00 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
12a10 72 46 72 65 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  rFree...*/..stat
12a20 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
12a30 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63 28  Fts5ParserAlloc(
12a40 76 6f 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50 72  void *(*mallocPr
12a50 6f 63 29 28 66 74 73 35 59 59 4d 41 4c 4c 4f 43  oc)(fts5YYMALLOC
12a60 41 52 47 54 59 50 45 29 20 73 71 6c 69 74 65 33  ARGTYPE) sqlite3
12a70 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 50 44  Fts5ParserCTX_PD
12a80 45 43 4c 29 7b 0d 0a 20 20 66 74 73 35 79 79 50  ECL){..  fts5yyP
12a90 61 72 73 65 72 20 2a 66 74 73 35 79 79 70 50 61  arser *fts5yypPa
12aa0 72 73 65 72 3b 0d 0a 20 20 66 74 73 35 79 79 70  rser;..  fts5yyp
12ab0 50 61 72 73 65 72 20 3d 20 28 66 74 73 35 79 79  Parser = (fts5yy
12ac0 50 61 72 73 65 72 2a 29 28 2a 6d 61 6c 6c 6f 63  Parser*)(*malloc
12ad0 50 72 6f 63 29 28 20 28 66 74 73 35 59 59 4d 41  Proc)( (fts5YYMA
12ae0 4c 4c 4f 43 41 52 47 54 59 50 45 29 73 69 7a 65  LLOCARGTYPE)size
12af0 6f 66 28 66 74 73 35 79 79 50 61 72 73 65 72 29  of(fts5yyParser)
12b00 20 29 3b 0d 0a 20 20 69 66 28 20 66 74 73 35 79   );..  if( fts5y
12b10 79 70 50 61 72 73 65 72 20 29 7b 0d 0a 20 20 20  ypParser ){..   
12b20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12b30 65 72 43 54 58 5f 53 54 4f 52 45 0d 0a 20 20 20  erCTX_STORE..   
12b40 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12b50 65 72 49 6e 69 74 28 66 74 73 35 79 79 70 50 61  erInit(fts5yypPa
12b60 72 73 65 72 20 73 71 6c 69 74 65 33 46 74 73 35  rser sqlite3Fts5
12b70 50 61 72 73 65 72 43 54 58 5f 50 41 52 41 4d 29  ParserCTX_PARAM)
12b80 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
12b90 20 28 76 6f 69 64 2a 29 66 74 73 35 79 79 70 50   (void*)fts5yypP
12ba0 61 72 73 65 72 3b 0d 0a 7d 0d 0a 23 65 6e 64 69  arser;..}..#endi
12bb0 66 20 2f 2a 20 73 71 6c 69 74 65 33 46 74 73 35  f /* sqlite3Fts5
12bc0 50 61 72 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57  Parser_ENGINEALW
12bd0 41 59 53 4f 4e 53 54 41 43 4b 20 2a 2f 0d 0a 0d  AYSONSTACK */...
12be0 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .../* The follow
12bf0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c  ing function del
12c00 65 74 65 73 20 74 68 65 20 22 6d 69 6e 6f 72 20  etes the "minor 
12c10 74 79 70 65 22 20 6f 72 20 73 65 6d 61 6e 74 69  type" or semanti
12c20 63 20 76 61 6c 75 65 0d 0a 2a 2a 20 61 73 73 6f  c value..** asso
12c30 63 69 61 74 65 64 20 77 69 74 68 20 61 20 73 79  ciated with a sy
12c40 6d 62 6f 6c 2e 20 20 54 68 65 20 73 79 6d 62 6f  mbol.  The symbo
12c50 6c 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  l can be either 
12c60 61 20 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 6f  a terminal..** o
12c70 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 22  r nonterminal. "
12c80 66 74 73 35 79 79 6d 61 6a 6f 72 22 20 69 73 20  fts5yymajor" is 
12c90 74 68 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 2c  the symbol code,
12ca0 20 61 6e 64 20 22 66 74 73 35 79 79 70 6d 69 6e   and "fts5yypmin
12cb0 6f 72 22 20 69 73 0d 0a 2a 2a 20 61 20 70 6f 69  or" is..** a poi
12cc0 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
12cd0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  e to be deleted.
12ce0 20 20 54 68 65 20 63 6f 64 65 20 75 73 65 64 20    The code used 
12cf0 74 6f 20 64 6f 20 74 68 65 20 0d 0a 2a 2a 20 64  to do the ..** d
12d00 65 6c 65 74 69 6f 6e 73 20 69 73 20 64 65 72 69  eletions is deri
12d10 76 65 64 20 66 72 6f 6d 20 74 68 65 20 25 64 65  ved from the %de
12d20 73 74 72 75 63 74 6f 72 20 61 6e 64 2f 6f 72 20  structor and/or 
12d30 25 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f  %token_destructo
12d40 72 0d 0a 2a 2a 20 64 69 72 65 63 74 69 76 65 73  r..** directives
12d50 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 67 72   of the input gr
12d60 61 6d 6d 61 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ammar...*/..stat
12d70 69 63 20 76 6f 69 64 20 66 74 73 35 79 79 5f 64  ic void fts5yy_d
12d80 65 73 74 72 75 63 74 6f 72 28 0d 0a 20 20 66 74  estructor(..  ft
12d90 73 35 79 79 50 61 72 73 65 72 20 2a 66 74 73 35  s5yyParser *fts5
12da0 79 79 70 50 61 72 73 65 72 2c 20 20 20 20 2f 2a  yypParser,    /*
12db0 20 54 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a   The parser */..
12dc0 20 20 66 74 73 35 59 59 43 4f 44 45 54 59 50 45    fts5YYCODETYPE
12dd0 20 66 74 73 35 79 79 6d 61 6a 6f 72 2c 20 20 20   fts5yymajor,   
12de0 20 20 2f 2a 20 54 79 70 65 20 63 6f 64 65 20 66    /* Type code f
12df0 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  or object to des
12e00 74 72 6f 79 20 2a 2f 0d 0a 20 20 66 74 73 35 59  troy */..  fts5Y
12e10 59 4d 49 4e 4f 52 54 59 50 45 20 2a 66 74 73 35  YMINORTYPE *fts5
12e20 79 79 70 6d 69 6e 6f 72 20 20 20 2f 2a 20 54 68  yypminor   /* Th
12e30 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 64  e object to be d
12e40 65 73 74 72 6f 79 65 64 20 2a 2f 0d 0a 29 7b 0d  estroyed */..){.
12e50 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
12e60 72 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a 20  rserARG_FETCH.. 
12e70 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12e80 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 20 20 73  erCTX_FETCH..  s
12e90 77 69 74 63 68 28 20 66 74 73 35 79 79 6d 61 6a  witch( fts5yymaj
12ea0 6f 72 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 48 65  or ){..    /* He
12eb0 72 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 74  re is inserted t
12ec0 68 65 20 61 63 74 69 6f 6e 73 20 77 68 69 63 68  he actions which
12ed0 20 74 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e   take place when
12ee0 20 61 0d 0a 20 20 20 20 2a 2a 20 74 65 72 6d 69   a..    ** termi
12ef0 6e 61 6c 20 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69  nal or non-termi
12f00 6e 61 6c 20 69 73 20 64 65 73 74 72 6f 79 65 64  nal is destroyed
12f10 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
12f20 65 6e 0d 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  en..    ** when 
12f30 74 68 65 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f  the symbol is po
12f40 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
12f50 61 63 6b 20 64 75 72 69 6e 67 20 61 0d 0a 20 20  ack during a..  
12f60 20 20 2a 2a 20 72 65 64 75 63 65 20 6f 72 20 64    ** reduce or d
12f70 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63  uring error proc
12f80 65 73 73 69 6e 67 20 6f 72 20 77 68 65 6e 20 61  essing or when a
12f90 20 70 61 72 73 65 72 20 69 73 20 0d 0a 20 20 20   parser is ..   
12fa0 20 2a 2a 20 62 65 69 6e 67 20 64 65 73 74 72 6f   ** being destro
12fb0 79 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  yed before it is
12fc0 20 66 69 6e 69 73 68 65 64 20 70 61 72 73 69 6e   finished parsin
12fd0 67 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20  g...    **..    
12fe0 2a 2a 20 4e 6f 74 65 3a 20 64 75 72 69 6e 67 20  ** Note: during 
12ff0 61 20 72 65 64 75 63 65 2c 20 74 68 65 20 6f 6e  a reduce, the on
13000 6c 79 20 73 79 6d 62 6f 6c 73 20 64 65 73 74 72  ly symbols destr
13010 6f 79 65 64 20 61 72 65 20 74 68 6f 73 65 0d 0a  oyed are those..
13020 20 20 20 20 2a 2a 20 77 68 69 63 68 20 61 70 70      ** which app
13030 65 61 72 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ear on the RHS o
13040 66 20 74 68 65 20 72 75 6c 65 2c 20 62 75 74 20  f the rule, but 
13050 77 68 69 63 68 20 61 72 65 20 2a 6e 6f 74 2a 20  which are *not* 
13060 75 73 65 64 0d 0a 20 20 20 20 2a 2a 20 69 6e 73  used..    ** ins
13070 69 64 65 20 74 68 65 20 43 20 63 6f 64 65 2e 0d  ide the C code..
13080 0a 20 20 20 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a  .    */../******
13090 2a 2a 2a 20 42 65 67 69 6e 20 64 65 73 74 72 75  *** Begin destru
130a0 63 74 6f 72 20 64 65 66 69 6e 69 74 69 6f 6e 73  ctor definitions
130b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20 63  ********/..    c
130e0 61 73 65 20 31 36 3a 20 2f 2a 20 69 6e 70 75 74  ase 16: /* input
130f0 20 2a 2f 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 38 33   */..{..#line 83
13100 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a   "fts5parse.y"..
13110 20 28 76 6f 69 64 29 70 50 61 72 73 65 3b 20 0d   (void)pParse; .
13120 0a 23 6c 69 6e 65 20 35 37 30 20 22 66 74 73 35  .#line 570 "fts5
13130 70 61 72 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20  parse.c"..}..   
13140 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63     break;..    c
13150 61 73 65 20 31 37 3a 20 2f 2a 20 65 78 70 72 20  ase 17: /* expr 
13160 2a 2f 0d 0a 20 20 20 20 63 61 73 65 20 31 38 3a  */..    case 18:
13170 20 2f 2a 20 63 6e 65 61 72 73 65 74 20 2a 2f 0d   /* cnearset */.
13180 0a 20 20 20 20 63 61 73 65 20 31 39 3a 20 2f 2a  .    case 19: /*
13190 20 65 78 70 72 6c 69 73 74 20 2a 2f 0d 0a 7b 0d   exprlist */..{.
131a0 0a 23 6c 69 6e 65 20 38 39 20 22 66 74 73 35 70  .#line 89 "fts5p
131b0 61 72 73 65 2e 79 22 0d 0a 20 73 71 6c 69 74 65  arse.y".. sqlite
131c0 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
131d0 65 65 28 28 66 74 73 35 79 79 70 6d 69 6e 6f 72  ee((fts5yypminor
131e0 2d 3e 66 74 73 35 79 79 32 34 29 29 3b 20 0d 0a  ->fts5yy24)); ..
131f0 23 6c 69 6e 65 20 35 37 39 20 22 66 74 73 35 70  #line 579 "fts5p
13200 61 72 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20  arse.c"..}..    
13210 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61    break;..    ca
13220 73 65 20 32 30 3a 20 2f 2a 20 63 6f 6c 73 65 74  se 20: /* colset
13230 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65 20 32 31   */..    case 21
13240 3a 20 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20  : /* colsetlist 
13250 2a 2f 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 39 33 20  */..{..#line 93 
13260 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 20  "fts5parse.y".. 
13270 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 66 74  sqlite3_free((ft
13280 73 35 79 79 70 6d 69 6e 6f 72 2d 3e 66 74 73 35  s5yypminor->fts5
13290 79 79 31 31 29 29 3b 20 0d 0a 23 6c 69 6e 65 20  yy11)); ..#line 
132a0 35 38 37 20 22 66 74 73 35 70 61 72 73 65 2e 63  587 "fts5parse.c
132b0 22 0d 0a 7d 0d 0a 20 20 20 20 20 20 62 72 65 61  "..}..      brea
132c0 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 32 32 3a  k;..    case 22:
132d0 20 2f 2a 20 6e 65 61 72 73 65 74 20 2a 2f 0d 0a   /* nearset */..
132e0 20 20 20 20 63 61 73 65 20 32 33 3a 20 2f 2a 20      case 23: /* 
132f0 6e 65 61 72 70 68 72 61 73 65 73 20 2a 2f 0d 0a  nearphrases */..
13300 7b 0d 0a 23 6c 69 6e 65 20 31 34 38 20 22 66 74  {..#line 148 "ft
13310 73 35 70 61 72 73 65 2e 79 22 0d 0a 20 73 71 6c  s5parse.y".. sql
13320 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
13330 72 73 65 74 46 72 65 65 28 28 66 74 73 35 79 79  rsetFree((fts5yy
13340 70 6d 69 6e 6f 72 2d 3e 66 74 73 35 79 79 34 36  pminor->fts5yy46
13350 29 29 3b 20 0d 0a 23 6c 69 6e 65 20 35 39 35 20  )); ..#line 595 
13360 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 7d  "fts5parse.c"..}
13370 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a  ..      break;..
13380 20 20 20 20 63 61 73 65 20 32 34 3a 20 2f 2a 20      case 24: /* 
13390 70 68 72 61 73 65 20 2a 2f 0d 0a 7b 0d 0a 23 6c  phrase */..{..#l
133a0 69 6e 65 20 31 38 33 20 22 66 74 73 35 70 61 72  ine 183 "fts5par
133b0 73 65 2e 79 22 0d 0a 20 73 71 6c 69 74 65 33 46  se.y".. sqlite3F
133c0 74 73 35 50 61 72 73 65 50 68 72 61 73 65 46 72  ts5ParsePhraseFr
133d0 65 65 28 28 66 74 73 35 79 79 70 6d 69 6e 6f 72  ee((fts5yypminor
133e0 2d 3e 66 74 73 35 79 79 35 33 29 29 3b 20 0d 0a  ->fts5yy53)); ..
133f0 23 6c 69 6e 65 20 36 30 32 20 22 66 74 73 35 70  #line 602 "fts5p
13400 61 72 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20  arse.c"..}..    
13410 20 20 62 72 65 61 6b 3b 0d 0a 2f 2a 2a 2a 2a 2a    break;../*****
13420 2a 2a 2a 2a 20 45 6e 64 20 64 65 73 74 72 75 63  **** End destruc
13430 74 6f 72 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  tor definitions 
13440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20  *********/..    
13470 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
13480 20 20 20 2f 2a 20 49 66 20 6e 6f 20 64 65 73 74     /* If no dest
13490 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 20 73 70  ructor action sp
134a0 65 63 69 66 69 65 64 3a 20 64 6f 20 6e 6f 74 68  ecified: do noth
134b0 69 6e 67 20 2a 2f 0d 0a 20 20 7d 0d 0a 7d 0d 0a  ing */..  }..}..
134c0 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 70 20 74 68 65  ../*..** Pop the
134d0 20 70 61 72 73 65 72 27 73 20 73 74 61 63 6b 20   parser's stack 
134e0 6f 6e 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66  once...**..** If
134f0 20 74 68 65 72 65 20 69 73 20 61 20 64 65 73 74   there is a dest
13500 72 75 63 74 6f 72 20 72 6f 75 74 69 6e 65 20 61  ructor routine a
13510 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13520 68 65 20 74 6f 6b 65 6e 20 77 68 69 63 68 0d 0a  he token which..
13530 2a 2a 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ** is popped fro
13540 6d 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65  m the stack, the
13550 6e 20 63 61 6c 6c 20 69 74 2e 0d 0a 2a 2f 0d 0a  n call it...*/..
13560 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13570 79 79 5f 70 6f 70 5f 70 61 72 73 65 72 5f 73 74  yy_pop_parser_st
13580 61 63 6b 28 66 74 73 35 79 79 50 61 72 73 65 72  ack(fts5yyParser
13590 20 2a 70 50 61 72 73 65 72 29 7b 0d 0a 20 20 66   *pParser){..  f
135a0 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20  ts5yyStackEntry 
135b0 2a 66 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20 61  *fts5yytos;..  a
135c0 73 73 65 72 74 28 20 70 50 61 72 73 65 72 2d 3e  ssert( pParser->
135d0 66 74 73 35 79 79 74 6f 73 21 3d 30 20 29 3b 0d  fts5yytos!=0 );.
135e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
135f0 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 3e 20  er->fts5yytos > 
13600 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
13610 74 61 63 6b 20 29 3b 0d 0a 20 20 66 74 73 35 79  tack );..  fts5y
13620 79 74 6f 73 20 3d 20 70 50 61 72 73 65 72 2d 3e  ytos = pParser->
13630 66 74 73 35 79 79 74 6f 73 2d 2d 3b 0d 0a 23 69  fts5yytos--;..#i
13640 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20  fndef NDEBUG..  
13650 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
13660 49 4c 45 20 29 7b 0d 0a 20 20 20 20 66 70 72 69  ILE ){..    fpri
13670 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
13680 49 4c 45 2c 22 25 73 50 6f 70 70 69 6e 67 20 25  ILE,"%sPopping %
13690 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 66 74 73  s\n",..      fts
136a0 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 0d  5yyTracePrompt,.
136b0 0a 20 20 20 20 20 20 66 74 73 35 79 79 54 6f 6b  .      fts5yyTok
136c0 65 6e 4e 61 6d 65 5b 66 74 73 35 79 79 74 6f 73  enName[fts5yytos
136d0 2d 3e 6d 61 6a 6f 72 5d 29 3b 0d 0a 20 20 7d 0d  ->major]);..  }.
136e0 0a 23 65 6e 64 69 66 0d 0a 20 20 66 74 73 35 79  .#endif..  fts5y
136f0 79 5f 64 65 73 74 72 75 63 74 6f 72 28 70 50 61  y_destructor(pPa
13700 72 73 65 72 2c 20 66 74 73 35 79 79 74 6f 73 2d  rser, fts5yytos-
13710 3e 6d 61 6a 6f 72 2c 20 26 66 74 73 35 79 79 74  >major, &fts5yyt
13720 6f 73 2d 3e 6d 69 6e 6f 72 29 3b 0d 0a 7d 0d 0a  os->minor);..}..
13730 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 65 61 72 20 61  ../*..** Clear a
13740 6c 6c 20 73 65 63 6f 6e 64 61 72 79 20 6d 65 6d  ll secondary mem
13750 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
13760 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 0d  from the parser.
13770 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
13780 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
13790 65 72 46 69 6e 61 6c 69 7a 65 28 76 6f 69 64 20  erFinalize(void 
137a0 2a 70 29 7b 0d 0a 20 20 66 74 73 35 79 79 50 61  *p){..  fts5yyPa
137b0 72 73 65 72 20 2a 70 50 61 72 73 65 72 20 3d 20  rser *pParser = 
137c0 28 66 74 73 35 79 79 50 61 72 73 65 72 2a 29 70  (fts5yyParser*)p
137d0 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 50 61 72  ;..  while( pPar
137e0 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 70  ser->fts5yytos>p
137f0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
13800 61 63 6b 20 29 20 66 74 73 35 79 79 5f 70 6f 70  ack ) fts5yy_pop
13810 5f 70 61 72 73 65 72 5f 73 74 61 63 6b 28 70 50  _parser_stack(pP
13820 61 72 73 65 72 29 3b 0d 0a 23 69 66 20 66 74 73  arser);..#if fts
13830 35 59 59 53 54 41 43 4b 44 45 50 54 48 3c 3d 30  5YYSTACKDEPTH<=0
13840 0d 0a 20 20 69 66 28 20 70 50 61 72 73 65 72 2d  ..  if( pParser-
13850 3e 66 74 73 35 79 79 73 74 61 63 6b 21 3d 26 70  >fts5yystack!=&p
13860 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
13870 6b 30 20 29 20 66 72 65 65 28 70 50 61 72 73 65  k0 ) free(pParse
13880 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 29 3b  r->fts5yystack);
13890 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 23  ..#endif..}....#
138a0 69 66 6e 64 65 66 20 73 71 6c 69 74 65 33 46 74  ifndef sqlite3Ft
138b0 73 35 50 61 72 73 65 72 5f 45 4e 47 49 4e 45 41  s5Parser_ENGINEA
138c0 4c 57 41 59 53 4f 4e 53 54 41 43 4b 0d 0a 2f 2a  LWAYSONSTACK../*
138d0 20 0d 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65   ..** Deallocate
138e0 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 70   and destroy a p
138f0 61 72 73 65 72 2e 20 20 44 65 73 74 72 75 63 74  arser.  Destruct
13900 6f 72 73 20 61 72 65 20 63 61 6c 6c 65 64 20 66  ors are called f
13910 6f 72 0d 0a 2a 2a 20 61 6c 6c 20 73 74 61 63 6b  or..** all stack
13920 20 65 6c 65 6d 65 6e 74 73 20 62 65 66 6f 72 65   elements before
13930 20 73 68 75 74 74 69 6e 67 20 74 68 65 20 70 61   shutting the pa
13940 72 73 65 72 20 64 6f 77 6e 2e 0d 0a 2a 2a 0d 0a  rser down...**..
13950 2a 2a 20 49 66 20 74 68 65 20 66 74 73 35 59 59  ** If the fts5YY
13960 50 41 52 53 45 46 52 45 45 4e 45 56 45 52 4e 55  PARSEFREENEVERNU
13970 4c 4c 20 6d 61 63 72 6f 20 65 78 69 73 74 73 20  LL macro exists 
13980 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63  (for example bec
13990 61 75 73 65 20 69 74 0d 0a 2a 2a 20 69 73 20 64  ause it..** is d
139a0 65 66 69 6e 65 64 20 69 6e 20 61 20 25 69 6e 63  efined in a %inc
139b0 6c 75 64 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  lude section of 
139c0 74 68 65 20 69 6e 70 75 74 20 67 72 61 6d 6d 61  the input gramma
139d0 72 29 20 74 68 65 6e 20 69 74 20 69 73 0d 0a 2a  r) then it is..*
139e0 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
139f0 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
13a00 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 0d   is never NULL..
13a10 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
13a20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
13a30 65 72 46 72 65 65 28 0d 0a 20 20 76 6f 69 64 20  erFree(..  void 
13a40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
13a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13a60 72 73 65 72 20 74 6f 20 62 65 20 64 65 6c 65 74  rser to be delet
13a70 65 64 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a  ed */..  void (*
13a80 66 72 65 65 50 72 6f 63 29 28 76 6f 69 64 2a 29  freeProc)(void*)
13a90 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
13aa0 20 75 73 65 64 20 74 6f 20 72 65 63 6c 61 69 6d   used to reclaim
13ab0 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 29 7b 0d 0a   memory */..){..
13ac0 23 69 66 6e 64 65 66 20 66 74 73 35 59 59 50 41  #ifndef fts5YYPA
13ad0 52 53 45 46 52 45 45 4e 45 56 45 52 4e 55 4c 4c  RSEFREENEVERNULL
13ae0 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ..  if( p==0 ) r
13af0 65 74 75 72 6e 3b 0d 0a 23 65 6e 64 69 66 0d 0a  eturn;..#endif..
13b00 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
13b10 73 65 72 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0d  serFinalize(p);.
13b20 0a 20 20 28 2a 66 72 65 65 50 72 6f 63 29 28 70  .  (*freeProc)(p
13b30 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a  );..}..#endif /*
13b40 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
13b50 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59 53 4f  er_ENGINEALWAYSO
13b60 4e 53 54 41 43 4b 20 2a 2f 0d 0a 0d 0a 2f 2a 0d  NSTACK */..../*.
13b70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
13b80 65 61 6b 20 64 65 70 74 68 20 6f 66 20 74 68 65  eak depth of the
13b90 20 73 74 61 63 6b 20 66 6f 72 20 61 20 70 61 72   stack for a par
13ba0 73 65 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66  ser...*/..#ifdef
13bb0 20 66 74 73 35 59 59 54 52 41 43 4b 4d 41 58 53   fts5YYTRACKMAXS
13bc0 54 41 43 4b 44 45 50 54 48 0d 0a 73 74 61 74 69  TACKDEPTH..stati
13bd0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
13be0 35 50 61 72 73 65 72 53 74 61 63 6b 50 65 61 6b  5ParserStackPeak
13bf0 28 76 6f 69 64 20 2a 70 29 7b 0d 0a 20 20 66 74  (void *p){..  ft
13c00 73 35 79 79 50 61 72 73 65 72 20 2a 70 50 61 72  s5yyParser *pPar
13c10 73 65 72 20 3d 20 28 66 74 73 35 79 79 50 61 72  ser = (fts5yyPar
13c20 73 65 72 2a 29 70 3b 0d 0a 20 20 72 65 74 75 72  ser*)p;..  retur
13c30 6e 20 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  n pParser->fts5y
13c40 79 68 77 6d 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66  yhwm;..}..#endif
13c50 0d 0a 0d 0a 2f 2a 20 54 68 69 73 20 61 72 72 61  ..../* This arra
13c60 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 73 20 6b 65  y of booleans ke
13c70 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
13c80 20 70 61 72 73 65 72 20 73 74 61 74 65 6d 65 6e   parser statemen
13c90 74 0d 0a 2a 2a 20 63 6f 76 65 72 61 67 65 2e 20  t..** coverage. 
13ca0 20 54 68 65 20 65 6c 65 6d 65 6e 74 20 66 74 73   The element fts
13cb0 35 79 79 63 6f 76 65 72 61 67 65 5b 58 5d 5b 59  5yycoverage[X][Y
13cc0 5d 20 69 73 20 73 65 74 20 77 68 65 6e 20 74 68  ] is set when th
13cd0 65 20 70 61 72 73 65 72 0d 0a 2a 2a 20 69 73 20  e parser..** is 
13ce0 69 6e 20 73 74 61 74 65 20 58 20 61 6e 64 20 68  in state X and h
13cf0 61 73 20 61 20 6c 6f 6f 6b 61 68 65 61 64 20 74  as a lookahead t
13d00 6f 6b 65 6e 20 59 2e 20 20 49 6e 20 61 20 77 65  oken Y.  In a we
13d10 6c 6c 2d 74 65 73 74 65 64 0d 0a 2a 2a 20 73 79  ll-tested..** sy
13d20 73 74 65 6d 73 2c 20 65 76 65 72 79 20 65 6c 65  stems, every ele
13d30 6d 65 6e 74 20 6f 66 20 74 68 69 73 20 6d 61 74  ment of this mat
13d40 72 69 78 20 73 68 6f 75 6c 64 20 65 6e 64 20 75  rix should end u
13d50 70 20 62 65 69 6e 67 20 73 65 74 2e 0d 0a 2a 2f  p being set...*/
13d60 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 66 74  ..#if defined(ft
13d70 73 35 59 59 43 4f 56 45 52 41 47 45 29 0d 0a 73  s5YYCOVERAGE)..s
13d80 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
13d90 68 61 72 20 66 74 73 35 79 79 63 6f 76 65 72 61  har fts5yycovera
13da0 67 65 5b 66 74 73 35 59 59 4e 53 54 41 54 45 5d  ge[fts5YYNSTATE]
13db0 5b 66 74 73 35 59 59 4e 46 54 53 35 54 4f 4b 45  [fts5YYNFTS5TOKE
13dc0 4e 5d 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f  N];..#endif..../
13dd0 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  *..** Write into
13de0 20 6f 75 74 20 61 20 64 65 73 63 72 69 70 74 69   out a descripti
13df0 6f 6e 20 6f 66 20 65 76 65 72 79 20 73 74 61 74  on of every stat
13e00 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d 62  e/lookahead comb
13e10 69 6e 61 74 69 6f 6e 20 74 68 61 74 0d 0a 2a 2a  ination that..**
13e20 0d 0a 2a 2a 20 20 20 28 31 29 20 20 68 61 73 20  ..**   (1)  has 
13e30 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 62 79  not been used by
13e40 20 74 68 65 20 70 61 72 73 65 72 2c 20 61 6e 64   the parser, and
13e50 0d 0a 2a 2a 20 20 20 28 32 29 20 20 69 73 20 6e  ..**   (2)  is n
13e60 6f 74 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ot a syntax erro
13e70 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72  r...**..** Retur
13e80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13e90 6d 69 73 73 65 64 20 73 74 61 74 65 2f 6c 6f 6f  missed state/loo
13ea0 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69  kahead combinati
13eb0 6f 6e 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65  ons...*/..#if de
13ec0 66 69 6e 65 64 28 66 74 73 35 59 59 43 4f 56 45  fined(fts5YYCOVE
13ed0 52 41 47 45 29 0d 0a 73 74 61 74 69 63 20 69 6e  RAGE)..static in
13ee0 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  t sqlite3Fts5Par
13ef0 73 65 72 43 6f 76 65 72 61 67 65 28 46 49 4c 45  serCoverage(FILE
13f00 20 2a 6f 75 74 29 7b 0d 0a 20 20 69 6e 74 20 73   *out){..  int s
13f10 74 61 74 65 6e 6f 2c 20 69 4c 6f 6f 6b 41 68 65  tateno, iLookAhe
13f20 61 64 2c 20 69 3b 0d 0a 20 20 69 6e 74 20 6e 4d  ad, i;..  int nM
13f30 69 73 73 65 64 20 3d 20 30 3b 0d 0a 20 20 66 6f  issed = 0;..  fo
13f40 72 28 73 74 61 74 65 6e 6f 3d 30 3b 20 73 74 61  r(stateno=0; sta
13f50 74 65 6e 6f 3c 66 74 73 35 59 59 4e 53 54 41 54  teno<fts5YYNSTAT
13f60 45 3b 20 73 74 61 74 65 6e 6f 2b 2b 29 7b 0d 0a  E; stateno++){..
13f70 20 20 20 20 69 20 3d 20 66 74 73 35 79 79 5f 73      i = fts5yy_s
13f80 68 69 66 74 5f 6f 66 73 74 5b 73 74 61 74 65 6e  hift_ofst[staten
13f90 6f 5d 3b 0d 0a 20 20 20 20 66 6f 72 28 69 4c 6f  o];..    for(iLo
13fa0 6f 6b 41 68 65 61 64 3d 30 3b 20 69 4c 6f 6f 6b  okAhead=0; iLook
13fb0 41 68 65 61 64 3c 66 74 73 35 59 59 4e 46 54 53  Ahead<fts5YYNFTS
13fc0 35 54 4f 4b 45 4e 3b 20 69 4c 6f 6f 6b 41 68 65  5TOKEN; iLookAhe
13fd0 61 64 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66  ad++){..      if
13fe0 28 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65  ( fts5yy_lookahe
13ff0 61 64 5b 69 2b 69 4c 6f 6f 6b 41 68 65 61 64 5d  ad[i+iLookAhead]
14000 21 3d 69 4c 6f 6f 6b 41 68 65 61 64 20 29 20 63  !=iLookAhead ) c
14010 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20  ontinue;..      
14020 69 66 28 20 66 74 73 35 79 79 63 6f 76 65 72 61  if( fts5yycovera
14030 67 65 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f 6f  ge[stateno][iLoo
14040 6b 41 68 65 61 64 5d 3d 3d 30 20 29 20 6e 4d 69  kAhead]==0 ) nMi
14050 73 73 65 64 2b 2b 3b 0d 0a 20 20 20 20 20 20 69  ssed++;..      i
14060 66 28 20 6f 75 74 20 29 7b 0d 0a 20 20 20 20 20  f( out ){..     
14070 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
14080 53 74 61 74 65 20 25 64 20 6c 6f 6f 6b 61 68 65  State %d lookahe
14090 61 64 20 25 73 20 25 73 5c 6e 22 2c 20 73 74 61  ad %s %s\n", sta
140a0 74 65 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20  teno,..         
140b0 20 20 20 20 20 20 20 66 74 73 35 79 79 54 6f 6b         fts5yyTok
140c0 65 6e 4e 61 6d 65 5b 69 4c 6f 6f 6b 41 68 65 61  enName[iLookAhea
140d0 64 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d],..           
140e0 20 20 20 20 20 66 74 73 35 79 79 63 6f 76 65 72       fts5yycover
140f0 61 67 65 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f  age[stateno][iLo
14100 6f 6b 41 68 65 61 64 5d 20 3f 20 22 6f 6b 22 20  okAhead] ? "ok" 
14110 3a 20 22 6d 69 73 73 65 64 22 29 3b 0d 0a 20 20  : "missed");..  
14120 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
14130 7d 0d 0a 20 20 72 65 74 75 72 6e 20 6e 4d 69 73  }..  return nMis
14140 73 65 64 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d  sed;..}..#endif.
14150 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74  .../*..** Find t
14160 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61  he appropriate a
14170 63 74 69 6f 6e 20 66 6f 72 20 61 20 70 61 72 73  ction for a pars
14180 65 72 20 67 69 76 65 6e 20 74 68 65 20 74 65 72  er given the ter
14190 6d 69 6e 61 6c 0d 0a 2a 2a 20 6c 6f 6f 6b 2d 61  minal..** look-a
141a0 68 65 61 64 20 74 6f 6b 65 6e 20 69 4c 6f 6f 6b  head token iLook
141b0 41 68 65 61 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  Ahead...*/..stat
141c0 69 63 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54  ic fts5YYACTIONT
141d0 59 50 45 20 66 74 73 35 79 79 5f 66 69 6e 64 5f  YPE fts5yy_find_
141e0 73 68 69 66 74 5f 61 63 74 69 6f 6e 28 0d 0a 20  shift_action(.. 
141f0 20 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 20   fts5YYCODETYPE 
14200 69 4c 6f 6f 6b 41 68 65 61 64 2c 20 20 20 20 2f  iLookAhead,    /
14210 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  * The look-ahead
14220 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 66 74 73   token */..  fts
14230 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20 73 74  5YYACTIONTYPE st
14240 61 74 65 6e 6f 20 20 20 20 20 20 2f 2a 20 43 75  ateno      /* Cu
14250 72 72 65 6e 74 20 73 74 61 74 65 20 6e 75 6d 62  rrent state numb
14260 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74  er */..){..  int
14270 20 69 3b 0d 0a 0d 0a 20 20 69 66 28 20 73 74 61   i;....  if( sta
14280 74 65 6e 6f 3e 66 74 73 35 59 59 5f 4d 41 58 5f  teno>fts5YY_MAX_
14290 53 48 49 46 54 20 29 20 72 65 74 75 72 6e 20 73  SHIFT ) return s
142a0 74 61 74 65 6e 6f 3b 0d 0a 20 20 61 73 73 65 72  tateno;..  asser
142b0 74 28 20 73 74 61 74 65 6e 6f 20 3c 3d 20 66 74  t( stateno <= ft
142c0 73 35 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54  s5YY_SHIFT_COUNT
142d0 20 29 3b 0d 0a 23 69 66 20 64 65 66 69 6e 65 64   );..#if defined
142e0 28 66 74 73 35 59 59 43 4f 56 45 52 41 47 45 29  (fts5YYCOVERAGE)
142f0 0d 0a 20 20 66 74 73 35 79 79 63 6f 76 65 72 61  ..  fts5yycovera
14300 67 65 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f 6f  ge[stateno][iLoo
14310 6b 41 68 65 61 64 5d 20 3d 20 31 3b 0d 0a 23 65  kAhead] = 1;..#e
14320 6e 64 69 66 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20  ndif..  do{..   
14330 20 69 20 3d 20 66 74 73 35 79 79 5f 73 68 69 66   i = fts5yy_shif
14340 74 5f 6f 66 73 74 5b 73 74 61 74 65 6e 6f 5d 3b  t_ofst[stateno];
14350 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ..    assert( i>
14360 3d 30 20 29 3b 0d 0a 20 20 20 20 2f 2a 20 61 73  =0 );..    /* as
14370 73 65 72 74 28 20 69 2b 66 74 73 35 59 59 4e 46  sert( i+fts5YYNF
14380 54 53 35 54 4f 4b 45 4e 3c 3d 28 69 6e 74 29 66  TS5TOKEN<=(int)f
14390 74 73 35 59 59 5f 4e 4c 4f 4f 4b 41 48 45 41 44  ts5YY_NLOOKAHEAD
143a0 20 29 3b 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65   ); */..    asse
143b0 72 74 28 20 69 4c 6f 6f 6b 41 68 65 61 64 21 3d  rt( iLookAhead!=
143c0 66 74 73 35 59 59 4e 4f 43 4f 44 45 20 29 3b 0d  fts5YYNOCODE );.
143d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4c 6f  .    assert( iLo
143e0 6f 6b 41 68 65 61 64 20 3c 20 66 74 73 35 59 59  okAhead < fts5YY
143f0 4e 46 54 53 35 54 4f 4b 45 4e 20 29 3b 0d 0a 20  NFTS5TOKEN );.. 
14400 20 20 20 69 20 2b 3d 20 69 4c 6f 6f 6b 41 68 65     i += iLookAhe
14410 61 64 3b 0d 0a 20 20 20 20 69 66 28 20 69 3e 3d  ad;..    if( i>=
14420 66 74 73 35 59 59 5f 4e 4c 4f 4f 4b 41 48 45 41  fts5YY_NLOOKAHEA
14430 44 20 7c 7c 20 66 74 73 35 79 79 5f 6c 6f 6f 6b  D || fts5yy_look
14440 61 68 65 61 64 5b 69 5d 21 3d 69 4c 6f 6f 6b 41  ahead[i]!=iLookA
14450 68 65 61 64 20 29 7b 0d 0a 23 69 66 64 65 66 20  head ){..#ifdef 
14460 66 74 73 35 59 59 46 41 4c 4c 42 41 43 4b 0d 0a  fts5YYFALLBACK..
14470 20 20 20 20 20 20 66 74 73 35 59 59 43 4f 44 45        fts5YYCODE
14480 54 59 50 45 20 69 46 61 6c 6c 62 61 63 6b 3b 20  TYPE iFallback; 
14490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
144a0 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0d  llback token */.
144b0 0a 20 20 20 20 20 20 69 66 28 20 69 4c 6f 6f 6b  .      if( iLook
144c0 41 68 65 61 64 3c 73 69 7a 65 6f 66 28 66 74 73  Ahead<sizeof(fts
144d0 35 79 79 46 61 6c 6c 62 61 63 6b 29 2f 73 69 7a  5yyFallback)/siz
144e0 65 6f 66 28 66 74 73 35 79 79 46 61 6c 6c 62 61  eof(fts5yyFallba
144f0 63 6b 5b 30 5d 29 0d 0a 20 20 20 20 20 20 20 20  ck[0])..        
14500 20 20 20 20 20 26 26 20 28 69 46 61 6c 6c 62 61       && (iFallba
14510 63 6b 20 3d 20 66 74 73 35 79 79 46 61 6c 6c 62  ck = fts5yyFallb
14520 61 63 6b 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 29  ack[iLookAhead])
14530 21 3d 30 20 29 7b 0d 0a 23 69 66 6e 64 65 66 20  !=0 ){..#ifndef 
14540 4e 44 45 42 55 47 0d 0a 20 20 20 20 20 20 20 20  NDEBUG..        
14550 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
14560 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ILE ){..        
14570 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
14580 54 72 61 63 65 46 49 4c 45 2c 20 22 25 73 46 41  TraceFILE, "%sFA
14590 4c 4c 42 41 43 4b 20 25 73 20 3d 3e 20 25 73 5c  LLBACK %s => %s\
145a0 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n",..           
145b0 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f    fts5yyTracePro
145c0 6d 70 74 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e  mpt, fts5yyToken
145d0 4e 61 6d 65 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d  Name[iLookAhead]
145e0 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d  , fts5yyTokenNam
145f0 65 5b 69 46 61 6c 6c 62 61 63 6b 5d 29 3b 0d 0a  e[iFallback]);..
14600 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69          }..#endi
14610 66 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f..        asser
14620 74 28 20 66 74 73 35 79 79 46 61 6c 6c 62 61 63  t( fts5yyFallbac
14630 6b 5b 69 46 61 6c 6c 62 61 63 6b 5d 3d 3d 30 20  k[iFallback]==0 
14640 29 3b 20 2f 2a 20 46 61 6c 6c 62 61 63 6b 20 6c  ); /* Fallback l
14650 6f 6f 70 20 6d 75 73 74 20 74 65 72 6d 69 6e 61  oop must termina
14660 74 65 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69  te */..        i
14670 4c 6f 6f 6b 41 68 65 61 64 20 3d 20 69 46 61 6c  LookAhead = iFal
14680 6c 62 61 63 6b 3b 0d 0a 20 20 20 20 20 20 20 20  lback;..        
14690 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
146a0 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64   }..#endif..#ifd
146b0 65 66 20 66 74 73 35 59 59 57 49 4c 44 43 41 52  ef fts5YYWILDCAR
146c0 44 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  D..      {..    
146d0 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 20 2d 20      int j = i - 
146e0 69 4c 6f 6f 6b 41 68 65 61 64 20 2b 20 66 74 73  iLookAhead + fts
146f0 35 59 59 57 49 4c 44 43 41 52 44 3b 0d 0a 20 20  5YYWILDCARD;..  
14700 20 20 20 20 20 20 69 66 28 20 0d 0a 23 69 66 20        if( ..#if 
14710 66 74 73 35 59 59 5f 53 48 49 46 54 5f 4d 49 4e  fts5YY_SHIFT_MIN
14720 2b 66 74 73 35 59 59 57 49 4c 44 43 41 52 44 3c  +fts5YYWILDCARD<
14730 30 0d 0a 20 20 20 20 20 20 20 20 20 20 6a 3e 3d  0..          j>=
14740 30 20 26 26 0d 0a 23 65 6e 64 69 66 0d 0a 23 69  0 &&..#endif..#i
14750 66 20 66 74 73 35 59 59 5f 53 48 49 46 54 5f 4d  f fts5YY_SHIFT_M
14760 41 58 2b 66 74 73 35 59 59 57 49 4c 44 43 41 52  AX+fts5YYWILDCAR
14770 44 3e 3d 66 74 73 35 59 59 5f 41 43 54 54 41 42  D>=fts5YY_ACTTAB
14780 5f 43 4f 55 4e 54 0d 0a 20 20 20 20 20 20 20 20  _COUNT..        
14790 20 20 6a 3c 66 74 73 35 59 59 5f 41 43 54 54 41    j<fts5YY_ACTTA
147a0 42 5f 43 4f 55 4e 54 20 26 26 0d 0a 23 65 6e 64  B_COUNT &&..#end
147b0 69 66 0d 0a 20 20 20 20 20 20 20 20 20 20 6a 3c  if..          j<
147c0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 66 74 73  (int)(sizeof(fts
147d0 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 29 2f 73  5yy_lookahead)/s
147e0 69 7a 65 6f 66 28 66 74 73 35 79 79 5f 6c 6f 6f  izeof(fts5yy_loo
147f0 6b 61 68 65 61 64 5b 30 5d 29 29 20 26 26 0d 0a  kahead[0])) &&..
14800 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79            fts5yy
14810 5f 6c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3d 3d 66  _lookahead[j]==f
14820 74 73 35 59 59 57 49 4c 44 43 41 52 44 20 26 26  ts5YYWILDCARD &&
14830 20 69 4c 6f 6f 6b 41 68 65 61 64 3e 30 0d 0a 20   iLookAhead>0.. 
14840 20 20 20 20 20 20 20 29 7b 0d 0a 23 69 66 6e 64         ){..#ifnd
14850 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 20  ef NDEBUG..     
14860 20 20 20 20 20 69 66 28 20 66 74 73 35 79 79 54       if( fts5yyT
14870 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20  raceFILE ){..   
14880 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
14890 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45  (fts5yyTraceFILE
148a0 2c 20 22 25 73 57 49 4c 44 43 41 52 44 20 25 73  , "%sWILDCARD %s
148b0 20 3d 3e 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20   => %s\n",..    
148c0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79             fts5y
148d0 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 20 66 74  yTracePrompt, ft
148e0 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 69 4c  s5yyTokenName[iL
148f0 6f 6f 6b 41 68 65 61 64 5d 2c 0d 0a 20 20 20 20  ookAhead],..    
14900 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79             fts5y
14910 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 59  yTokenName[fts5Y
14920 59 57 49 4c 44 43 41 52 44 5d 29 3b 0d 0a 20 20  YWILDCARD]);..  
14930 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69          }..#endi
14940 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0d 0a  f /* NDEBUG */..
14950 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14960 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b 6a   fts5yy_action[j
14970 5d 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ];..        }.. 
14980 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f       }..#endif /
14990 2a 20 66 74 73 35 59 59 57 49 4c 44 43 41 52 44  * fts5YYWILDCARD
149a0 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72   */..      retur
149b0 6e 20 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74  n fts5yy_default
149c0 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20 20 20  [stateno];..    
149d0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 65  }else{..      re
149e0 74 75 72 6e 20 66 74 73 35 79 79 5f 61 63 74 69  turn fts5yy_acti
149f0 6f 6e 5b 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20  on[i];..    }.. 
14a00 20 7d 77 68 69 6c 65 28 31 29 3b 0d 0a 7d 0d 0a   }while(1);..}..
14a10 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68  ../*..** Find th
14a20 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63  e appropriate ac
14a30 74 69 6f 6e 20 66 6f 72 20 61 20 70 61 72 73 65  tion for a parse
14a40 72 20 67 69 76 65 6e 20 74 68 65 20 6e 6f 6e 2d  r given the non-
14a50 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 6c 6f 6f  terminal..** loo
14a60 6b 2d 61 68 65 61 64 20 74 6f 6b 65 6e 20 69 4c  k-ahead token iL
14a70 6f 6f 6b 41 68 65 61 64 2e 0d 0a 2a 2f 0d 0a 73  ookAhead...*/..s
14a80 74 61 74 69 63 20 66 74 73 35 59 59 41 43 54 49  tatic fts5YYACTI
14a90 4f 4e 54 59 50 45 20 66 74 73 35 79 79 5f 66 69  ONTYPE fts5yy_fi
14aa0 6e 64 5f 72 65 64 75 63 65 5f 61 63 74 69 6f 6e  nd_reduce_action
14ab0 28 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49 4f  (..  fts5YYACTIO
14ac0 4e 54 59 50 45 20 73 74 61 74 65 6e 6f 2c 20 20  NTYPE stateno,  
14ad0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
14ae0 61 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20  ate number */.. 
14af0 20 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 20   fts5YYCODETYPE 
14b00 69 4c 6f 6f 6b 41 68 65 61 64 20 20 20 20 20 2f  iLookAhead     /
14b10 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  * The look-ahead
14b20 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20   token */..){.. 
14b30 20 69 6e 74 20 69 3b 0d 0a 23 69 66 64 65 66 20   int i;..#ifdef 
14b40 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f  fts5YYERRORSYMBO
14b50 4c 0d 0a 20 20 69 66 28 20 73 74 61 74 65 6e 6f  L..  if( stateno
14b60 3e 66 74 73 35 59 59 5f 52 45 44 55 43 45 5f 43  >fts5YY_REDUCE_C
14b70 4f 55 4e 54 20 29 7b 0d 0a 20 20 20 20 72 65 74  OUNT ){..    ret
14b80 75 72 6e 20 66 74 73 35 79 79 5f 64 65 66 61 75  urn fts5yy_defau
14b90 6c 74 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20  lt[stateno];..  
14ba0 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 61 73 73 65  }..#else..  asse
14bb0 72 74 28 20 73 74 61 74 65 6e 6f 3c 3d 66 74 73  rt( stateno<=fts
14bc0 35 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54  5YY_REDUCE_COUNT
14bd0 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69   );..#endif..  i
14be0 20 3d 20 66 74 73 35 79 79 5f 72 65 64 75 63 65   = fts5yy_reduce
14bf0 5f 6f 66 73 74 5b 73 74 61 74 65 6e 6f 5d 3b 0d  _ofst[stateno];.
14c00 0a 20 20 61 73 73 65 72 74 28 20 69 4c 6f 6f 6b  .  assert( iLook
14c10 41 68 65 61 64 21 3d 66 74 73 35 59 59 4e 4f 43  Ahead!=fts5YYNOC
14c20 4f 44 45 20 29 3b 0d 0a 20 20 69 20 2b 3d 20 69  ODE );..  i += i
14c30 4c 6f 6f 6b 41 68 65 61 64 3b 0d 0a 23 69 66 64  LookAhead;..#ifd
14c40 65 66 20 66 74 73 35 59 59 45 52 52 4f 52 53 59  ef fts5YYERRORSY
14c50 4d 42 4f 4c 0d 0a 20 20 69 66 28 20 69 3c 30 20  MBOL..  if( i<0 
14c60 7c 7c 20 69 3e 3d 66 74 73 35 59 59 5f 41 43 54  || i>=fts5YY_ACT
14c70 54 41 42 5f 43 4f 55 4e 54 20 7c 7c 20 66 74 73  TAB_COUNT || fts
14c80 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 69 5d  5yy_lookahead[i]
14c90 21 3d 69 4c 6f 6f 6b 41 68 65 61 64 20 29 7b 0d  !=iLookAhead ){.
14ca0 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35  .    return fts5
14cb0 79 79 5f 64 65 66 61 75 6c 74 5b 73 74 61 74 65  yy_default[state
14cc0 6e 6f 5d 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65  no];..  }..#else
14cd0 0d 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
14ce0 20 26 26 20 69 3c 66 74 73 35 59 59 5f 41 43 54   && i<fts5YY_ACT
14cf0 54 41 42 5f 43 4f 55 4e 54 20 29 3b 0d 0a 20 20  TAB_COUNT );..  
14d00 61 73 73 65 72 74 28 20 66 74 73 35 79 79 5f 6c  assert( fts5yy_l
14d10 6f 6f 6b 61 68 65 61 64 5b 69 5d 3d 3d 69 4c 6f  ookahead[i]==iLo
14d20 6f 6b 41 68 65 61 64 20 29 3b 0d 0a 23 65 6e 64  okAhead );..#end
14d30 69 66 0d 0a 20 20 72 65 74 75 72 6e 20 66 74 73  if..  return fts
14d40 35 79 79 5f 61 63 74 69 6f 6e 5b 69 5d 3b 0d 0a  5yy_action[i];..
14d50 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20  }..../*..** The 
14d60 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
14d70 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  e is called if t
14d80 68 65 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  he stack overflo
14d90 77 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ws...*/..static 
14da0 76 6f 69 64 20 66 74 73 35 79 79 53 74 61 63 6b  void fts5yyStack
14db0 4f 76 65 72 66 6c 6f 77 28 66 74 73 35 79 79 50  Overflow(fts5yyP
14dc0 61 72 73 65 72 20 2a 66 74 73 35 79 79 70 50 61  arser *fts5yypPa
14dd0 72 73 65 72 29 7b 0d 0a 20 20 20 73 71 6c 69 74  rser){..   sqlit
14de0 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
14df0 46 45 54 43 48 0d 0a 20 20 20 73 71 6c 69 74 65  FETCH..   sqlite
14e00 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 46  3Fts5ParserCTX_F
14e10 45 54 43 48 0d 0a 23 69 66 6e 64 65 66 20 4e 44  ETCH..#ifndef ND
14e20 45 42 55 47 0d 0a 20 20 20 69 66 28 20 66 74 73  EBUG..   if( fts
14e30 35 79 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d  5yyTraceFILE ){.
14e40 0a 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 74  .     fprintf(ft
14e50 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25  s5yyTraceFILE,"%
14e60 73 53 74 61 63 6b 20 4f 76 65 72 66 6c 6f 77 21  sStack Overflow!
14e70 5c 6e 22 2c 66 74 73 35 79 79 54 72 61 63 65 50  \n",fts5yyTraceP
14e80 72 6f 6d 70 74 29 3b 0d 0a 20 20 20 7d 0d 0a 23  rompt);..   }..#
14e90 65 6e 64 69 66 0d 0a 20 20 20 77 68 69 6c 65 28  endif..   while(
14ea0 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
14eb0 66 74 73 35 79 79 74 6f 73 3e 66 74 73 35 79 79  fts5yytos>fts5yy
14ec0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
14ed0 74 61 63 6b 20 29 20 66 74 73 35 79 79 5f 70 6f  tack ) fts5yy_po
14ee0 70 5f 70 61 72 73 65 72 5f 73 74 61 63 6b 28 66  p_parser_stack(f
14ef0 74 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a  ts5yypParser);..
14f00 20 20 20 2f 2a 20 48 65 72 65 20 63 6f 64 65 20     /* Here code 
14f10 69 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 63  is inserted whic
14f20 68 20 77 69 6c 6c 20 65 78 65 63 75 74 65 20 69  h will execute i
14f30 66 20 74 68 65 20 70 61 72 73 65 72 0d 0a 20 20  f the parser..  
14f40 20 2a 2a 20 73 74 61 63 6b 20 65 76 65 72 79 20   ** stack every 
14f50 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0d 0a 2f 2a  overflows */../*
14f60 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 73  ******* Begin %s
14f70 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 20 63 6f  tack_overflow co
14f80 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de *************
14f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
14fb0 23 6c 69 6e 65 20 33 36 20 22 66 74 73 35 70 61  #line 36 "fts5pa
14fc0 72 73 65 2e 79 22 0d 0a 0d 0a 20 20 73 71 6c 69  rse.y"....  sqli
14fd0 74 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f  te3Fts5ParseErro
14fe0 72 28 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a  r(pParse, "fts5:
14ff0 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76   parser stack ov
15000 65 72 66 6c 6f 77 22 29 3b 0d 0a 23 6c 69 6e 65  erflow");..#line
15010 20 38 32 37 20 22 66 74 73 35 70 61 72 73 65 2e   827 "fts5parse.
15020 63 22 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  c"../******** En
15030 64 20 25 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f  d %stack_overflo
15040 77 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  w code *********
15050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15070 2a 2a 2a 2f 0d 0a 20 20 20 73 71 6c 69 74 65 33  ***/..   sqlite3
15080 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 53 54  Fts5ParserARG_ST
15090 4f 52 45 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ORE /* Suppress 
150a0 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 75 6e  warning about un
150b0 75 73 65 64 20 25 65 78 74 72 61 5f 61 72 67 75  used %extra_argu
150c0 6d 65 6e 74 20 76 61 72 20 2a 2f 0d 0a 20 20 20  ment var */..   
150d0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
150e0 72 43 54 58 5f 53 54 4f 52 45 0d 0a 7d 0d 0a 0d  rCTX_STORE..}...
150f0 0a 2f 2a 0d 0a 2a 2a 20 50 72 69 6e 74 20 74 72  ./*..** Print tr
15100 61 63 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  acing informatio
15110 6e 20 66 6f 72 20 61 20 53 48 49 46 54 20 61 63  n for a SHIFT ac
15120 74 69 6f 6e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65  tion..*/..#ifnde
15130 66 20 4e 44 45 42 55 47 0d 0a 73 74 61 74 69 63  f NDEBUG..static
15140 20 76 6f 69 64 20 66 74 73 35 79 79 54 72 61 63   void fts5yyTrac
15150 65 53 68 69 66 74 28 66 74 73 35 79 79 50 61 72  eShift(fts5yyPar
15160 73 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73  ser *fts5yypPars
15170 65 72 2c 20 69 6e 74 20 66 74 73 35 79 79 4e 65  er, int fts5yyNe
15180 77 53 74 61 74 65 2c 20 63 6f 6e 73 74 20 63 68  wState, const ch
15190 61 72 20 2a 7a 54 61 67 29 7b 0d 0a 20 20 69 66  ar *zTag){..  if
151a0 28 20 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  ( fts5yyTraceFIL
151b0 45 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 66 74  E ){..    if( ft
151c0 73 35 79 79 4e 65 77 53 74 61 74 65 3c 66 74 73  s5yyNewState<fts
151d0 35 59 59 4e 53 54 41 54 45 20 29 7b 0d 0a 20 20  5YYNSTATE ){..  
151e0 20 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35      fprintf(fts5
151f0 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73 25  yyTraceFILE,"%s%
15200 73 20 27 25 73 27 2c 20 67 6f 20 74 6f 20 73 74  s '%s', go to st
15210 61 74 65 20 25 64 5c 6e 22 2c 0d 0a 20 20 20 20  ate %d\n",..    
15220 20 20 20 20 20 66 74 73 35 79 79 54 72 61 63 65       fts5yyTrace
15230 50 72 6f 6d 70 74 2c 20 7a 54 61 67 2c 20 66 74  Prompt, zTag, ft
15240 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74  s5yyTokenName[ft
15250 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
15260 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f 72 5d 2c 0d  5yytos->major],.
15270 0a 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79  .         fts5yy
15280 4e 65 77 53 74 61 74 65 29 3b 0d 0a 20 20 20 20  NewState);..    
15290 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 66 70  }else{..      fp
152a0 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63  rintf(fts5yyTrac
152b0 65 46 49 4c 45 2c 22 25 73 25 73 20 27 25 73 27  eFILE,"%s%s '%s'
152c0 2c 20 70 65 6e 64 69 6e 67 20 72 65 64 75 63 65  , pending reduce
152d0 20 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20   %d\n",..       
152e0 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f    fts5yyTracePro
152f0 6d 70 74 2c 20 7a 54 61 67 2c 20 66 74 73 35 79  mpt, zTag, fts5y
15300 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 79  yTokenName[fts5y
15310 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
15320 74 6f 73 2d 3e 6d 61 6a 6f 72 5d 2c 0d 0a 20 20  tos->major],..  
15330 20 20 20 20 20 20 20 66 74 73 35 79 79 4e 65 77         fts5yyNew
15340 53 74 61 74 65 20 2d 20 66 74 73 35 59 59 5f 4d  State - fts5YY_M
15350 49 4e 5f 52 45 44 55 43 45 29 3b 0d 0a 20 20 20  IN_REDUCE);..   
15360 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6c 73   }..  }..}..#els
15370 65 0d 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  e..# define fts5
15380 79 79 54 72 61 63 65 53 68 69 66 74 28 58 2c 59  yyTraceShift(X,Y
15390 2c 5a 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f  ,Z)..#endif..../
153a0 2a 0d 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  *..** Perform a 
153b0 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0d 0a 2a  shift action...*
153c0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  /..static void f
153d0 74 73 35 79 79 5f 73 68 69 66 74 28 0d 0a 20 20  ts5yy_shift(..  
153e0 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 66 74  fts5yyParser *ft
153f0 73 35 79 79 70 50 61 72 73 65 72 2c 20 20 20 20  s5yypParser,    
15400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15410 73 65 72 20 74 6f 20 62 65 20 73 68 69 66 74 65  ser to be shifte
15420 64 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 41 43  d */..  fts5YYAC
15430 54 49 4f 4e 54 59 50 45 20 66 74 73 35 79 79 4e  TIONTYPE fts5yyN
15440 65 77 53 74 61 74 65 2c 20 20 20 20 20 20 2f 2a  ewState,      /*
15450 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 20 74   The new state t
15460 6f 20 73 68 69 66 74 20 69 6e 20 2a 2f 0d 0a 20  o shift in */.. 
15470 20 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 20   fts5YYCODETYPE 
15480 66 74 73 35 79 79 4d 61 6a 6f 72 2c 20 20 20 20  fts5yyMajor,    
15490 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
154a0 6a 6f 72 20 74 6f 6b 65 6e 20 74 6f 20 73 68 69  jor token to shi
154b0 66 74 20 69 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69  ft in */..  sqli
154c0 74 65 33 46 74 73 35 50 61 72 73 65 72 46 54 53  te3Fts5ParserFTS
154d0 35 54 4f 4b 45 4e 54 59 50 45 20 66 74 73 35 79  5TOKENTYPE fts5y
154e0 79 4d 69 6e 6f 72 20 20 20 20 20 20 20 20 2f 2a  yMinor        /*
154f0 20 54 68 65 20 6d 69 6e 6f 72 20 74 6f 6b 65 6e   The minor token
15500 20 74 6f 20 73 68 69 66 74 20 69 6e 20 2a 2f 0d   to shift in */.
15510 0a 29 7b 0d 0a 20 20 66 74 73 35 79 79 53 74 61  .){..  fts5yySta
15520 63 6b 45 6e 74 72 79 20 2a 66 74 73 35 79 79 74  ckEntry *fts5yyt
15530 6f 73 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61  os;..  fts5yypPa
15540 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2b  rser->fts5yytos+
15550 2b 3b 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59  +;..#ifdef fts5Y
15560 59 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45  YTRACKMAXSTACKDE
15570 50 54 48 0d 0a 20 20 69 66 28 20 28 69 6e 74 29  PTH..  if( (int)
15580 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e  (fts5yypParser->
15590 66 74 73 35 79 79 74 6f 73 20 2d 20 66 74 73 35  fts5yytos - fts5
155a0 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
155b0 79 73 74 61 63 6b 29 3e 66 74 73 35 79 79 70 50  ystack)>fts5yypP
155c0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68 77 6d  arser->fts5yyhwm
155d0 20 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 70   ){..    fts5yyp
155e0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68 77  Parser->fts5yyhw
155f0 6d 2b 2b 3b 0d 0a 20 20 20 20 61 73 73 65 72 74  m++;..    assert
15600 28 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  ( fts5yypParser-
15610 3e 66 74 73 35 79 79 68 77 6d 20 3d 3d 20 28 69  >fts5yyhwm == (i
15620 6e 74 29 28 66 74 73 35 79 79 70 50 61 72 73 65  nt)(fts5yypParse
15630 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 2d 20 66  r->fts5yytos - f
15640 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
15650 73 35 79 79 73 74 61 63 6b 29 20 29 3b 0d 0a 20  s5yystack) );.. 
15660 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20   }..#endif..#if 
15670 66 74 73 35 59 59 53 54 41 43 4b 44 45 50 54 48  fts5YYSTACKDEPTH
15680 3e 30 20 0d 0a 20 20 69 66 28 20 66 74 73 35 79  >0 ..  if( fts5y
15690 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
156a0 74 6f 73 3e 66 74 73 35 79 79 70 50 61 72 73 65  tos>fts5yypParse
156b0 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 45 6e  r->fts5yystackEn
156c0 64 20 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79  d ){..    fts5yy
156d0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74  pParser->fts5yyt
156e0 6f 73 2d 2d 3b 0d 0a 20 20 20 20 66 74 73 35 79  os--;..    fts5y
156f0 79 53 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66  yStackOverflow(f
15700 74 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a  ts5yypParser);..
15710 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d      return;..  }
15720 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66 28 20 66  ..#else..  if( f
15730 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
15740 73 35 79 79 74 6f 73 3e 3d 26 66 74 73 35 79 79  s5yytos>=&fts5yy
15750 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
15760 74 61 63 6b 5b 66 74 73 35 79 79 70 50 61 72 73  tack[fts5yypPars
15770 65 72 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 5d  er->fts5yystksz]
15780 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 66 74 73   ){..    if( fts
15790 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66 74 73  5yyGrowStack(fts
157a0 35 79 79 70 50 61 72 73 65 72 29 20 29 7b 0d 0a  5yypParser) ){..
157b0 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
157c0 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 2d  ser->fts5yytos--
157d0 3b 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 53  ;..      fts5yyS
157e0 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74 73  tackOverflow(fts
157f0 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20  5yypParser);..  
15800 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20      return;..   
15810 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d   }..  }..#endif.
15820 0a 20 20 69 66 28 20 66 74 73 35 79 79 4e 65 77  .  if( fts5yyNew
15830 53 74 61 74 65 20 3e 20 66 74 73 35 59 59 5f 4d  State > fts5YY_M
15840 41 58 5f 53 48 49 46 54 20 29 7b 0d 0a 20 20 20  AX_SHIFT ){..   
15850 20 66 74 73 35 79 79 4e 65 77 53 74 61 74 65 20   fts5yyNewState 
15860 2b 3d 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45  += fts5YY_MIN_RE
15870 44 55 43 45 20 2d 20 66 74 73 35 59 59 5f 4d 49  DUCE - fts5YY_MI
15880 4e 5f 53 48 49 46 54 52 45 44 55 43 45 3b 0d 0a  N_SHIFTREDUCE;..
15890 20 20 7d 0d 0a 20 20 66 74 73 35 79 79 74 6f 73    }..  fts5yytos
158a0 20 3d 20 66 74 73 35 79 79 70 50 61 72 73 65 72   = fts5yypParser
158b0 2d 3e 66 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20  ->fts5yytos;..  
158c0 66 74 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65  fts5yytos->state
158d0 6e 6f 20 3d 20 66 74 73 35 79 79 4e 65 77 53 74  no = fts5yyNewSt
158e0 61 74 65 3b 0d 0a 20 20 66 74 73 35 79 79 74 6f  ate;..  fts5yyto
158f0 73 2d 3e 6d 61 6a 6f 72 20 3d 20 66 74 73 35 79  s->major = fts5y
15900 79 4d 61 6a 6f 72 3b 0d 0a 20 20 66 74 73 35 79  yMajor;..  fts5y
15910 79 74 6f 73 2d 3e 6d 69 6e 6f 72 2e 66 74 73 35  ytos->minor.fts5
15920 79 79 30 20 3d 20 66 74 73 35 79 79 4d 69 6e 6f  yy0 = fts5yyMino
15930 72 3b 0d 0a 20 20 66 74 73 35 79 79 54 72 61 63  r;..  fts5yyTrac
15940 65 53 68 69 66 74 28 66 74 73 35 79 79 70 50 61  eShift(fts5yypPa
15950 72 73 65 72 2c 20 66 74 73 35 79 79 4e 65 77 53  rser, fts5yyNewS
15960 74 61 74 65 2c 20 22 53 68 69 66 74 22 29 3b 0d  tate, "Shift");.
15970 0a 7d 0d 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c  .}..../* The fol
15980 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e  lowing table con
15990 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tains informatio
159a0 6e 20 61 62 6f 75 74 20 65 76 65 72 79 20 72 75  n about every ru
159b0 6c 65 20 74 68 61 74 0d 0a 2a 2a 20 69 73 20 75  le that..** is u
159c0 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 72  sed during the r
159d0 65 64 75 63 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  educe...*/..stat
159e0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
159f0 7b 0d 0a 20 20 66 74 73 35 59 59 43 4f 44 45 54  {..  fts5YYCODET
15a00 59 50 45 20 6c 68 73 3b 20 20 20 20 20 20 20 2f  YPE lhs;       /
15a10 2a 20 53 79 6d 62 6f 6c 20 6f 6e 20 74 68 65 20  * Symbol on the 
15a20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
15a30 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0d 0a 20  f the rule */.. 
15a40 20 73 69 67 6e 65 64 20 63 68 61 72 20 6e 72 68   signed char nrh
15a50 73 3b 20 20 20 20 20 2f 2a 20 4e 65 67 61 74 69  s;     /* Negati
15a60 76 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  ve of the number
15a70 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   of RHS symbols 
15a80 69 6e 20 74 68 65 20 72 75 6c 65 20 2a 2f 0d 0a  in the rule */..
15a90 7d 20 66 74 73 35 79 79 52 75 6c 65 49 6e 66 6f  } fts5yyRuleInfo
15aa0 5b 5d 20 3d 20 7b 0d 0a 20 20 7b 20 20 20 31 36  [] = {..  {   16
15ab0 2c 20 20 20 2d 31 20 7d 2c 20 2f 2a 20 28 30 29  ,   -1 }, /* (0)
15ac0 20 69 6e 70 75 74 20 3a 3a 3d 20 65 78 70 72 20   input ::= expr 
15ad0 2a 2f 0d 0a 20 20 7b 20 20 20 32 30 2c 20 20 20  */..  {   20,   
15ae0 2d 34 20 7d 2c 20 2f 2a 20 28 31 29 20 63 6f 6c  -4 }, /* (1) col
15af0 73 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20 4c 43  set ::= MINUS LC
15b00 50 20 63 6f 6c 73 65 74 6c 69 73 74 20 52 43 50  P colsetlist RCP
15b10 20 2a 2f 0d 0a 20 20 7b 20 20 20 32 30 2c 20 20   */..  {   20,  
15b20 20 2d 33 20 7d 2c 20 2f 2a 20 28 32 29 20 63 6f   -3 }, /* (2) co
15b30 6c 73 65 74 20 3a 3a 3d 20 4c 43 50 20 63 6f 6c  lset ::= LCP col
15b40 73 65 74 6c 69 73 74 20 52 43 50 20 2a 2f 0d 0a  setlist RCP */..
15b50 20 20 7b 20 20 20 32 30 2c 20 20 20 2d 31 20 7d    {   20,   -1 }
15b60 2c 20 2f 2a 20 28 33 29 20 63 6f 6c 73 65 74 20  , /* (3) colset 
15b70 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 20  ::= STRING */.. 
15b80 20 7b 20 20 20 32 30 2c 20 20 20 2d 32 20 7d 2c   {   20,   -2 },
15b90 20 2f 2a 20 28 34 29 20 63 6f 6c 73 65 74 20 3a   /* (4) colset :
15ba0 3a 3d 20 4d 49 4e 55 53 20 53 54 52 49 4e 47 20  := MINUS STRING 
15bb0 2a 2f 0d 0a 20 20 7b 20 20 20 32 31 2c 20 20 20  */..  {   21,   
15bc0 2d 32 20 7d 2c 20 2f 2a 20 28 35 29 20 63 6f 6c  -2 }, /* (5) col
15bd0 73 65 74 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 73  setlist ::= cols
15be0 65 74 6c 69 73 74 20 53 54 52 49 4e 47 20 2a 2f  etlist STRING */
15bf0 0d 0a 20 20 7b 20 20 20 32 31 2c 20 20 20 2d 31  ..  {   21,   -1
15c00 20 7d 2c 20 2f 2a 20 28 36 29 20 63 6f 6c 73 65   }, /* (6) colse
15c10 74 6c 69 73 74 20 3a 3a 3d 20 53 54 52 49 4e 47  tlist ::= STRING
15c20 20 2a 2f 0d 0a 20 20 7b 20 20 20 31 37 2c 20 20   */..  {   17,  
15c30 20 2d 33 20 7d 2c 20 2f 2a 20 28 37 29 20 65 78   -3 }, /* (7) ex
15c40 70 72 20 3a 3a 3d 20 65 78 70 72 20 41 4e 44 20  pr ::= expr AND 
15c50 65 78 70 72 20 2a 2f 0d 0a 20 20 7b 20 20 20 31  expr */..  {   1
15c60 37 2c 20 20 20 2d 33 20 7d 2c 20 2f 2a 20 28 38  7,   -3 }, /* (8
15c70 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20  ) expr ::= expr 
15c80 4f 52 20 65 78 70 72 20 2a 2f 0d 0a 20 20 7b 20  OR expr */..  { 
15c90 20 20 31 37 2c 20 20 20 2d 33 20 7d 2c 20 2f 2a    17,   -3 }, /*
15ca0 20 28 39 29 20 65 78 70 72 20 3a 3a 3d 20 65 78   (9) expr ::= ex
15cb0 70 72 20 4e 4f 54 20 65 78 70 72 20 2a 2f 0d 0a  pr NOT expr */..
15cc0 20 20 7b 20 20 20 31 37 2c 20 20 20 2d 35 20 7d    {   17,   -5 }
15cd0 2c 20 2f 2a 20 28 31 30 29 20 65 78 70 72 20 3a  , /* (10) expr :
15ce0 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20  := colset COLON 
15cf0 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d 0a 20  LP expr RP */.. 
15d00 20 7b 20 20 20 31 37 2c 20 20 20 2d 33 20 7d 2c   {   17,   -3 },
15d10 20 2f 2a 20 28 31 31 29 20 65 78 70 72 20 3a 3a   /* (11) expr ::
15d20 3d 20 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d  = LP expr RP */.
15d30 0a 20 20 7b 20 20 20 31 37 2c 20 20 20 2d 31 20  .  {   17,   -1 
15d40 7d 2c 20 2f 2a 20 28 31 32 29 20 65 78 70 72 20  }, /* (12) expr 
15d50 3a 3a 3d 20 65 78 70 72 6c 69 73 74 20 2a 2f 0d  ::= exprlist */.
15d60 0a 20 20 7b 20 20 20 31 39 2c 20 20 20 2d 31 20  .  {   19,   -1 
15d70 7d 2c 20 2f 2a 20 28 31 33 29 20 65 78 70 72 6c  }, /* (13) exprl
15d80 69 73 74 20 3a 3a 3d 20 63 6e 65 61 72 73 65 74  ist ::= cnearset
15d90 20 2a 2f 0d 0a 20 20 7b 20 20 20 31 39 2c 20 20   */..  {   19,  
15da0 20 2d 32 20 7d 2c 20 2f 2a 20 28 31 34 29 20 65   -2 }, /* (14) e
15db0 78 70 72 6c 69 73 74 20 3a 3a 3d 20 65 78 70 72  xprlist ::= expr
15dc0 6c 69 73 74 20 63 6e 65 61 72 73 65 74 20 2a 2f  list cnearset */
15dd0 0d 0a 20 20 7b 20 20 20 31 38 2c 20 20 20 2d 31  ..  {   18,   -1
15de0 20 7d 2c 20 2f 2a 20 28 31 35 29 20 63 6e 65 61   }, /* (15) cnea
15df0 72 73 65 74 20 3a 3a 3d 20 6e 65 61 72 73 65 74  rset ::= nearset
15e00 20 2a 2f 0d 0a 20 20 7b 20 20 20 31 38 2c 20 20   */..  {   18,  
15e10 20 2d 33 20 7d 2c 20 2f 2a 20 28 31 36 29 20 63   -3 }, /* (16) c
15e20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 63 6f 6c 73  nearset ::= cols
15e30 65 74 20 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74  et COLON nearset
15e40 20 2a 2f 0d 0a 20 20 7b 20 20 20 32 32 2c 20 20   */..  {   22,  
15e50 20 2d 31 20 7d 2c 20 2f 2a 20 28 31 37 29 20 6e   -1 }, /* (17) n
15e60 65 61 72 73 65 74 20 3a 3a 3d 20 70 68 72 61 73  earset ::= phras
15e70 65 20 2a 2f 0d 0a 20 20 7b 20 20 20 32 32 2c 20  e */..  {   22, 
15e80 20 20 2d 32 20 7d 2c 20 2f 2a 20 28 31 38 29 20    -2 }, /* (18) 
15e90 6e 65 61 72 73 65 74 20 3a 3a 3d 20 43 41 52 45  nearset ::= CARE
15ea0 54 20 70 68 72 61 73 65 20 2a 2f 0d 0a 20 20 7b  T phrase */..  {
15eb0 20 20 20 32 32 2c 20 20 20 2d 35 20 7d 2c 20 2f     22,   -5 }, /
15ec0 2a 20 28 31 39 29 20 6e 65 61 72 73 65 74 20 3a  * (19) nearset :
15ed0 3a 3d 20 53 54 52 49 4e 47 20 4c 50 20 6e 65 61  := STRING LP nea
15ee0 72 70 68 72 61 73 65 73 20 6e 65 61 72 64 69 73  rphrases neardis
15ef0 74 5f 6f 70 74 20 52 50 20 2a 2f 0d 0a 20 20 7b  t_opt RP */..  {
15f00 20 20 20 32 33 2c 20 20 20 2d 31 20 7d 2c 20 2f     23,   -1 }, /
15f10 2a 20 28 32 30 29 20 6e 65 61 72 70 68 72 61 73  * (20) nearphras
15f20 65 73 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a 2f  es ::= phrase */
15f30 0d 0a 20 20 7b 20 20 20 32 33 2c 20 20 20 2d 32  ..  {   23,   -2
15f40 20 7d 2c 20 2f 2a 20 28 32 31 29 20 6e 65 61 72   }, /* (21) near
15f50 70 68 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72  phrases ::= near
15f60 70 68 72 61 73 65 73 20 70 68 72 61 73 65 20 2a  phrases phrase *
15f70 2f 0d 0a 20 20 7b 20 20 20 32 35 2c 20 20 20 20  /..  {   25,    
15f80 30 20 7d 2c 20 2f 2a 20 28 32 32 29 20 6e 65 61  0 }, /* (22) nea
15f90 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 2a 2f  rdist_opt ::= */
15fa0 0d 0a 20 20 7b 20 20 20 32 35 2c 20 20 20 2d 32  ..  {   25,   -2
15fb0 20 7d 2c 20 2f 2a 20 28 32 33 29 20 6e 65 61 72   }, /* (23) near
15fc0 64 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d  dist_opt ::= COM
15fd0 4d 41 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 20 20  MA STRING */..  
15fe0 7b 20 20 20 32 34 2c 20 20 20 2d 34 20 7d 2c 20  {   24,   -4 }, 
15ff0 2f 2a 20 28 32 34 29 20 70 68 72 61 73 65 20 3a  /* (24) phrase :
16000 3a 3d 20 70 68 72 61 73 65 20 50 4c 55 53 20 53  := phrase PLUS S
16010 54 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20 2a  TRING star_opt *
16020 2f 0d 0a 20 20 7b 20 20 20 32 34 2c 20 20 20 2d  /..  {   24,   -
16030 32 20 7d 2c 20 2f 2a 20 28 32 35 29 20 70 68 72  2 }, /* (25) phr
16040 61 73 65 20 3a 3a 3d 20 53 54 52 49 4e 47 20 73  ase ::= STRING s
16050 74 61 72 5f 6f 70 74 20 2a 2f 0d 0a 20 20 7b 20  tar_opt */..  { 
16060 20 20 32 36 2c 20 20 20 2d 31 20 7d 2c 20 2f 2a    26,   -1 }, /*
16070 20 28 32 36 29 20 73 74 61 72 5f 6f 70 74 20 3a   (26) star_opt :
16080 3a 3d 20 53 54 41 52 20 2a 2f 0d 0a 20 20 7b 20  := STAR */..  { 
16090 20 20 32 36 2c 20 20 20 20 30 20 7d 2c 20 2f 2a    26,    0 }, /*
160a0 20 28 32 37 29 20 73 74 61 72 5f 6f 70 74 20 3a   (27) star_opt :
160b0 3a 3d 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 73 74 61  := */..};....sta
160c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 79 79 5f  tic void fts5yy_
160d0 61 63 63 65 70 74 28 66 74 73 35 79 79 50 61 72  accept(fts5yyPar
160e0 73 65 72 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ser*);  /* Forwa
160f0 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd Declaration *
16100 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 65 72 66  /..../*..** Perf
16110 6f 72 6d 20 61 20 72 65 64 75 63 65 20 61 63 74  orm a reduce act
16120 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 68 69 66  ion and the shif
16130 74 20 74 68 61 74 20 6d 75 73 74 20 69 6d 6d 65  t that must imme
16140 64 69 61 74 65 6c 79 0d 0a 2a 2a 20 66 6f 6c 6c  diately..** foll
16150 6f 77 20 74 68 65 20 72 65 64 75 63 65 2e 0d 0a  ow the reduce...
16160 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 74 73 35 79  **..** The fts5y
16170 79 4c 6f 6f 6b 61 68 65 61 64 20 61 6e 64 20 66  yLookahead and f
16180 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64 54 6f  ts5yyLookaheadTo
16190 6b 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 70  ken parameters p
161a0 72 6f 76 69 64 65 20 72 65 64 75 63 65 20 61 63  rovide reduce ac
161b0 74 69 6f 6e 73 0d 0a 2a 2a 20 61 63 63 65 73 73  tions..** access
161c0 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   to the lookahea
161d0 64 20 74 6f 6b 65 6e 20 28 69 66 20 61 6e 79 29  d token (if any)
161e0 2e 20 20 54 68 65 20 66 74 73 35 79 79 4c 6f 6f  .  The fts5yyLoo
161f0 6b 61 68 65 61 64 20 77 69 6c 6c 20 62 65 20 66  kahead will be f
16200 74 73 35 59 59 4e 4f 43 4f 44 45 0d 0a 2a 2a 20  ts5YYNOCODE..** 
16210 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  if the lookahead
16220 20 74 6f 6b 65 6e 20 68 61 73 20 61 6c 72 65 61   token has alrea
16230 64 79 20 62 65 65 6e 20 63 6f 6e 73 75 6d 65 64  dy been consumed
16240 2e 20 20 41 73 20 74 68 69 73 20 70 72 6f 63 65  .  As this proce
16250 64 75 72 65 20 69 73 0d 0a 2a 2a 20 6f 6e 6c 79  dure is..** only
16260 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 6f 6e 65   called from one
16270 20 70 6c 61 63 65 2c 20 6f 70 74 69 6d 69 7a 69   place, optimizi
16280 6e 67 20 63 6f 6d 70 69 6c 65 72 73 20 77 69 6c  ng compilers wil
16290 6c 20 69 6e 2d 6c 69 6e 65 20 69 74 2c 20 77 68  l in-line it, wh
162a0 69 63 68 0d 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  ich..** means th
162b0 61 74 20 74 68 65 20 65 78 74 72 61 20 70 61 72  at the extra par
162c0 61 6d 65 74 65 72 73 20 68 61 76 65 20 6e 6f 20  ameters have no 
162d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 61  performance impa
162e0 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ct...*/..static 
162f0 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45  fts5YYACTIONTYPE
16300 20 66 74 73 35 79 79 5f 72 65 64 75 63 65 28 0d   fts5yy_reduce(.
16310 0a 20 20 66 74 73 35 79 79 50 61 72 73 65 72 20  .  fts5yyParser 
16320 2a 66 74 73 35 79 79 70 50 61 72 73 65 72 2c 20  *fts5yypParser, 
16330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16340 61 72 73 65 72 20 2a 2f 0d 0a 20 20 75 6e 73 69  arser */..  unsi
16350 67 6e 65 64 20 69 6e 74 20 66 74 73 35 79 79 72  gned int fts5yyr
16360 75 6c 65 6e 6f 2c 20 20 20 20 20 20 20 2f 2a 20  uleno,       /* 
16370 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 75  Number of the ru
16380 6c 65 20 62 79 20 77 68 69 63 68 20 74 6f 20 72  le by which to r
16390 65 64 75 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20  educe */..  int 
163a0 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64 2c  fts5yyLookahead,
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
163c0 4c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e 2c  Lookahead token,
163d0 20 6f 72 20 66 74 73 35 59 59 4e 4f 43 4f 44 45   or fts5YYNOCODE
163e0 20 69 66 20 6e 6f 6e 65 20 2a 2f 0d 0a 20 20 73   if none */..  s
163f0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
16400 46 54 53 35 54 4f 4b 45 4e 54 59 50 45 20 66 74  FTS5TOKENTYPE ft
16410 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64 54 6f 6b  s5yyLookaheadTok
16420 65 6e 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20  en  /* Value of 
16430 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f  the lookahead to
16440 6b 65 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65  ken */..  sqlite
16450 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 50  3Fts5ParserCTX_P
16460 44 45 43 4c 20 20 20 20 20 20 20 20 20 20 20 20  DECL            
16470 20 20 20 20 20 20 20 2f 2a 20 25 65 78 74 72 61         /* %extra
16480 5f 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a 29 7b 0d  _context */..){.
16490 0a 20 20 69 6e 74 20 66 74 73 35 79 79 67 6f 74  .  int fts5yygot
164a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
164b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
164c0 78 74 20 73 74 61 74 65 20 2a 2f 0d 0a 20 20 66  xt state */..  f
164d0 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ts5YYACTIONTYPE 
164e0 66 74 73 35 79 79 61 63 74 3b 20 20 20 20 20 20  fts5yyact;      
164f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
16500 78 74 20 61 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20  xt action */..  
16510 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79  fts5yyStackEntry
16520 20 2a 66 74 73 35 79 79 6d 73 70 3b 20 20 20 20   *fts5yymsp;    
16530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
16540 6f 70 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  op of the parser
16550 27 73 20 73 74 61 63 6b 20 2a 2f 0d 0a 20 20 69  's stack */..  i
16560 6e 74 20 66 74 73 35 79 79 73 69 7a 65 3b 20 20  nt fts5yysize;  
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 74 6f 20     /* Amount to 
16590 70 6f 70 20 74 68 65 20 73 74 61 63 6b 20 2a 2f  pop the stack */
165a0 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
165b0 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a  arserARG_FETCH..
165c0 20 20 28 76 6f 69 64 29 66 74 73 35 79 79 4c 6f    (void)fts5yyLo
165d0 6f 6b 61 68 65 61 64 3b 0d 0a 20 20 28 76 6f 69  okahead;..  (voi
165e0 64 29 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61  d)fts5yyLookahea
165f0 64 54 6f 6b 65 6e 3b 0d 0a 20 20 66 74 73 35 79  dToken;..  fts5y
16600 79 6d 73 70 20 3d 20 66 74 73 35 79 79 70 50 61  ymsp = fts5yypPa
16610 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3b  rser->fts5yytos;
16620 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
16630 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 54 72  ..  if( fts5yyTr
16640 61 63 65 46 49 4c 45 20 26 26 20 66 74 73 35 79  aceFILE && fts5y
16650 79 72 75 6c 65 6e 6f 3c 28 69 6e 74 29 28 73 69  yruleno<(int)(si
16660 7a 65 6f 66 28 66 74 73 35 79 79 52 75 6c 65 4e  zeof(fts5yyRuleN
16670 61 6d 65 29 2f 73 69 7a 65 6f 66 28 66 74 73 35  ame)/sizeof(fts5
16680 79 79 52 75 6c 65 4e 61 6d 65 5b 30 5d 29 29 20  yyRuleName[0])) 
16690 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 73 69  ){..    fts5yysi
166a0 7a 65 20 3d 20 66 74 73 35 79 79 52 75 6c 65 49  ze = fts5yyRuleI
166b0 6e 66 6f 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f  nfo[fts5yyruleno
166c0 5d 2e 6e 72 68 73 3b 0d 0a 20 20 20 20 69 66 28  ].nrhs;..    if(
166d0 20 66 74 73 35 79 79 73 69 7a 65 20 29 7b 0d 0a   fts5yysize ){..
166e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 74        fprintf(ft
166f0 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 20 22  s5yyTraceFILE, "
16700 25 73 52 65 64 75 63 65 20 25 64 20 5b 25 73 5d  %sReduce %d [%s]
16710 2c 20 67 6f 20 74 6f 20 73 74 61 74 65 20 25 64  , go to state %d
16720 2e 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 66  .\n",..        f
16730 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74  ts5yyTracePrompt
16740 2c 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79  ,..        fts5y
16750 79 72 75 6c 65 6e 6f 2c 20 66 74 73 35 79 79 52  yruleno, fts5yyR
16760 75 6c 65 4e 61 6d 65 5b 66 74 73 35 79 79 72 75  uleName[fts5yyru
16770 6c 65 6e 6f 5d 2c 20 66 74 73 35 79 79 6d 73 70  leno], fts5yymsp
16780 5b 66 74 73 35 79 79 73 69 7a 65 5d 2e 73 74 61  [fts5yysize].sta
16790 74 65 6e 6f 29 3b 0d 0a 20 20 20 20 7d 65 6c 73  teno);..    }els
167a0 65 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e 74  e{..      fprint
167b0 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  f(fts5yyTraceFIL
167c0 45 2c 20 22 25 73 52 65 64 75 63 65 20 25 64 20  E, "%sReduce %d 
167d0 5b 25 73 5d 2e 5c 6e 22 2c 0d 0a 20 20 20 20 20  [%s].\n",..     
167e0 20 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72     fts5yyTracePr
167f0 6f 6d 70 74 2c 20 66 74 73 35 79 79 72 75 6c 65  ompt, fts5yyrule
16800 6e 6f 2c 20 66 74 73 35 79 79 52 75 6c 65 4e 61  no, fts5yyRuleNa
16810 6d 65 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d  me[fts5yyruleno]
16820 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
16830 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
16840 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63   */....  /* Chec
16850 6b 20 74 68 61 74 20 74 68 65 20 73 74 61 63 6b  k that the stack
16860 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
16870 20 74 6f 20 67 72 6f 77 20 62 79 20 61 20 73 69   to grow by a si
16880 6e 67 6c 65 20 65 6e 74 72 79 0d 0a 20 20 2a 2a  ngle entry..  **
16890 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
168a0 68 65 20 72 75 6c 65 20 69 73 20 65 6d 70 74 79  he rule is empty
168b0 2e 20 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  .  This ensures 
168c0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f  that there is ro
168d0 6f 6d 0d 0a 20 20 2a 2a 20 65 6e 6f 75 67 68 20  om..  ** enough 
168e0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 74 6f 20  on the stack to 
168f0 70 75 73 68 20 74 68 65 20 4c 48 53 20 76 61 6c  push the LHS val
16900 75 65 20 2a 2f 0d 0a 20 20 69 66 28 20 66 74 73  ue */..  if( fts
16910 35 79 79 52 75 6c 65 49 6e 66 6f 5b 66 74 73 35  5yyRuleInfo[fts5
16920 79 79 72 75 6c 65 6e 6f 5d 2e 6e 72 68 73 3d 3d  yyruleno].nrhs==
16930 30 20 29 7b 0d 0a 23 69 66 64 65 66 20 66 74 73  0 ){..#ifdef fts
16940 35 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43 4b  5YYTRACKMAXSTACK
16950 44 45 50 54 48 0d 0a 20 20 20 20 69 66 28 20 28  DEPTH..    if( (
16960 69 6e 74 29 28 66 74 73 35 79 79 70 50 61 72 73  int)(fts5yypPars
16970 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 2d 20  er->fts5yytos - 
16980 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
16990 74 73 35 79 79 73 74 61 63 6b 29 3e 66 74 73 35  ts5yystack)>fts5
169a0 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
169b0 79 68 77 6d 20 29 7b 0d 0a 20 20 20 20 20 20 66  yhwm ){..      f
169c0 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
169d0 73 35 79 79 68 77 6d 2b 2b 3b 0d 0a 20 20 20 20  s5yyhwm++;..    
169e0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79    assert( fts5yy
169f0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68  pParser->fts5yyh
16a00 77 6d 20 3d 3d 20 28 69 6e 74 29 28 66 74 73 35  wm == (int)(fts5
16a10 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
16a20 79 74 6f 73 20 2d 20 66 74 73 35 79 79 70 50 61  ytos - fts5yypPa
16a30 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
16a40 6b 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e  k));..    }..#en
16a50 64 69 66 0d 0a 23 69 66 20 66 74 73 35 59 59 53  dif..#if fts5YYS
16a60 54 41 43 4b 44 45 50 54 48 3e 30 20 0d 0a 20 20  TACKDEPTH>0 ..  
16a70 20 20 69 66 28 20 66 74 73 35 79 79 70 50 61 72    if( fts5yypPar
16a80 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 3d  ser->fts5yytos>=
16a90 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
16aa0 74 73 35 79 79 73 74 61 63 6b 45 6e 64 20 29 7b  ts5yystackEnd ){
16ab0 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 53 74  ..      fts5yySt
16ac0 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74 73 35  ackOverflow(fts5
16ad0 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20 20  yypParser);..   
16ae0 20 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 74     /* The call t
16af0 6f 20 66 74 73 35 79 79 53 74 61 63 6b 4f 76 65  o fts5yyStackOve
16b00 72 66 6c 6f 77 28 29 20 61 62 6f 76 65 20 70 6f  rflow() above po
16b10 70 73 20 74 68 65 20 73 74 61 63 6b 20 75 6e 74  ps the stack unt
16b20 69 6c 20 69 74 20 69 73 0d 0a 20 20 20 20 20 20  il it is..      
16b30 2a 2a 20 65 6d 70 74 79 2c 20 63 61 75 73 69 6e  ** empty, causin
16b40 67 20 74 68 65 20 6d 61 69 6e 20 70 61 72 73 65  g the main parse
16b50 72 20 6c 6f 6f 70 20 74 6f 20 65 78 69 74 2e 20  r loop to exit. 
16b60 20 53 6f 20 74 68 65 20 72 65 74 75 72 6e 20 76   So the return v
16b70 61 6c 75 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69  alue..      ** i
16b80 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64  s never used and
16b90 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
16ba0 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75  . */..      retu
16bb0 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65  rn 0;..    }..#e
16bc0 6c 73 65 0d 0a 20 20 20 20 69 66 28 20 66 74 73  lse..    if( fts
16bd0 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
16be0 79 79 74 6f 73 3e 3d 26 66 74 73 35 79 79 70 50  yytos>=&fts5yypP
16bf0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
16c00 63 6b 5b 66 74 73 35 79 79 70 50 61 72 73 65 72  ck[fts5yypParser
16c10 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 2d 31 5d  ->fts5yystksz-1]
16c20 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 66   ){..      if( f
16c30 74 73 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66  ts5yyGrowStack(f
16c40 74 73 35 79 79 70 50 61 72 73 65 72 29 20 29 7b  ts5yypParser) ){
16c50 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
16c60 53 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74  StackOverflow(ft
16c70 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20  s5yypParser);.. 
16c80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 61         /* The ca
16c90 6c 6c 20 74 6f 20 66 74 73 35 79 79 53 74 61 63  ll to fts5yyStac
16ca0 6b 4f 76 65 72 66 6c 6f 77 28 29 20 61 62 6f 76  kOverflow() abov
16cb0 65 20 70 6f 70 73 20 74 68 65 20 73 74 61 63 6b  e pops the stack
16cc0 20 75 6e 74 69 6c 20 69 74 20 69 73 0d 0a 20 20   until it is..  
16cd0 20 20 20 20 20 20 2a 2a 20 65 6d 70 74 79 2c 20        ** empty, 
16ce0 63 61 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e  causing the main
16cf0 20 70 61 72 73 65 72 20 6c 6f 6f 70 20 74 6f 20   parser loop to 
16d00 65 78 69 74 2e 20 20 53 6f 20 74 68 65 20 72 65  exit.  So the re
16d10 74 75 72 6e 20 76 61 6c 75 65 0d 0a 20 20 20 20  turn value..    
16d20 20 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20      ** is never 
16d30 75 73 65 64 20 61 6e 64 20 64 6f 65 73 20 6e 6f  used and does no
16d40 74 20 6d 61 74 74 65 72 2e 20 2a 2f 0d 0a 20 20  t matter. */..  
16d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
16d60 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
16d70 66 74 73 35 79 79 6d 73 70 20 3d 20 66 74 73 35  fts5yymsp = fts5
16d80 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
16d90 79 74 6f 73 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65  ytos;..    }..#e
16da0 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 73  ndif..  }....  s
16db0 77 69 74 63 68 28 20 66 74 73 35 79 79 72 75 6c  witch( fts5yyrul
16dc0 65 6e 6f 20 29 7b 0d 0a 20 20 2f 2a 20 42 65 67  eno ){..  /* Beg
16dd0 69 6e 6e 69 6e 67 20 68 65 72 65 20 61 72 65 20  inning here are 
16de0 74 68 65 20 72 65 64 75 63 74 69 6f 6e 20 63 61  the reduction ca
16df0 73 65 73 2e 20 20 41 20 74 79 70 69 63 61 6c 20  ses.  A typical 
16e00 65 78 61 6d 70 6c 65 0d 0a 20 20 2a 2a 20 66 6f  example..  ** fo
16e10 6c 6c 6f 77 73 3a 0d 0a 20 20 2a 2a 20 20 20 63  llows:..  **   c
16e20 61 73 65 20 30 3a 0d 0a 20 20 2a 2a 20 20 23 6c  ase 0:..  **  #l
16e30 69 6e 65 20 3c 6c 69 6e 65 6e 6f 3e 20 3c 67 72  ine <lineno> <gr
16e40 61 6d 6d 61 72 66 69 6c 65 3e 0d 0a 20 20 2a 2a  ammarfile>..  **
16e50 20 20 20 20 20 7b 20 2e 2e 2e 20 7d 20 20 20 20       { ... }    
16e60 20 20 20 20 20 20 20 2f 2f 20 55 73 65 72 20 73         // User s
16e70 75 70 70 6c 69 65 64 20 63 6f 64 65 0d 0a 20 20  upplied code..  
16e80 2a 2a 20 20 23 6c 69 6e 65 20 3c 6c 69 6e 65 6e  **  #line <linen
16e90 6f 3e 20 3c 74 68 69 73 66 69 6c 65 3e 0d 0a 20  o> <thisfile>.. 
16ea0 20 2a 2a 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a   **     break;..
16eb0 20 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    */../*********
16ec0 2a 20 42 65 67 69 6e 20 72 65 64 75 63 65 20 61  * Begin reduce a
16ed0 63 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ctions *********
16ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f00 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20 20 20 20 20  *****/..        
16f10 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45 20  fts5YYMINORTYPE 
16f20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 3b 0d  fts5yylhsminor;.
16f30 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 2f  .      case 0: /
16f40 2a 20 69 6e 70 75 74 20 3a 3a 3d 20 65 78 70 72  * input ::= expr
16f50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 38 32 20 22 66   */..#line 82 "f
16f60 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 73  ts5parse.y"..{ s
16f70 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46  qlite3Fts5ParseF
16f80 69 6e 69 73 68 65 64 28 70 50 61 72 73 65 2c 20  inished(pParse, 
16f90 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
16fa0 6f 72 2e 66 74 73 35 79 79 32 34 29 3b 20 7d 0d  or.fts5yy24); }.
16fb0 0a 23 6c 69 6e 65 20 31 30 32 30 20 22 66 74 73  .#line 1020 "fts
16fc0 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20 20  5parse.c"..     
16fd0 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
16fe0 20 63 61 73 65 20 31 3a 20 2f 2a 20 63 6f 6c 73   case 1: /* cols
16ff0 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20 4c 43 50  et ::= MINUS LCP
17000 20 63 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 20   colsetlist RCP 
17010 2a 2f 0d 0a 23 6c 69 6e 65 20 39 37 20 22 66 74  */..#line 97 "ft
17020 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a  s5parse.y"..{ ..
17030 20 20 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 33      fts5yymsp[-3
17040 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31  ].minor.fts5yy11
17050 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
17060 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74 28  rseColsetInvert(
17070 70 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73  pParse, fts5yyms
17080 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-1].minor.fts5
17090 79 79 31 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  yy11);..}..#line
170a0 20 31 30 32 37 20 22 66 74 73 35 70 61 72 73 65   1027 "fts5parse
170b0 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65  .c"..        bre
170c0 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
170d0 32 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d  2: /* colset ::=
170e0 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 20   LCP colsetlist 
170f0 52 43 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30  RCP */..#line 10
17100 30 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  0 "fts5parse.y".
17110 0a 7b 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d  .{ fts5yymsp[-2]
17120 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20  .minor.fts5yy11 
17130 3d 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e  = fts5yymsp[-1].
17140 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 3b 20  minor.fts5yy11; 
17150 7d 0d 0a 23 6c 69 6e 65 20 31 30 33 32 20 22 66  }..#line 1032 "f
17160 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20  ts5parse.c"..   
17170 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
17180 20 20 20 63 61 73 65 20 33 3a 20 2f 2a 20 63 6f     case 3: /* co
17190 6c 73 65 74 20 3a 3a 3d 20 53 54 52 49 4e 47 20  lset ::= STRING 
171a0 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30 31 20 22 66  */..#line 101 "f
171b0 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a  ts5parse.y"..{..
171c0 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72    fts5yylhsminor
171d0 2e 66 74 73 35 79 79 31 31 20 3d 20 73 71 6c 69  .fts5yy11 = sqli
171e0 74 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73  te3Fts5ParseCols
171f0 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 26 66  et(pParse, 0, &f
17200 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
17210 72 2e 66 74 73 35 79 79 30 29 3b 0d 0a 7d 0d 0a  r.fts5yy0);..}..
17220 23 6c 69 6e 65 20 31 30 33 39 20 22 66 74 73 35  #line 1039 "fts5
17230 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35  parse.c"..  fts5
17240 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66  yymsp[0].minor.f
17250 74 73 35 79 79 31 31 20 3d 20 66 74 73 35 79 79  ts5yy11 = fts5yy
17260 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  lhsminor.fts5yy1
17270 31 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  1;..        brea
17280 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 34  k;..      case 4
17290 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d 20  : /* colset ::= 
172a0 4d 49 4e 55 53 20 53 54 52 49 4e 47 20 2a 2f 0d  MINUS STRING */.
172b0 0a 23 6c 69 6e 65 20 31 30 34 20 22 66 74 73 35  .#line 104 "fts5
172c0 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
172d0 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
172e0 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20 73 71  or.fts5yy11 = sq
172f0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
17300 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lset(pParse, 0, 
17310 26 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69  &fts5yymsp[0].mi
17320 6e 6f 72 2e 66 74 73 35 79 79 30 29 3b 0d 0a 20  nor.fts5yy0);.. 
17330 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d   fts5yymsp[-1].m
17340 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20  inor.fts5yy11 = 
17350 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
17360 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 70 50 61  ColsetInvert(pPa
17370 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d  rse, fts5yymsp[-
17380 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  1].minor.fts5yy1
17390 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 30  1);..}..#line 10
173a0 34 38 20 22 66 74 73 35 70 61 72 73 65 2e 63 22  48 "fts5parse.c"
173b0 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
173c0 0d 0a 20 20 20 20 20 20 63 61 73 65 20 35 3a 20  ..      case 5: 
173d0 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a  /* colsetlist ::
173e0 3d 20 63 6f 6c 73 65 74 6c 69 73 74 20 53 54 52  = colsetlist STR
173f0 49 4e 47 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30  ING */..#line 10
17400 39 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  9 "fts5parse.y".
17410 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79 6c 68 73  .{ ..  fts5yylhs
17420 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d  minor.fts5yy11 =
17430 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
17440 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20  eColset(pParse, 
17450 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
17460 6e 6f 72 2e 66 74 73 35 79 79 31 31 2c 20 26 66  nor.fts5yy11, &f
17470 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
17480 72 2e 66 74 73 35 79 79 30 29 3b 20 7d 0d 0a 23  r.fts5yy0); }..#
17490 6c 69 6e 65 20 31 30 35 34 20 22 66 74 73 35 70  line 1054 "fts5p
174a0 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79  arse.c"..  fts5y
174b0 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-1].minor.f
174c0 74 73 35 79 79 31 31 20 3d 20 66 74 73 35 79 79  ts5yy11 = fts5yy
174d0 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  lhsminor.fts5yy1
174e0 31 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  1;..        brea
174f0 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 36  k;..      case 6
17500 3a 20 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20  : /* colsetlist 
17510 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 23  ::= STRING */..#
17520 6c 69 6e 65 20 31 31 31 20 22 66 74 73 35 70 61  line 111 "fts5pa
17530 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74  rse.y"..{ ..  ft
17540 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17550 35 79 79 31 31 20 3d 20 73 71 6c 69 74 65 33 46  5yy11 = sqlite3F
17560 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 70  ts5ParseColset(p
17570 50 61 72 73 65 2c 20 30 2c 20 26 66 74 73 35 79  Parse, 0, &fts5y
17580 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
17590 73 35 79 79 30 29 3b 20 0d 0a 7d 0d 0a 23 6c 69  s5yy0); ..}..#li
175a0 6e 65 20 31 30 36 32 20 22 66 74 73 35 70 61 72  ne 1062 "fts5par
175b0 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d  se.c"..  fts5yym
175c0 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
175d0 79 79 31 31 20 3d 20 66 74 73 35 79 79 6c 68 73  yy11 = fts5yylhs
175e0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 3b 0d  minor.fts5yy11;.
175f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
17600 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a 20 2f  .      case 7: /
17610 2a 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20  * expr ::= expr 
17620 41 4e 44 20 65 78 70 72 20 2a 2f 0d 0a 23 6c 69  AND expr */..#li
17630 6e 65 20 31 31 35 20 22 66 74 73 35 70 61 72 73  ne 115 "fts5pars
17640 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73 35 79  e.y"..{..  fts5y
17650 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
17660 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  24 = sqlite3Fts5
17670 50 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65  ParseNode(pParse
17680 2c 20 46 54 53 35 5f 41 4e 44 2c 20 66 74 73 35  , FTS5_AND, fts5
17690 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e  yymsp[-2].minor.
176a0 66 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79  fts5yy24, fts5yy
176b0 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73  msp[0].minor.fts
176c0 35 79 79 32 34 2c 20 30 29 3b 0d 0a 7d 0d 0a 23  5yy24, 0);..}..#
176d0 6c 69 6e 65 20 31 30 37 30 20 22 66 74 73 35 70  line 1070 "fts5p
176e0 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79  arse.c"..  fts5y
176f0 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-2].minor.f
17700 74 73 35 79 79 32 34 20 3d 20 66 74 73 35 79 79  ts5yy24 = fts5yy
17710 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32  lhsminor.fts5yy2
17720 34 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  4;..        brea
17730 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 38  k;..      case 8
17740 3a 20 2f 2a 20 65 78 70 72 20 3a 3a 3d 20 65 78  : /* expr ::= ex
17750 70 72 20 4f 52 20 65 78 70 72 20 2a 2f 0d 0a 23  pr OR expr */..#
17760 6c 69 6e 65 20 31 31 38 20 22 66 74 73 35 70 61  line 118 "fts5pa
17770 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73  rse.y"..{..  fts
17780 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
17790 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74  yy24 = sqlite3Ft
177a0 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50 61 72  s5ParseNode(pPar
177b0 73 65 2c 20 46 54 53 35 5f 4f 52 2c 20 66 74 73  se, FTS5_OR, fts
177c0 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72  5yymsp[-2].minor
177d0 2e 66 74 73 35 79 79 32 34 2c 20 66 74 73 35 79  .fts5yy24, fts5y
177e0 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
177f0 73 35 79 79 32 34 2c 20 30 29 3b 0d 0a 7d 0d 0a  s5yy24, 0);..}..
17800 23 6c 69 6e 65 20 31 30 37 38 20 22 66 74 73 35  #line 1078 "fts5
17810 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35  parse.c"..  fts5
17820 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e  yymsp[-2].minor.
17830 66 74 73 35 79 79 32 34 20 3d 20 66 74 73 35 79  fts5yy24 = fts5y
17840 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
17850 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65  24;..        bre
17860 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
17870 39 3a 20 2f 2a 20 65 78 70 72 20 3a 3a 3d 20 65  9: /* expr ::= e
17880 78 70 72 20 4e 4f 54 20 65 78 70 72 20 2a 2f 0d  xpr NOT expr */.
17890 0a 23 6c 69 6e 65 20 31 32 31 20 22 66 74 73 35  .#line 121 "fts5
178a0 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
178b0 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
178c0 73 35 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33  s5yy24 = sqlite3
178d0 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50  Fts5ParseNode(pP
178e0 61 72 73 65 2c 20 46 54 53 35 5f 4e 4f 54 2c 20  arse, FTS5_NOT, 
178f0 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69  fts5yymsp[-2].mi
17900 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 66 74  nor.fts5yy24, ft
17910 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
17920 2e 66 74 73 35 79 79 32 34 2c 20 30 29 3b 0d 0a  .fts5yy24, 0);..
17930 7d 0d 0a 23 6c 69 6e 65 20 31 30 38 36 20 22 66  }..#line 1086 "f
17940 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
17950 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e  ts5yymsp[-2].min
17960 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74  or.fts5yy24 = ft
17970 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17980 35 79 79 32 34 3b 0d 0a 20 20 20 20 20 20 20 20  5yy24;..        
17990 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
179a0 73 65 20 31 30 3a 20 2f 2a 20 65 78 70 72 20 3a  se 10: /* expr :
179b0 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20  := colset COLON 
179c0 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d 0a 23  LP expr RP */..#
179d0 6c 69 6e 65 20 31 32 35 20 22 66 74 73 35 70 61  line 125 "fts5pa
179e0 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 73 71 6c  rse.y"..{..  sql
179f0 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
17a00 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 66  Colset(pParse, f
17a10 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
17a20 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 66 74 73  or.fts5yy24, fts
17a30 35 79 79 6d 73 70 5b 2d 34 5d 2e 6d 69 6e 6f 72  5yymsp[-4].minor
17a40 2e 66 74 73 35 79 79 31 31 29 3b 0d 0a 20 20 66  .fts5yy11);..  f
17a50 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
17a60 73 35 79 79 32 34 20 3d 20 66 74 73 35 79 79 6d  s5yy24 = fts5yym
17a70 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
17a80 35 79 79 32 34 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  5yy24;..}..#line
17a90 20 31 30 39 35 20 22 66 74 73 35 70 61 72 73 65   1095 "fts5parse
17aa0 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70  .c"..  fts5yymsp
17ab0 5b 2d 34 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-4].minor.fts5y
17ac0 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73 6d  y24 = fts5yylhsm
17ad0 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a  inor.fts5yy24;..
17ae0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
17af0 20 20 20 20 20 20 63 61 73 65 20 31 31 3a 20 2f        case 11: /
17b00 2a 20 65 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78  * expr ::= LP ex
17b10 70 72 20 52 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20  pr RP */..#line 
17b20 31 32 39 20 22 66 74 73 35 70 61 72 73 65 2e 79  129 "fts5parse.y
17b30 22 0d 0a 7b 66 74 73 35 79 79 6d 73 70 5b 2d 32  "..{fts5yymsp[-2
17b40 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34  ].minor.fts5yy24
17b50 20 3d 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d   = fts5yymsp[-1]
17b60 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b  .minor.fts5yy24;
17b70 7d 0d 0a 23 6c 69 6e 65 20 31 31 30 31 20 22 66  }..#line 1101 "f
17b80 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20  ts5parse.c"..   
17b90 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
17ba0 20 20 20 63 61 73 65 20 31 32 3a 20 2f 2a 20 65     case 12: /* e
17bb0 78 70 72 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74  xpr ::= exprlist
17bc0 20 2a 2f 0d 0a 20 20 20 20 20 20 63 61 73 65 20   */..      case 
17bd0 31 33 3a 20 2f 2a 20 65 78 70 72 6c 69 73 74 20  13: /* exprlist 
17be0 3a 3a 3d 20 63 6e 65 61 72 73 65 74 20 2a 2f 20  ::= cnearset */ 
17bf0 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28 66  fts5yytestcase(f
17c00 74 73 35 79 79 72 75 6c 65 6e 6f 3d 3d 31 33 29  ts5yyruleno==13)
17c10 3b 0d 0a 23 6c 69 6e 65 20 31 33 30 20 22 66 74  ;..#line 130 "ft
17c20 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 66 74 73  s5parse.y"..{fts
17c30 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
17c40 79 79 32 34 20 3d 20 66 74 73 35 79 79 6d 73 70  yy24 = fts5yymsp
17c50 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
17c60 32 34 3b 7d 0d 0a 23 6c 69 6e 65 20 31 31 30 37  24;}..#line 1107
17c70 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
17c80 20 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d    fts5yymsp[0].m
17c90 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20  inor.fts5yy24 = 
17ca0 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
17cb0 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20 20 20  ts5yy24;..      
17cc0 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
17cd0 63 61 73 65 20 31 34 3a 20 2f 2a 20 65 78 70 72  case 14: /* expr
17ce0 6c 69 73 74 20 3a 3a 3d 20 65 78 70 72 6c 69 73  list ::= exprlis
17cf0 74 20 63 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 23  t cnearset */..#
17d00 6c 69 6e 65 20 31 33 33 20 22 66 74 73 35 70 61  line 133 "fts5pa
17d10 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73  rse.y"..{..  fts
17d20 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
17d30 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74  yy24 = sqlite3Ft
17d40 73 35 50 61 72 73 65 49 6d 70 6c 69 63 69 74 41  s5ParseImplicitA
17d50 6e 64 28 70 50 61 72 73 65 2c 20 66 74 73 35 79  nd(pParse, fts5y
17d60 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-1].minor.f
17d70 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79 6d  ts5yy24, fts5yym
17d80 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
17d90 79 79 32 34 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  yy24);..}..#line
17da0 20 31 31 31 35 20 22 66 74 73 35 70 61 72 73 65   1115 "fts5parse
17db0 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70  .c"..  fts5yymsp
17dc0 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
17dd0 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73 6d  y24 = fts5yylhsm
17de0 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a  inor.fts5yy24;..
17df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
17e00 20 20 20 20 20 20 63 61 73 65 20 31 35 3a 20 2f        case 15: /
17e10 2a 20 63 6e 65 61 72 73 65 74 20 3a 3a 3d 20 6e  * cnearset ::= n
17e20 65 61 72 73 65 74 20 2a 2f 0d 0a 23 6c 69 6e 65  earset */..#line
17e30 20 31 33 37 20 22 66 74 73 35 70 61 72 73 65 2e   137 "fts5parse.
17e40 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79  y"..{ ..  fts5yy
17e50 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32  lhsminor.fts5yy2
17e60 34 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  4 = sqlite3Fts5P
17e70 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c  arseNode(pParse,
17e80 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 30 2c   FTS5_STRING, 0,
17e90 20 30 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d   0, fts5yymsp[0]
17ea0 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 29  .minor.fts5yy46)
17eb0 3b 20 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 32  ; ..}..#line 112
17ec0 33 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  3 "fts5parse.c".
17ed0 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e  .  fts5yymsp[0].
17ee0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d  minor.fts5yy24 =
17ef0 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
17f00 66 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20 20  fts5yy24;..     
17f10 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
17f20 20 63 61 73 65 20 31 36 3a 20 2f 2a 20 63 6e 65   case 16: /* cne
17f30 61 72 73 65 74 20 3a 3a 3d 20 63 6f 6c 73 65 74  arset ::= colset
17f40 20 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74 20 2a   COLON nearset *
17f50 2f 0d 0a 23 6c 69 6e 65 20 31 34 30 20 22 66 74  /..#line 140 "ft
17f60 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a  s5parse.y"..{ ..
17f70 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72    fts5yylhsminor
17f80 2e 66 74 73 35 79 79 32 34 20 3d 20 73 71 6c 69  .fts5yy24 = sqli
17f90 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
17fa0 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f 53 54  (pParse, FTS5_ST
17fb0 52 49 4e 47 2c 20 30 2c 20 30 2c 20 66 74 73 35  RING, 0, 0, fts5
17fc0 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66  yymsp[0].minor.f
17fd0 74 73 35 79 79 34 36 29 3b 20 0d 0a 20 20 73 71  ts5yy46); ..  sq
17fe0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65  lite3Fts5ParseSe
17ff0 74 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20  tColset(pParse, 
18000 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
18010 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79 6d  ts5yy24, fts5yym
18020 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-2].minor.fts
18030 35 79 79 31 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e  5yy11);..}..#lin
18040 65 20 31 31 33 32 20 22 66 74 73 35 70 61 72 73  e 1132 "fts5pars
18050 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73  e.c"..  fts5yyms
18060 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-2].minor.fts5
18070 79 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73  yy24 = fts5yylhs
18080 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d  minor.fts5yy24;.
18090 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
180a0 0a 20 20 20 20 20 20 63 61 73 65 20 31 37 3a 20  .      case 17: 
180b0 2f 2a 20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 70  /* nearset ::= p
180c0 68 72 61 73 65 20 2a 2f 0d 0a 23 6c 69 6e 65 20  hrase */..#line 
180d0 31 35 31 20 22 66 74 73 35 70 61 72 73 65 2e 79  151 "fts5parse.y
180e0 22 0d 0a 7b 20 66 74 73 35 79 79 6c 68 73 6d 69  "..{ fts5yylhsmi
180f0 6e 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73  nor.fts5yy46 = s
18100 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
18110 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30  earset(pParse, 0
18120 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d  , fts5yymsp[0].m
18130 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20  inor.fts5yy53); 
18140 7d 0d 0a 23 6c 69 6e 65 20 31 31 33 38 20 22 66  }..#line 1138 "f
18150 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
18160 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
18170 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74 73  r.fts5yy46 = fts
18180 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
18190 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20 62  yy46;..        b
181a0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
181b0 65 20 31 38 3a 20 2f 2a 20 6e 65 61 72 73 65 74  e 18: /* nearset
181c0 20 3a 3a 3d 20 43 41 52 45 54 20 70 68 72 61 73   ::= CARET phras
181d0 65 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 35 32 20  e */..#line 152 
181e0 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
181f0 20 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   ..  sqlite3Fts5
18200 50 61 72 73 65 53 65 74 43 61 72 65 74 28 66 74  ParseSetCaret(ft
18210 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
18220 2e 66 74 73 35 79 79 35 33 29 3b 0d 0a 20 20 66  .fts5yy53);..  f
18230 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
18240 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73 71  or.fts5yy46 = sq
18250 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
18260 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  arset(pParse, 0,
18270 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69   fts5yymsp[0].mi
18280 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20 0d  nor.fts5yy53); .
18290 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 34 37 20 22  .}..#line 1147 "
182a0 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
182b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
182c0 20 20 20 20 63 61 73 65 20 31 39 3a 20 2f 2a 20      case 19: /* 
182d0 6e 65 61 72 73 65 74 20 3a 3a 3d 20 53 54 52 49  nearset ::= STRI
182e0 4e 47 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65  NG LP nearphrase
182f0 73 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 52  s neardist_opt R
18300 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 35 36 20  P */..#line 156 
18310 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
18320 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
18330 61 72 73 65 4e 65 61 72 28 70 50 61 72 73 65 2c  arseNear(pParse,
18340 20 26 66 74 73 35 79 79 6d 73 70 5b 2d 34 5d 2e   &fts5yymsp[-4].
18350 6d 69 6e 6f 72 2e 66 74 73 35 79 79 30 29 3b 0d  minor.fts5yy0);.
18360 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
18370 72 73 65 53 65 74 44 69 73 74 61 6e 63 65 28 70  rseSetDistance(p
18380 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70  Parse, fts5yymsp
18390 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-2].minor.fts5y
183a0 79 34 36 2c 20 26 66 74 73 35 79 79 6d 73 70 5b  y46, &fts5yymsp[
183b0 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -1].minor.fts5yy
183c0 30 29 3b 0d 0a 20 20 66 74 73 35 79 79 6c 68 73  0);..  fts5yylhs
183d0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 20 3d  minor.fts5yy46 =
183e0 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d   fts5yymsp[-2].m
183f0 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a  inor.fts5yy46;..
18400 7d 0d 0a 23 6c 69 6e 65 20 31 31 35 36 20 22 66  }..#line 1156 "f
18410 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
18420 74 73 35 79 79 6d 73 70 5b 2d 34 5d 2e 6d 69 6e  ts5yymsp[-4].min
18430 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74  or.fts5yy46 = ft
18440 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
18450 35 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20  5yy46;..        
18460 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18470 73 65 20 32 30 3a 20 2f 2a 20 6e 65 61 72 70 68  se 20: /* nearph
18480 72 61 73 65 73 20 3a 3a 3d 20 70 68 72 61 73 65  rases ::= phrase
18490 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 36 32 20 22   */..#line 162 "
184a0 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
184b0 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  ..  fts5yylhsmin
184c0 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73 71  or.fts5yy46 = sq
184d0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
184e0 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  arset(pParse, 0,
184f0 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69   fts5yymsp[0].mi
18500 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20 0d  nor.fts5yy53); .
18510 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 36 34 20 22  .}..#line 1164 "
18520 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
18530 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
18540 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74  or.fts5yy46 = ft
18550 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
18560 35 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20  5yy46;..        
18570 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18580 73 65 20 32 31 3a 20 2f 2a 20 6e 65 61 72 70 68  se 21: /* nearph
18590 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72 70 68  rases ::= nearph
185a0 72 61 73 65 73 20 70 68 72 61 73 65 20 2a 2f 0d  rases phrase */.
185b0 0a 23 6c 69 6e 65 20 31 36 35 20 22 66 74 73 35  .#line 165 "fts5
185c0 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
185d0 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
185e0 73 35 79 79 34 36 20 3d 20 73 71 6c 69 74 65 33  s5yy46 = sqlite3
185f0 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
18600 28 70 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d  (pParse, fts5yym
18610 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
18620 35 79 79 34 36 2c 20 66 74 73 35 79 79 6d 73 70  5yy46, fts5yymsp
18630 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
18640 35 33 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31  53);..}..#line 1
18650 31 37 32 20 22 66 74 73 35 70 61 72 73 65 2e 63  172 "fts5parse.c
18660 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 2d  "..  fts5yymsp[-
18670 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34  1].minor.fts5yy4
18680 36 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  6 = fts5yylhsmin
18690 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a 20 20  or.fts5yy46;..  
186a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
186b0 20 20 20 20 63 61 73 65 20 32 32 3a 20 2f 2a 20      case 22: /* 
186c0 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d  neardist_opt ::=
186d0 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 37 32 20 22   */..#line 172 "
186e0 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
186f0 66 74 73 35 79 79 6d 73 70 5b 31 5d 2e 6d 69 6e  fts5yymsp[1].min
18700 6f 72 2e 66 74 73 35 79 79 30 2e 70 20 3d 20 30  or.fts5yy0.p = 0
18710 3b 20 66 74 73 35 79 79 6d 73 70 5b 31 5d 2e 6d  ; fts5yymsp[1].m
18720 69 6e 6f 72 2e 66 74 73 35 79 79 30 2e 6e 20 3d  inor.fts5yy0.n =
18730 20 30 3b 20 7d 0d 0a 23 6c 69 6e 65 20 31 31 37   0; }..#line 117
18740 38 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  8 "fts5parse.c".
18750 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
18760 0a 20 20 20 20 20 20 63 61 73 65 20 32 33 3a 20  .      case 23: 
18770 2f 2a 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20  /* neardist_opt 
18780 3a 3a 3d 20 43 4f 4d 4d 41 20 53 54 52 49 4e 47  ::= COMMA STRING
18790 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 37 33 20 22   */..#line 173 "
187a0 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
187b0 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
187c0 6e 6f 72 2e 66 74 73 35 79 79 30 20 3d 20 66 74  nor.fts5yy0 = ft
187d0 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
187e0 2e 66 74 73 35 79 79 30 3b 20 7d 0d 0a 23 6c 69  .fts5yy0; }..#li
187f0 6e 65 20 31 31 38 33 20 22 66 74 73 35 70 61 72  ne 1183 "fts5par
18800 73 65 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62  se.c"..        b
18810 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
18820 65 20 32 34 3a 20 2f 2a 20 70 68 72 61 73 65 20  e 24: /* phrase 
18830 3a 3a 3d 20 70 68 72 61 73 65 20 50 4c 55 53 20  ::= phrase PLUS 
18840 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20  STRING star_opt 
18850 2a 2f 0d 0a 23 6c 69 6e 65 20 31 38 35 20 22 66  */..#line 185 "f
18860 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d  ts5parse.y"..{ .
18870 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f  .  fts5yylhsmino
18880 72 2e 66 74 73 35 79 79 35 33 20 3d 20 73 71 6c  r.fts5yy53 = sql
18890 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72  ite3Fts5ParseTer
188a0 6d 28 70 50 61 72 73 65 2c 20 66 74 73 35 79 79  m(pParse, fts5yy
188b0 6d 73 70 5b 2d 33 5d 2e 6d 69 6e 6f 72 2e 66 74  msp[-3].minor.ft
188c0 73 35 79 79 35 33 2c 20 26 66 74 73 35 79 79 6d  s5yy53, &fts5yym
188d0 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
188e0 35 79 79 30 2c 20 66 74 73 35 79 79 6d 73 70 5b  5yy0, fts5yymsp[
188f0 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34  0].minor.fts5yy4
18900 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 39  );..}..#line 119
18910 30 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  0 "fts5parse.c".
18920 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 33 5d  .  fts5yymsp[-3]
18930 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 20  .minor.fts5yy53 
18940 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72  = fts5yylhsminor
18950 2e 66 74 73 35 79 79 35 33 3b 0d 0a 20 20 20 20  .fts5yy53;..    
18960 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
18970 20 20 63 61 73 65 20 32 35 3a 20 2f 2a 20 70 68    case 25: /* ph
18980 72 61 73 65 20 3a 3a 3d 20 53 54 52 49 4e 47 20  rase ::= STRING 
18990 73 74 61 72 5f 6f 70 74 20 2a 2f 0d 0a 23 6c 69  star_opt */..#li
189a0 6e 65 20 31 38 38 20 22 66 74 73 35 70 61 72 73  ne 188 "fts5pars
189b0 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35  e.y"..{ ..  fts5
189c0 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79  yylhsminor.fts5y
189d0 79 35 33 20 3d 20 73 71 6c 69 74 65 33 46 74 73  y53 = sqlite3Fts
189e0 35 50 61 72 73 65 54 65 72 6d 28 70 50 61 72 73  5ParseTerm(pPars
189f0 65 2c 20 30 2c 20 26 66 74 73 35 79 79 6d 73 70  e, 0, &fts5yymsp
18a00 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
18a10 79 30 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d  y0, fts5yymsp[0]
18a20 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 29 3b  .minor.fts5yy4);
18a30 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 39 38 20  ..}..#line 1198 
18a40 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20  "fts5parse.c".. 
18a50 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d   fts5yymsp[-1].m
18a60 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 20 3d 20  inor.fts5yy53 = 
18a70 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
18a80 74 73 35 79 79 35 33 3b 0d 0a 20 20 20 20 20 20  ts5yy53;..      
18a90 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
18aa0 63 61 73 65 20 32 36 3a 20 2f 2a 20 73 74 61 72  case 26: /* star
18ab0 5f 6f 70 74 20 3a 3a 3d 20 53 54 41 52 20 2a 2f  _opt ::= STAR */
18ac0 0d 0a 23 6c 69 6e 65 20 31 39 36 20 22 66 74 73  ..#line 196 "fts
18ad0 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 66 74 73  5parse.y"..{ fts
18ae0 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e  5yymsp[0].minor.
18af0 66 74 73 35 79 79 34 20 3d 20 31 3b 20 7d 0d 0a  fts5yy4 = 1; }..
18b00 23 6c 69 6e 65 20 31 32 30 34 20 22 66 74 73 35  #line 1204 "fts5
18b10 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20 20 20  parse.c"..      
18b20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
18b30 63 61 73 65 20 32 37 3a 20 2f 2a 20 73 74 61 72  case 27: /* star
18b40 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a 23 6c 69  _opt ::= */..#li
18b50 6e 65 20 31 39 37 20 22 66 74 73 35 70 61 72 73  ne 197 "fts5pars
18b60 65 2e 79 22 0d 0a 7b 20 66 74 73 35 79 79 6d 73  e.y"..{ fts5yyms
18b70 70 5b 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  p[1].minor.fts5y
18b80 79 34 20 3d 20 30 3b 20 7d 0d 0a 23 6c 69 6e 65  y4 = 0; }..#line
18b90 20 31 32 30 39 20 22 66 74 73 35 70 61 72 73 65   1209 "fts5parse
18ba0 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65  .c"..        bre
18bb0 61 6b 3b 0d 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
18bc0 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20 62 72 65  lt:..        bre
18bd0 61 6b 3b 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ak;../**********
18be0 20 45 6e 64 20 72 65 64 75 63 65 20 61 63 74 69   End reduce acti
18bf0 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons ************
18c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c20 2a 2a 2a 2a 2f 0d 0a 20 20 7d 3b 0d 0a 20 20 61  ****/..  };..  a
18c30 73 73 65 72 74 28 20 66 74 73 35 79 79 72 75 6c  ssert( fts5yyrul
18c40 65 6e 6f 3c 73 69 7a 65 6f 66 28 66 74 73 35 79  eno<sizeof(fts5y
18c50 79 52 75 6c 65 49 6e 66 6f 29 2f 73 69 7a 65 6f  yRuleInfo)/sizeo
18c60 66 28 66 74 73 35 79 79 52 75 6c 65 49 6e 66 6f  f(fts5yyRuleInfo
18c70 5b 30 5d 29 20 29 3b 0d 0a 20 20 66 74 73 35 79  [0]) );..  fts5y
18c80 79 67 6f 74 6f 20 3d 20 66 74 73 35 79 79 52 75  ygoto = fts5yyRu
18c90 6c 65 49 6e 66 6f 5b 66 74 73 35 79 79 72 75 6c  leInfo[fts5yyrul
18ca0 65 6e 6f 5d 2e 6c 68 73 3b 0d 0a 20 20 66 74 73  eno].lhs;..  fts
18cb0 35 79 79 73 69 7a 65 20 3d 20 66 74 73 35 79 79  5yysize = fts5yy
18cc0 52 75 6c 65 49 6e 66 6f 5b 66 74 73 35 79 79 72  RuleInfo[fts5yyr
18cd0 75 6c 65 6e 6f 5d 2e 6e 72 68 73 3b 0d 0a 20 20  uleno].nrhs;..  
18ce0 66 74 73 35 79 79 61 63 74 20 3d 20 66 74 73 35  fts5yyact = fts5
18cf0 79 79 5f 66 69 6e 64 5f 72 65 64 75 63 65 5f 61  yy_find_reduce_a
18d00 63 74 69 6f 6e 28 66 74 73 35 79 79 6d 73 70 5b  ction(fts5yymsp[
18d10 66 74 73 35 79 79 73 69 7a 65 5d 2e 73 74 61 74  fts5yysize].stat
18d20 65 6e 6f 2c 28 66 74 73 35 59 59 43 4f 44 45 54  eno,(fts5YYCODET
18d30 59 50 45 29 66 74 73 35 79 79 67 6f 74 6f 29 3b  YPE)fts5yygoto);
18d40 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 72 65 20 61  ....  /* There a
18d50 72 65 20 6e 6f 20 53 48 49 46 54 52 45 44 55 43  re no SHIFTREDUC
18d60 45 20 61 63 74 69 6f 6e 73 20 6f 6e 20 6e 6f 6e  E actions on non
18d70 74 65 72 6d 69 6e 61 6c 73 20 62 65 63 61 75 73  terminals becaus
18d80 65 20 74 68 65 20 74 61 62 6c 65 0d 0a 20 20 2a  e the table..  *
18d90 2a 20 67 65 6e 65 72 61 74 6f 72 20 68 61 73 20  * generator has 
18da0 73 69 6d 70 6c 69 66 69 65 64 20 74 68 65 6d 20  simplified them 
18db0 74 6f 20 70 75 72 65 20 52 45 44 55 43 45 20 61  to pure REDUCE a
18dc0 63 74 69 6f 6e 73 2e 20 2a 2f 0d 0a 20 20 61 73  ctions. */..  as
18dd0 73 65 72 74 28 20 21 28 66 74 73 35 79 79 61 63  sert( !(fts5yyac
18de0 74 3e 66 74 73 35 59 59 5f 4d 41 58 5f 53 48 49  t>fts5YY_MAX_SHI
18df0 46 54 20 26 26 20 66 74 73 35 79 79 61 63 74 3c  FT && fts5yyact<
18e00 3d 66 74 73 35 59 59 5f 4d 41 58 5f 53 48 49 46  =fts5YY_MAX_SHIF
18e10 54 52 45 44 55 43 45 29 20 29 3b 0d 0a 0d 0a 20  TREDUCE) );.... 
18e20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
18e30 73 73 69 62 6c 65 20 66 6f 72 20 61 20 52 45 44  ssible for a RED
18e40 55 43 45 20 74 6f 20 62 65 20 66 6f 6c 6c 6f 77  UCE to be follow
18e50 65 64 20 62 79 20 61 6e 20 65 72 72 6f 72 20 2a  ed by an error *
18e60 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 66 74 73  /..  assert( fts
18e70 35 79 79 61 63 74 21 3d 66 74 73 35 59 59 5f 45  5yyact!=fts5YY_E
18e80 52 52 4f 52 5f 41 43 54 49 4f 4e 20 29 3b 0d 0a  RROR_ACTION );..
18e90 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 20 2b 3d  ..  fts5yymsp +=
18ea0 20 66 74 73 35 79 79 73 69 7a 65 2b 31 3b 0d 0a   fts5yysize+1;..
18eb0 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d    fts5yypParser-
18ec0 3e 66 74 73 35 79 79 74 6f 73 20 3d 20 66 74 73  >fts5yytos = fts
18ed0 35 79 79 6d 73 70 3b 0d 0a 20 20 66 74 73 35 79  5yymsp;..  fts5y
18ee0 79 6d 73 70 2d 3e 73 74 61 74 65 6e 6f 20 3d 20  ymsp->stateno = 
18ef0 28 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50  (fts5YYACTIONTYP
18f00 45 29 66 74 73 35 79 79 61 63 74 3b 0d 0a 20 20  E)fts5yyact;..  
18f10 66 74 73 35 79 79 6d 73 70 2d 3e 6d 61 6a 6f 72  fts5yymsp->major
18f20 20 3d 20 28 66 74 73 35 59 59 43 4f 44 45 54 59   = (fts5YYCODETY
18f30 50 45 29 66 74 73 35 79 79 67 6f 74 6f 3b 0d 0a  PE)fts5yygoto;..
18f40 20 20 66 74 73 35 79 79 54 72 61 63 65 53 68 69    fts5yyTraceShi
18f50 66 74 28 66 74 73 35 79 79 70 50 61 72 73 65 72  ft(fts5yypParser
18f60 2c 20 66 74 73 35 79 79 61 63 74 2c 20 22 2e 2e  , fts5yyact, "..
18f70 2e 20 74 68 65 6e 20 73 68 69 66 74 22 29 3b 0d  . then shift");.
18f80 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 79 79  .  return fts5yy
18f90 61 63 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  act;..}..../*..*
18fa0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18fb0 63 6f 64 65 20 65 78 65 63 75 74 65 73 20 77 68  code executes wh
18fc0 65 6e 20 74 68 65 20 70 61 72 73 65 20 66 61 69  en the parse fai
18fd0 6c 73 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20  ls..*/..#ifndef 
18fe0 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43  fts5YYNOERRORREC
18ff0 4f 56 45 52 59 0d 0a 73 74 61 74 69 63 20 76 6f  OVERY..static vo
19000 69 64 20 66 74 73 35 79 79 5f 70 61 72 73 65 5f  id fts5yy_parse_
19010 66 61 69 6c 65 64 28 0d 0a 20 20 66 74 73 35 79  failed(..  fts5y
19020 79 50 61 72 73 65 72 20 2a 66 74 73 35 79 79 70  yParser *fts5yyp
19030 50 61 72 73 65 72 20 20 20 20 20 20 20 20 20 20  Parser          
19040 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 2a   /* The parser *
19050 2f 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33  /..){..  sqlite3
19060 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 46 45  Fts5ParserARG_FE
19070 54 43 48 0d 0a 20 20 73 71 6c 69 74 65 33 46 74  TCH..  sqlite3Ft
19080 73 35 50 61 72 73 65 72 43 54 58 5f 46 45 54 43  s5ParserCTX_FETC
19090 48 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  H..#ifndef NDEBU
190a0 47 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 54  G..  if( fts5yyT
190b0 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20  raceFILE ){..   
190c0 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79 54   fprintf(fts5yyT
190d0 72 61 63 65 46 49 4c 45 2c 22 25 73 46 61 69 6c  raceFILE,"%sFail
190e0 21 5c 6e 22 2c 66 74 73 35 79 79 54 72 61 63 65  !\n",fts5yyTrace
190f0 50 72 6f 6d 70 74 29 3b 0d 0a 20 20 7d 0d 0a 23  Prompt);..  }..#
19100 65 6e 64 69 66 0d 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
19110 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
19120 74 73 35 79 79 74 6f 73 3e 66 74 73 35 79 79 70  ts5yytos>fts5yyp
19130 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
19140 61 63 6b 20 29 20 66 74 73 35 79 79 5f 70 6f 70  ack ) fts5yy_pop
19150 5f 70 61 72 73 65 72 5f 73 74 61 63 6b 28 66 74  _parser_stack(ft
19160 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20  s5yypParser);.. 
19170 20 2f 2a 20 48 65 72 65 20 63 6f 64 65 20 69 73   /* Here code is
19180 20 69 6e 73 65 72 74 65 64 20 77 68 69 63 68 20   inserted which 
19190 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 65 64  will be executed
191a0 20 77 68 65 6e 65 76 65 72 20 74 68 65 0d 0a 20   whenever the.. 
191b0 20 2a 2a 20 70 61 72 73 65 72 20 66 61 69 6c 73   ** parser fails
191c0 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
191d0 2a 2a 20 42 65 67 69 6e 20 25 70 61 72 73 65 5f  ** Begin %parse_
191e0 66 61 69 6c 75 72 65 20 63 6f 64 65 20 2a 2a 2a  failure code ***
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
19220 2a 2a 2a 2a 20 45 6e 64 20 25 70 61 72 73 65 5f  **** End %parse_
19230 66 61 69 6c 75 72 65 20 63 6f 64 65 20 2a 2a 2a  failure code ***
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 73 71 6c 69 74  ******/..  sqlit
19270 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
19280 53 54 4f 52 45 20 2f 2a 20 53 75 70 70 72 65 73  STORE /* Suppres
19290 73 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  s warning about 
192a0 75 6e 75 73 65 64 20 25 65 78 74 72 61 5f 61 72  unused %extra_ar
192b0 67 75 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  gument variable 
192c0 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
192d0 35 50 61 72 73 65 72 43 54 58 5f 53 54 4f 52 45  5ParserCTX_STORE
192e0 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 66  ..}..#endif /* f
192f0 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f  ts5YYNOERRORRECO
19300 56 45 52 59 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a  VERY */..../*..*
19310 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19320 63 6f 64 65 20 65 78 65 63 75 74 65 73 20 77 68  code executes wh
19330 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
19340 72 20 66 69 72 73 74 20 6f 63 63 75 72 73 2e 0d  r first occurs..
19350 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
19360 20 66 74 73 35 79 79 5f 73 79 6e 74 61 78 5f 65   fts5yy_syntax_e
19370 72 72 6f 72 28 0d 0a 20 20 66 74 73 35 79 79 50  rror(..  fts5yyP
19380 61 72 73 65 72 20 2a 66 74 73 35 79 79 70 50 61  arser *fts5yypPa
19390 72 73 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rser,           
193a0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 2a 2f  /* The parser */
193b0 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 6d 61  ..  int fts5yyma
193c0 6a 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  jor,            
193d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
193e0 6a 6f 72 20 74 79 70 65 20 6f 66 20 74 68 65 20  jor type of the 
193f0 65 72 72 6f 72 20 74 6f 6b 65 6e 20 2a 2f 0d 0a  error token */..
19400 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19410 73 65 72 46 54 53 35 54 4f 4b 45 4e 54 59 50 45  serFTS5TOKENTYPE
19420 20 66 74 73 35 79 79 6d 69 6e 6f 72 20 20 20 20   fts5yyminor    
19430 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 69 6e 6f       /* The mino
19440 72 20 74 79 70 65 20 6f 66 20 74 68 65 20 65 72  r type of the er
19450 72 6f 72 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b  ror token */..){
19460 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
19470 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a  arserARG_FETCH..
19480 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19490 73 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 64  serCTX_FETCH..#d
194a0 65 66 69 6e 65 20 46 54 53 35 54 4f 4b 45 4e 20  efine FTS5TOKEN 
194b0 66 74 73 35 79 79 6d 69 6e 6f 72 0d 0a 2f 2a 2a  fts5yyminor../**
194c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
194d0 20 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 63   %syntax_error c
194e0 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode ************
194f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23  ************/..#
19510 6c 69 6e 65 20 33 30 20 22 66 74 73 35 70 61 72  line 30 "fts5par
19520 73 65 2e 79 22 0d 0a 0d 0a 20 20 55 4e 55 53 45  se.y"....  UNUSE
19530 44 5f 50 41 52 41 4d 28 66 74 73 35 79 79 6d 61  D_PARAM(fts5yyma
19540 6a 6f 72 29 3b 20 2f 2a 20 53 69 6c 65 6e 63 65  jor); /* Silence
19550 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e   a compiler warn
19560 69 6e 67 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65  ing */..  sqlite
19570 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28  3Fts5ParseError(
19580 0d 0a 20 20 20 20 70 50 61 72 73 65 2c 20 22 66  ..    pParse, "f
19590 74 73 35 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ts5: syntax erro
195a0 72 20 6e 65 61 72 20 5c 22 25 2e 2a 73 5c 22 22  r near \"%.*s\""
195b0 2c 46 54 53 35 54 4f 4b 45 4e 2e 6e 2c 46 54 53  ,FTS5TOKEN.n,FTS
195c0 35 54 4f 4b 45 4e 2e 70 0d 0a 20 20 29 3b 0d 0a  5TOKEN.p..  );..
195d0 23 6c 69 6e 65 20 31 32 37 37 20 22 66 74 73 35  #line 1277 "fts5
195e0 70 61 72 73 65 2e 63 22 0d 0a 2f 2a 2a 2a 2a 2a  parse.c"../*****
195f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 25 73 79 6e  ******* End %syn
19600 74 61 78 5f 65 72 72 6f 72 20 63 6f 64 65 20 2a  tax_error code *
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 73 71  *********/..  sq
19640 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41  lite3Fts5ParserA
19650 52 47 5f 53 54 4f 52 45 20 2f 2a 20 53 75 70 70  RG_STORE /* Supp
19660 72 65 73 73 20 77 61 72 6e 69 6e 67 20 61 62 6f  ress warning abo
19670 75 74 20 75 6e 75 73 65 64 20 25 65 78 74 72 61  ut unused %extra
19680 5f 61 72 67 75 6d 65 6e 74 20 76 61 72 69 61 62  _argument variab
19690 6c 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33  le */..  sqlite3
196a0 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 53 54  Fts5ParserCTX_ST
196b0 4f 52 45 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  ORE..}..../*..**
196c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
196d0 73 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20  s executed when 
196e0 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  the parser accep
196f0 74 73 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  ts..*/..static v
19700 6f 69 64 20 66 74 73 35 79 79 5f 61 63 63 65 70  oid fts5yy_accep
19710 74 28 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73  t(..  fts5yyPars
19720 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73 65  er *fts5yypParse
19730 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r           /* T
19740 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a 29 7b  he parser */..){
19750 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
19760 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a  arserARG_FETCH..
19770 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19780 73 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 69  serCTX_FETCH..#i
19790 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20  fndef NDEBUG..  
197a0 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
197b0 49 4c 45 20 29 7b 0d 0a 20 20 20 20 66 70 72 69  ILE ){..    fpri
197c0 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
197d0 49 4c 45 2c 22 25 73 41 63 63 65 70 74 21 5c 6e  ILE,"%sAccept!\n
197e0 22 2c 66 74 73 35 79 79 54 72 61 63 65 50 72 6f  ",fts5yyTracePro
197f0 6d 70 74 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64  mpt);..  }..#end
19800 69 66 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35  if..#ifndef fts5
19810 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52  YYNOERRORRECOVER
19820 59 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72 73  Y..  fts5yypPars
19830 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e 74  er->fts5yyerrcnt
19840 20 3d 20 2d 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a   = -1;..#endif..
19850 20 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79    assert( fts5yy
19860 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74  pParser->fts5yyt
19870 6f 73 3d 3d 66 74 73 35 79 79 70 50 61 72 73 65  os==fts5yypParse
19880 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 20 29  r->fts5yystack )
19890 3b 0d 0a 20 20 2f 2a 20 48 65 72 65 20 63 6f 64  ;..  /* Here cod
198a0 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 77 68  e is inserted wh
198b0 69 63 68 20 77 69 6c 6c 20 62 65 20 65 78 65 63  ich will be exec
198c0 75 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  uted whenever th
198d0 65 0d 0a 20 20 2a 2a 20 70 61 72 73 65 72 20 61  e..  ** parser a
198e0 63 63 65 70 74 73 20 2a 2f 0d 0a 2f 2a 2a 2a 2a  ccepts */../****
198f0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 70  ******* Begin %p
19900 61 72 73 65 5f 61 63 63 65 70 74 20 63 6f 64 65  arse_accept code
19910 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a  **********/../**
19940 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 25 70  ********* End %p
19950 61 72 73 65 5f 61 63 63 65 70 74 20 63 6f 64 65  arse_accept code
19960 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20  ************/.. 
19990 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
199a0 65 72 41 52 47 5f 53 54 4f 52 45 20 2f 2a 20 53  erARG_STORE /* S
199b0 75 70 70 72 65 73 73 20 77 61 72 6e 69 6e 67 20  uppress warning 
199c0 61 62 6f 75 74 20 75 6e 75 73 65 64 20 25 65 78  about unused %ex
199d0 74 72 61 5f 61 72 67 75 6d 65 6e 74 20 76 61 72  tra_argument var
199e0 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 73 71 6c 69  iable */..  sqli
199f0 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58  te3Fts5ParserCTX
19a00 5f 53 54 4f 52 45 0d 0a 7d 0d 0a 0d 0a 2f 2a 20  _STORE..}..../* 
19a10 54 68 65 20 6d 61 69 6e 20 70 61 72 73 65 72 20  The main parser 
19a20 70 72 6f 67 72 61 6d 2e 0d 0a 2a 2a 20 54 68 65  program...** The
19a30 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
19a40 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
19a50 61 20 73 74 72 75 63 74 75 72 65 20 6f 62 74 61  a structure obta
19a60 69 6e 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 22 73  ined from..** "s
19a70 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
19a80 41 6c 6c 6f 63 22 20 77 68 69 63 68 20 64 65 73  Alloc" which des
19a90 63 72 69 62 65 73 20 74 68 65 20 63 75 72 72 65  cribes the curre
19aa0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
19ab0 70 61 72 73 65 72 2e 0d 0a 2a 2a 20 54 68 65 20  parser...** The 
19ac0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19ad0 69 73 20 74 68 65 20 6d 61 6a 6f 72 20 74 6f 6b  is the major tok
19ae0 65 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  en number.  The 
19af0 74 68 69 72 64 20 69 73 0d 0a 2a 2a 20 74 68 65  third is..** the
19b00 20 6d 69 6e 6f 72 20 74 6f 6b 65 6e 2e 20 20 54   minor token.  T
19b10 68 65 20 66 6f 75 72 74 68 20 6f 70 74 69 6f 6e  he fourth option
19b20 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 77  al argument is w
19b30 68 61 74 65 76 65 72 20 74 68 65 0d 0a 2a 2a 20  hatever the..** 
19b40 75 73 65 72 20 77 61 6e 74 73 20 28 61 6e 64 20  user wants (and 
19b50 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
19b60 20 67 72 61 6d 6d 61 72 29 20 61 6e 64 20 69 73   grammar) and is
19b70 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 0d 0a   available for..
19b80 2a 2a 20 75 73 65 20 62 79 20 74 68 65 20 61 63  ** use by the ac
19b90 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 0d 0a  tion routines...
19ba0 2a 2a 0d 0a 2a 2a 20 49 6e 70 75 74 73 3a 0d 0a  **..** Inputs:..
19bb0 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e  ** <ul>..** <li>
19bc0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
19bd0 65 20 70 61 72 73 65 72 20 28 61 6e 20 6f 70 61  e parser (an opa
19be0 71 75 65 20 73 74 72 75 63 74 75 72 65 2e 29 0d  que structure.).
19bf0 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65 20 6d 61 6a  .** <li> The maj
19c00 6f 72 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 2e  or token number.
19c10 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65 20 6d 69  ..** <li> The mi
19c20 6e 6f 72 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72  nor token number
19c30 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 41 6e 20 6f 70  ...** <li> An op
19c40 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 6f 66  tion argument of
19c50 20 61 20 67 72 61 6d 6d 61 72 2d 73 70 65 63 69   a grammar-speci
19c60 66 69 65 64 20 74 79 70 65 2e 0d 0a 2a 2a 20 3c  fied type...** <
19c70 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 75 74  /ul>..**..** Out
19c80 70 75 74 73 3a 0d 0a 2a 2a 20 4e 6f 6e 65 2e 0d  puts:..** None..
19c90 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
19ca0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
19cb0 65 72 28 0d 0a 20 20 76 6f 69 64 20 2a 66 74 73  er(..  void *fts
19cc0 35 79 79 70 2c 20 20 20 20 20 20 20 20 20 20 20  5yyp,           
19cd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
19ce0 61 72 73 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20  arser */..  int 
19cf0 66 74 73 35 79 79 6d 61 6a 6f 72 2c 20 20 20 20  fts5yymajor,    
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d10 54 68 65 20 6d 61 6a 6f 72 20 74 6f 6b 65 6e 20  The major token 
19d20 63 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a  code number */..
19d30 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19d40 73 65 72 46 54 53 35 54 4f 4b 45 4e 54 59 50 45  serFTS5TOKENTYPE
19d50 20 66 74 73 35 79 79 6d 69 6e 6f 72 20 20 20 20   fts5yyminor    
19d60 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
19d70 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f  for the token */
19d80 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
19d90 61 72 73 65 72 41 52 47 5f 50 44 45 43 4c 20 20  arserARG_PDECL  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19db0 4f 70 74 69 6f 6e 61 6c 20 25 65 78 74 72 61 5f  Optional %extra_
19dc0 61 72 67 75 6d 65 6e 74 20 70 61 72 61 6d 65 74  argument paramet
19dd0 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 66 74 73  er */..){..  fts
19de0 35 59 59 4d 49 4e 4f 52 54 59 50 45 20 66 74 73  5YYMINORTYPE fts
19df0 35 79 79 6d 69 6e 6f 72 75 6e 69 6f 6e 3b 0d 0a  5yyminorunion;..
19e00 20 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59    fts5YYACTIONTY
19e10 50 45 20 66 74 73 35 79 79 61 63 74 3b 20 20 20  PE fts5yyact;   
19e20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 61 63  /* The parser ac
19e30 74 69 6f 6e 2e 20 2a 2f 0d 0a 23 69 66 20 21 64  tion. */..#if !d
19e40 65 66 69 6e 65 64 28 66 74 73 35 59 59 45 52 52  efined(fts5YYERR
19e50 4f 52 53 59 4d 42 4f 4c 29 20 26 26 20 21 64 65  ORSYMBOL) && !de
19e60 66 69 6e 65 64 28 66 74 73 35 59 59 4e 4f 45 52  fined(fts5YYNOER
19e70 52 4f 52 52 45 43 4f 56 45 52 59 29 0d 0a 20 20  RORRECOVERY)..  
19e80 69 6e 74 20 66 74 73 35 79 79 65 6e 64 6f 66 69  int fts5yyendofi
19e90 6e 70 75 74 3b 20 20 20 20 20 2f 2a 20 54 72 75  nput;     /* Tru
19ea0 65 20 69 66 20 77 65 20 61 72 65 20 61 74 20 74  e if we are at t
19eb0 68 65 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20  he end of input 
19ec0 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64  */..#endif..#ifd
19ed0 65 66 20 66 74 73 35 59 59 45 52 52 4f 52 53 59  ef fts5YYERRORSY
19ee0 4d 42 4f 4c 0d 0a 20 20 69 6e 74 20 66 74 73 35  MBOL..  int fts5
19ef0 79 79 65 72 72 6f 72 68 69 74 20 3d 20 30 3b 20  yyerrorhit = 0; 
19f00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 74 73    /* True if fts
19f10 35 79 79 6d 61 6a 6f 72 20 68 61 73 20 69 6e 76  5yymajor has inv
19f20 6f 6b 65 64 20 61 6e 20 65 72 72 6f 72 20 2a 2f  oked an error */
19f30 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 66 74 73 35  ..#endif..  fts5
19f40 79 79 50 61 72 73 65 72 20 2a 66 74 73 35 79 79  yyParser *fts5yy
19f50 70 50 61 72 73 65 72 20 3d 20 28 66 74 73 35 79  pParser = (fts5y
19f60 79 50 61 72 73 65 72 2a 29 66 74 73 35 79 79 70  yParser*)fts5yyp
19f70 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72  ;  /* The parser
19f80 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74   */..  sqlite3Ft
19f90 73 35 50 61 72 73 65 72 43 54 58 5f 46 45 54 43  s5ParserCTX_FETC
19fa0 48 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  H..  sqlite3Fts5
19fb0 50 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45 0d  ParserARG_STORE.
19fc0 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 66 74 73  ...  assert( fts
19fd0 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
19fe0 79 79 74 6f 73 21 3d 30 20 29 3b 0d 0a 23 69 66  yytos!=0 );..#if
19ff0 20 21 64 65 66 69 6e 65 64 28 66 74 73 35 59 59   !defined(fts5YY
1a000 45 52 52 4f 52 53 59 4d 42 4f 4c 29 20 26 26 20  ERRORSYMBOL) && 
1a010 21 64 65 66 69 6e 65 64 28 66 74 73 35 59 59 4e  !defined(fts5YYN
1a020 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 29 0d  OERRORRECOVERY).
1a030 0a 20 20 66 74 73 35 79 79 65 6e 64 6f 66 69 6e  .  fts5yyendofin
1a040 70 75 74 20 3d 20 28 66 74 73 35 79 79 6d 61 6a  put = (fts5yymaj
1a050 6f 72 3d 3d 30 29 3b 0d 0a 23 65 6e 64 69 66 0d  or==0);..#endif.
1a060 0a 0d 0a 20 20 66 74 73 35 79 79 61 63 74 20 3d  ...  fts5yyact =
1a070 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1a080 66 74 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65  fts5yytos->state
1a090 6e 6f 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45  no;..#ifndef NDE
1a0a0 42 55 47 0d 0a 20 20 69 66 28 20 66 74 73 35 79  BUG..  if( fts5y
1a0b0 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
1a0c0 20 20 20 69 66 28 20 66 74 73 35 79 79 61 63 74     if( fts5yyact
1a0d0 20 3c 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45   < fts5YY_MIN_RE
1a0e0 44 55 43 45 20 29 7b 0d 0a 20 20 20 20 20 20 66  DUCE ){..      f
1a0f0 70 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61  printf(fts5yyTra
1a100 63 65 46 49 4c 45 2c 22 25 73 49 6e 70 75 74 20  ceFILE,"%sInput 
1a110 27 25 73 27 20 69 6e 20 73 74 61 74 65 20 25 64  '%s' in state %d
1a120 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  \n",..          
1a130 20 20 20 20 66 74 73 35 79 79 54 72 61 63 65 50      fts5yyTraceP
1a140 72 6f 6d 70 74 2c 66 74 73 35 79 79 54 6f 6b 65  rompt,fts5yyToke
1a150 6e 4e 61 6d 65 5b 66 74 73 35 79 79 6d 61 6a 6f  nName[fts5yymajo
1a160 72 5d 2c 66 74 73 35 79 79 61 63 74 29 3b 0d 0a  r],fts5yyact);..
1a170 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
1a180 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
1a190 54 72 61 63 65 46 49 4c 45 2c 22 25 73 49 6e 70  TraceFILE,"%sInp
1a1a0 75 74 20 27 25 73 27 20 77 69 74 68 20 70 65 6e  ut '%s' with pen
1a1b0 64 69 6e 67 20 72 65 64 75 63 65 20 25 64 5c 6e  ding reduce %d\n
1a1c0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1a1d0 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f    fts5yyTracePro
1a1e0 6d 70 74 2c 66 74 73 35 79 79 54 6f 6b 65 6e 4e  mpt,fts5yyTokenN
1a1f0 61 6d 65 5b 66 74 73 35 79 79 6d 61 6a 6f 72 5d  ame[fts5yymajor]
1a200 2c 66 74 73 35 79 79 61 63 74 2d 66 74 73 35 59  ,fts5yyact-fts5Y
1a210 59 5f 4d 49 4e 5f 52 45 44 55 43 45 29 3b 0d 0a  Y_MIN_REDUCE);..
1a220 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64      }..  }..#end
1a230 69 66 0d 0a 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20  if....  do{..   
1a240 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79 61   assert( fts5yya
1a250 63 74 3d 3d 66 74 73 35 79 79 70 50 61 72 73 65  ct==fts5yypParse
1a260 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 3e 73 74  r->fts5yytos->st
1a270 61 74 65 6e 6f 20 29 3b 0d 0a 20 20 20 20 66 74  ateno );..    ft
1a280 73 35 79 79 61 63 74 20 3d 20 66 74 73 35 79 79  s5yyact = fts5yy
1a290 5f 66 69 6e 64 5f 73 68 69 66 74 5f 61 63 74 69  _find_shift_acti
1a2a0 6f 6e 28 28 66 74 73 35 59 59 43 4f 44 45 54 59  on((fts5YYCODETY
1a2b0 50 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c 66  PE)fts5yymajor,f
1a2c0 74 73 35 79 79 61 63 74 29 3b 0d 0a 20 20 20 20  ts5yyact);..    
1a2d0 69 66 28 20 66 74 73 35 79 79 61 63 74 20 3e 3d  if( fts5yyact >=
1a2e0 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55   fts5YY_MIN_REDU
1a2f0 43 45 20 29 7b 0d 0a 20 20 20 20 20 20 66 74 73  CE ){..      fts
1a300 35 79 79 61 63 74 20 3d 20 66 74 73 35 79 79 5f  5yyact = fts5yy_
1a310 72 65 64 75 63 65 28 66 74 73 35 79 79 70 50 61  reduce(fts5yypPa
1a320 72 73 65 72 2c 66 74 73 35 79 79 61 63 74 2d 66  rser,fts5yyact-f
1a330 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45  ts5YY_MIN_REDUCE
1a340 2c 66 74 73 35 79 79 6d 61 6a 6f 72 2c 0d 0a 20  ,fts5yymajor,.. 
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 66 74 73 35 79 79 6d 69 6e         fts5yymin
1a370 6f 72 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  or sqlite3Fts5Pa
1a380 72 73 65 72 43 54 58 5f 50 41 52 41 4d 29 3b 0d  rserCTX_PARAM);.
1a390 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
1a3a0 74 73 35 79 79 61 63 74 20 3c 3d 20 66 74 73 35  ts5yyact <= fts5
1a3b0 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55  YY_MAX_SHIFTREDU
1a3c0 43 45 20 29 7b 0d 0a 20 20 20 20 20 20 66 74 73  CE ){..      fts
1a3d0 35 79 79 5f 73 68 69 66 74 28 66 74 73 35 79 79  5yy_shift(fts5yy
1a3e0 70 50 61 72 73 65 72 2c 66 74 73 35 79 79 61 63  pParser,fts5yyac
1a3f0 74 2c 28 66 74 73 35 59 59 43 4f 44 45 54 59 50  t,(fts5YYCODETYP
1a400 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c 66 74  E)fts5yymajor,ft
1a410 73 35 79 79 6d 69 6e 6f 72 29 3b 0d 0a 23 69 66  s5yyminor);..#if
1a420 6e 64 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52  ndef fts5YYNOERR
1a430 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20 20 20 20  ORRECOVERY..    
1a440 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d    fts5yypParser-
1a450 3e 66 74 73 35 79 79 65 72 72 63 6e 74 2d 2d 3b  >fts5yyerrcnt--;
1a460 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20  ..#endif..      
1a470 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 65 6c 73  break;..    }els
1a480 65 20 69 66 28 20 66 74 73 35 79 79 61 63 74 3d  e if( fts5yyact=
1a490 3d 66 74 73 35 59 59 5f 41 43 43 45 50 54 5f 41  =fts5YY_ACCEPT_A
1a4a0 43 54 49 4f 4e 20 29 7b 0d 0a 20 20 20 20 20 20  CTION ){..      
1a4b0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1a4c0 74 73 35 79 79 74 6f 73 2d 2d 3b 0d 0a 20 20 20  ts5yytos--;..   
1a4d0 20 20 20 66 74 73 35 79 79 5f 61 63 63 65 70 74     fts5yy_accept
1a4e0 28 66 74 73 35 79 79 70 50 61 72 73 65 72 29 3b  (fts5yypParser);
1a4f0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d  ..      return;.
1a500 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
1a510 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 79     assert( fts5y
1a520 79 61 63 74 20 3d 3d 20 66 74 73 35 59 59 5f 45  yact == fts5YY_E
1a530 52 52 4f 52 5f 41 43 54 49 4f 4e 20 29 3b 0d 0a  RROR_ACTION );..
1a540 20 20 20 20 20 20 66 74 73 35 79 79 6d 69 6e 6f        fts5yymino
1a550 72 75 6e 69 6f 6e 2e 66 74 73 35 79 79 30 20 3d  runion.fts5yy0 =
1a560 20 66 74 73 35 79 79 6d 69 6e 6f 72 3b 0d 0a 23   fts5yyminor;..#
1a570 69 66 64 65 66 20 66 74 73 35 59 59 45 52 52 4f  ifdef fts5YYERRO
1a580 52 53 59 4d 42 4f 4c 0d 0a 20 20 20 20 20 20 69  RSYMBOL..      i
1a590 6e 74 20 66 74 73 35 79 79 6d 78 3b 0d 0a 23 65  nt fts5yymx;..#e
1a5a0 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
1a5b0 45 42 55 47 0d 0a 20 20 20 20 20 20 69 66 28 20  EBUG..      if( 
1a5c0 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20  fts5yyTraceFILE 
1a5d0 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 70 72 69  ){..        fpri
1a5e0 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
1a5f0 49 4c 45 2c 22 25 73 53 79 6e 74 61 78 20 45 72  ILE,"%sSyntax Er
1a600 72 6f 72 21 5c 6e 22 2c 66 74 73 35 79 79 54 72  ror!\n",fts5yyTr
1a610 61 63 65 50 72 6f 6d 70 74 29 3b 0d 0a 20 20 20  acePrompt);..   
1a620 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23 69     }..#endif..#i
1a630 66 64 65 66 20 66 74 73 35 59 59 45 52 52 4f 52  fdef fts5YYERROR
1a640 53 59 4d 42 4f 4c 0d 0a 20 20 20 20 20 20 2f 2a  SYMBOL..      /*
1a650 20 41 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   A syntax error 
1a660 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0d 0a 20  has occurred... 
1a670 20 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 70       ** The resp
1a680 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f 72  onse to an error
1a690 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 20 77 68   depends upon wh
1a6a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1a6b0 0d 0a 20 20 20 20 20 20 2a 2a 20 67 72 61 6d 6d  ..      ** gramm
1a6c0 61 72 20 64 65 66 69 6e 65 73 20 61 6e 20 65 72  ar defines an er
1a6d0 72 6f 72 20 74 6f 6b 65 6e 20 22 45 52 52 4f 52  ror token "ERROR
1a6e0 22 2e 20 20 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a  ".  ..      **..
1a6f0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1a700 20 77 68 61 74 20 77 65 20 64 6f 20 69 66 20 74   what we do if t
1a710 68 65 20 67 72 61 6d 6d 61 72 20 64 6f 65 73 20  he grammar does 
1a720 64 65 66 69 6e 65 20 45 52 52 4f 52 3a 0d 0a 20  define ERROR:.. 
1a730 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a       **..      *
1a740 2a 20 20 2a 20 43 61 6c 6c 20 74 68 65 20 25 73  *  * Call the %s
1a750 79 6e 74 61 78 5f 65 72 72 6f 72 20 66 75 6e 63  yntax_error func
1a760 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d  tion...      **.
1a770 0a 20 20 20 20 20 20 2a 2a 20 20 2a 20 42 65 67  .      **  * Beg
1a780 69 6e 20 70 6f 70 70 69 6e 67 20 74 68 65 20 73  in popping the s
1a790 74 61 63 6b 20 75 6e 74 69 6c 20 77 65 20 65 6e  tack until we en
1a7a0 74 65 72 20 61 20 73 74 61 74 65 20 77 68 65 72  ter a state wher
1a7b0 65 0d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 69  e..      **    i
1a7c0 74 20 69 73 20 6c 65 67 61 6c 20 74 6f 20 73 68  t is legal to sh
1a7d0 69 66 74 20 74 68 65 20 65 72 72 6f 72 20 73 79  ift the error sy
1a7e0 6d 62 6f 6c 2c 20 74 68 65 6e 20 73 68 69 66 74  mbol, then shift
1a7f0 0d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 74 68  ..      **    th
1a800 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 2e 0d  e error symbol..
1a810 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20  .      **..     
1a820 20 2a 2a 20 20 2a 20 53 65 74 20 74 68 65 20 65   **  * Set the e
1a830 72 72 6f 72 20 63 6f 75 6e 74 20 74 6f 20 74 68  rror count to th
1a840 72 65 65 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a  ree...      **..
1a850 20 20 20 20 20 20 2a 2a 20 20 2a 20 42 65 67 69        **  * Begi
1a860 6e 20 61 63 63 65 70 74 69 6e 67 20 61 6e 64 20  n accepting and 
1a870 73 68 69 66 74 69 6e 67 20 6e 65 77 20 74 6f 6b  shifting new tok
1a880 65 6e 73 2e 20 20 4e 6f 20 6e 65 77 20 65 72 72  ens.  No new err
1a890 6f 72 0d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  or..      **    
1a8a0 70 72 6f 63 65 73 73 69 6e 67 20 77 69 6c 6c 20  processing will 
1a8b0 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 72 65  occur until thre
1a8c0 65 20 74 6f 6b 65 6e 73 20 68 61 76 65 20 62 65  e tokens have be
1a8d0 65 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  en..      **    
1a8e0 73 68 69 66 74 65 64 20 73 75 63 63 65 73 73 66  shifted successf
1a8f0 75 6c 6c 79 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d  ully...      **.
1a900 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20  .      */..     
1a910 20 69 66 28 20 66 74 73 35 79 79 70 50 61 72 73   if( fts5yypPars
1a920 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e 74  er->fts5yyerrcnt
1a930 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66  <0 ){..        f
1a940 74 73 35 79 79 5f 73 79 6e 74 61 78 5f 65 72 72  ts5yy_syntax_err
1a950 6f 72 28 66 74 73 35 79 79 70 50 61 72 73 65 72  or(fts5yypParser
1a960 2c 66 74 73 35 79 79 6d 61 6a 6f 72 2c 66 74 73  ,fts5yymajor,fts
1a970 35 79 79 6d 69 6e 6f 72 29 3b 0d 0a 20 20 20 20  5yyminor);..    
1a980 20 20 7d 0d 0a 20 20 20 20 20 20 66 74 73 35 79    }..      fts5y
1a990 79 6d 78 20 3d 20 66 74 73 35 79 79 70 50 61 72  ymx = fts5yypPar
1a9a0 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 3e  ser->fts5yytos->
1a9b0 6d 61 6a 6f 72 3b 0d 0a 20 20 20 20 20 20 69 66  major;..      if
1a9c0 28 20 66 74 73 35 79 79 6d 78 3d 3d 66 74 73 35  ( fts5yymx==fts5
1a9d0 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 7c 7c  YYERRORSYMBOL ||
1a9e0 20 66 74 73 35 79 79 65 72 72 6f 72 68 69 74 20   fts5yyerrorhit 
1a9f0 29 7b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ){..#ifndef NDEB
1aa00 55 47 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UG..        if( 
1aa10 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20  fts5yyTraceFILE 
1aa20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 70  ){..          fp
1aa30 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63  rintf(fts5yyTrac
1aa40 65 46 49 4c 45 2c 22 25 73 44 69 73 63 61 72 64  eFILE,"%sDiscard
1aa50 20 69 6e 70 75 74 20 74 6f 6b 65 6e 20 25 73 5c   input token %s\
1aa60 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n",..           
1aa70 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f    fts5yyTracePro
1aa80 6d 70 74 2c 66 74 73 35 79 79 54 6f 6b 65 6e 4e  mpt,fts5yyTokenN
1aa90 61 6d 65 5b 66 74 73 35 79 79 6d 61 6a 6f 72 5d  ame[fts5yymajor]
1aaa0 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23  );..        }..#
1aab0 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20 66  endif..        f
1aac0 74 73 35 79 79 5f 64 65 73 74 72 75 63 74 6f 72  ts5yy_destructor
1aad0 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2c 20  (fts5yypParser, 
1aae0 28 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 29  (fts5YYCODETYPE)
1aaf0 66 74 73 35 79 79 6d 61 6a 6f 72 2c 20 26 66 74  fts5yymajor, &ft
1ab00 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f 6e 29 3b  s5yyminorunion);
1ab10 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
1ab20 6d 61 6a 6f 72 20 3d 20 66 74 73 35 59 59 4e 4f  major = fts5YYNO
1ab30 43 4f 44 45 3b 0d 0a 20 20 20 20 20 20 7d 65 6c  CODE;..      }el
1ab40 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 77 68 69  se{..        whi
1ab50 6c 65 28 20 66 74 73 35 79 79 70 50 61 72 73 65  le( fts5yypParse
1ab60 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 3e 3d 20  r->fts5yytos >= 
1ab70 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1ab80 74 73 35 79 79 73 74 61 63 6b 0d 0a 20 20 20 20  ts5yystack..    
1ab90 20 20 20 20 20 20 20 20 26 26 20 28 66 74 73 35          && (fts5
1aba0 79 79 61 63 74 20 3d 20 66 74 73 35 79 79 5f 66  yyact = fts5yy_f
1abb0 69 6e 64 5f 72 65 64 75 63 65 5f 61 63 74 69 6f  ind_reduce_actio
1abc0 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1abe0 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
1abf0 79 74 6f 73 2d 3e 73 74 61 74 65 6e 6f 2c 0d 0a  ytos->stateno,..
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 20 20 20 20 66 74 73 35 59 59 45 52          fts5YYER
1ac20 52 4f 52 53 59 4d 42 4f 4c 29 29 20 3e 20 66 74  RORSYMBOL)) > ft
1ac30 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45  s5YY_MAX_SHIFTRE
1ac40 44 55 43 45 0d 0a 20 20 20 20 20 20 20 20 29 7b  DUCE..        ){
1ac50 0d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ..          fts5
1ac60 79 79 5f 70 6f 70 5f 70 61 72 73 65 72 5f 73 74  yy_pop_parser_st
1ac70 61 63 6b 28 66 74 73 35 79 79 70 50 61 72 73 65  ack(fts5yypParse
1ac80 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  r);..        }..
1ac90 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
1aca0 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
1acb0 79 74 6f 73 20 3c 20 66 74 73 35 79 79 70 50 61  ytos < fts5yypPa
1acc0 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
1acd0 6b 20 7c 7c 20 66 74 73 35 79 79 6d 61 6a 6f 72  k || fts5yymajor
1ace0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
1acf0 20 20 66 74 73 35 79 79 5f 64 65 73 74 72 75 63    fts5yy_destruc
1ad00 74 6f 72 28 66 74 73 35 79 79 70 50 61 72 73 65  tor(fts5yypParse
1ad10 72 2c 28 66 74 73 35 59 59 43 4f 44 45 54 59 50  r,(fts5YYCODETYP
1ad20 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c 26 66  E)fts5yymajor,&f
1ad30 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f 6e 29  ts5yyminorunion)
1ad40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ;..          fts
1ad50 35 79 79 5f 70 61 72 73 65 5f 66 61 69 6c 65 64  5yy_parse_failed
1ad60 28 66 74 73 35 79 79 70 50 61 72 73 65 72 29 3b  (fts5yypParser);
1ad70 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59 59  ..#ifndef fts5YY
1ad80 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 0d  NOERRORRECOVERY.
1ad90 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79  .          fts5y
1ada0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
1adb0 65 72 72 63 6e 74 20 3d 20 2d 31 3b 0d 0a 23 65  errcnt = -1;..#e
1adc0 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20 20 20  ndif..          
1add0 66 74 73 35 79 79 6d 61 6a 6f 72 20 3d 20 66 74  fts5yymajor = ft
1ade0 73 35 59 59 4e 4f 43 4f 44 45 3b 0d 0a 20 20 20  s5YYNOCODE;..   
1adf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
1ae00 74 73 35 79 79 6d 78 21 3d 66 74 73 35 59 59 45  ts5yymx!=fts5YYE
1ae10 52 52 4f 52 53 59 4d 42 4f 4c 20 29 7b 0d 0a 20  RRORSYMBOL ){.. 
1ae20 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79 5f           fts5yy_
1ae30 73 68 69 66 74 28 66 74 73 35 79 79 70 50 61 72  shift(fts5yypPar
1ae40 73 65 72 2c 66 74 73 35 79 79 61 63 74 2c 66 74  ser,fts5yyact,ft
1ae50 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 2c  s5YYERRORSYMBOL,
1ae60 66 74 73 35 79 79 6d 69 6e 6f 72 29 3b 0d 0a 20  fts5yyminor);.. 
1ae70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ae80 7d 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 70  }..      fts5yyp
1ae90 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65 72  Parser->fts5yyer
1aea0 72 63 6e 74 20 3d 20 33 3b 0d 0a 20 20 20 20 20  rcnt = 3;..     
1aeb0 20 66 74 73 35 79 79 65 72 72 6f 72 68 69 74 20   fts5yyerrorhit 
1aec0 3d 20 31 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
1aed0 66 74 73 35 79 79 6d 61 6a 6f 72 3d 3d 66 74 73  fts5yymajor==fts
1aee0 35 59 59 4e 4f 43 4f 44 45 20 29 20 62 72 65 61  5YYNOCODE ) brea
1aef0 6b 3b 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79  k;..      fts5yy
1af00 61 63 74 20 3d 20 66 74 73 35 79 79 70 50 61 72  act = fts5yypPar
1af10 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 3e  ser->fts5yytos->
1af20 73 74 61 74 65 6e 6f 3b 0d 0a 23 65 6c 69 66 20  stateno;..#elif 
1af30 64 65 66 69 6e 65 64 28 66 74 73 35 59 59 4e 4f  defined(fts5YYNO
1af40 45 52 52 4f 52 52 45 43 4f 56 45 52 59 29 0d 0a  ERRORRECOVERY)..
1af50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1af60 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43  fts5YYNOERRORREC
1af70 4f 56 45 52 59 20 6d 61 63 72 6f 20 69 73 20 64  OVERY macro is d
1af80 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f 20  efined, then do 
1af90 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a  not attempt to..
1afa0 20 20 20 20 20 20 2a 2a 20 64 6f 20 61 6e 79 20        ** do any 
1afb0 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 72 65  kind of error re
1afc0 63 6f 76 65 72 79 2e 20 20 49 6e 73 74 65 61 64  covery.  Instead
1afd0 2c 20 73 69 6d 70 6c 79 20 69 6e 76 6f 6b 65 20  , simply invoke 
1afe0 74 68 65 20 73 79 6e 74 61 78 0d 0a 20 20 20 20  the syntax..    
1aff0 20 20 2a 2a 20 65 72 72 6f 72 20 72 6f 75 74 69    ** error routi
1b000 6e 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  ne and continue 
1b010 67 6f 69 6e 67 20 61 73 20 69 66 20 6e 6f 74 68  going as if noth
1b020 69 6e 67 20 68 61 64 20 68 61 70 70 65 6e 65 64  ing had happened
1b030 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20  ...      **..   
1b040 20 20 20 2a 2a 20 41 70 70 6c 69 63 61 74 69 6f     ** Applicatio
1b050 6e 73 20 63 61 6e 20 73 65 74 20 74 68 69 73 20  ns can set this 
1b060 6d 61 63 72 6f 20 28 66 6f 72 20 65 78 61 6d 70  macro (for examp
1b070 6c 65 20 69 6e 73 69 64 65 20 25 69 6e 63 6c 75  le inside %inclu
1b080 64 65 29 20 69 66 0d 0a 20 20 20 20 20 20 2a 2a  de) if..      **
1b090 20 74 68 65 79 20 69 6e 74 65 6e 64 20 74 6f 20   they intend to 
1b0a0 61 62 61 6e 64 6f 6e 20 74 68 65 20 70 61 72 73  abandon the pars
1b0b0 65 20 75 70 6f 6e 20 74 68 65 20 66 69 72 73 74  e upon the first
1b0c0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 73 65   syntax error se
1b0d0 65 6e 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20  en...      */.. 
1b0e0 20 20 20 20 20 66 74 73 35 79 79 5f 73 79 6e 74       fts5yy_synt
1b0f0 61 78 5f 65 72 72 6f 72 28 66 74 73 35 79 79 70  ax_error(fts5yyp
1b100 50 61 72 73 65 72 2c 66 74 73 35 79 79 6d 61 6a  Parser,fts5yymaj
1b110 6f 72 2c 20 66 74 73 35 79 79 6d 69 6e 6f 72 29  or, fts5yyminor)
1b120 3b 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 5f  ;..      fts5yy_
1b130 64 65 73 74 72 75 63 74 6f 72 28 66 74 73 35 79  destructor(fts5y
1b140 79 70 50 61 72 73 65 72 2c 28 66 74 73 35 59 59  ypParser,(fts5YY
1b150 43 4f 44 45 54 59 50 45 29 66 74 73 35 79 79 6d  CODETYPE)fts5yym
1b160 61 6a 6f 72 2c 26 66 74 73 35 79 79 6d 69 6e 6f  ajor,&fts5yymino
1b170 72 75 6e 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  runion);..      
1b180 62 72 65 61 6b 3b 0d 0a 23 65 6c 73 65 20 20 2f  break;..#else  /
1b190 2a 20 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d  * fts5YYERRORSYM
1b1a0 42 4f 4c 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BOL is not defin
1b1b0 65 64 20 2a 2f 0d 0a 20 20 20 20 20 20 2f 2a 20  ed */..      /* 
1b1c0 54 68 69 73 20 69 73 20 77 68 61 74 20 77 65 20  This is what we 
1b1d0 64 6f 20 69 66 20 74 68 65 20 67 72 61 6d 6d 61  do if the gramma
1b1e0 72 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  r does not defin
1b1f0 65 20 45 52 52 4f 52 3a 0d 0a 20 20 20 20 20 20  e ERROR:..      
1b200 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 2a 20  **..      **  * 
1b210 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
1b220 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 68 72  message, and thr
1b230 6f 77 20 61 77 61 79 20 74 68 65 20 69 6e 70 75  ow away the inpu
1b240 74 20 74 6f 6b 65 6e 2e 0d 0a 20 20 20 20 20 20  t token...      
1b250 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 2a 20  **..      **  * 
1b260 49 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 6b  If the input tok
1b270 65 6e 20 69 73 20 24 2c 20 74 68 65 6e 20 66 61  en is $, then fa
1b280 69 6c 20 74 68 65 20 70 61 72 73 65 2e 0d 0a 20  il the parse... 
1b290 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a       **..      *
1b2a0 2a 20 41 73 20 62 65 66 6f 72 65 2c 20 73 75 62  * As before, sub
1b2b0 73 65 71 75 65 6e 74 20 65 72 72 6f 72 20 6d 65  sequent error me
1b2c0 73 73 61 67 65 73 20 61 72 65 20 73 75 70 70 72  ssages are suppr
1b2d0 65 73 73 65 64 20 75 6e 74 69 6c 0d 0a 20 20 20  essed until..   
1b2e0 20 20 20 2a 2a 20 74 68 72 65 65 20 69 6e 70 75     ** three inpu
1b2f0 74 20 74 6f 6b 65 6e 73 20 68 61 76 65 20 62 65  t tokens have be
1b300 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
1b310 73 68 69 66 74 65 64 2e 0d 0a 20 20 20 20 20 20  shifted...      
1b320 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 66 74  */..      if( ft
1b330 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
1b340 35 79 79 65 72 72 63 6e 74 3c 3d 30 20 29 7b 0d  5yyerrcnt<=0 ){.
1b350 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79 5f  .        fts5yy_
1b360 73 79 6e 74 61 78 5f 65 72 72 6f 72 28 66 74 73  syntax_error(fts
1b370 35 79 79 70 50 61 72 73 65 72 2c 66 74 73 35 79  5yypParser,fts5y
1b380 79 6d 61 6a 6f 72 2c 20 66 74 73 35 79 79 6d 69  ymajor, fts5yymi
1b390 6e 6f 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  nor);..      }..
1b3a0 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
1b3b0 73 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e  ser->fts5yyerrcn
1b3c0 74 20 3d 20 33 3b 0d 0a 20 20 20 20 20 20 66 74  t = 3;..      ft
1b3d0 73 35 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28  s5yy_destructor(
1b3e0 66 74 73 35 79 79 70 50 61 72 73 65 72 2c 28 66  fts5yypParser,(f
1b3f0 74 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74  ts5YYCODETYPE)ft
1b400 73 35 79 79 6d 61 6a 6f 72 2c 26 66 74 73 35 79  s5yymajor,&fts5y
1b410 79 6d 69 6e 6f 72 75 6e 69 6f 6e 29 3b 0d 0a 20  yminorunion);.. 
1b420 20 20 20 20 20 69 66 28 20 66 74 73 35 79 79 65       if( fts5yye
1b430 6e 64 6f 66 69 6e 70 75 74 20 29 7b 0d 0a 20 20  ndofinput ){..  
1b440 20 20 20 20 20 20 66 74 73 35 79 79 5f 70 61 72        fts5yy_par
1b450 73 65 5f 66 61 69 6c 65 64 28 66 74 73 35 79 79  se_failed(fts5yy
1b460 70 50 61 72 73 65 72 29 3b 0d 0a 23 69 66 6e 64  pParser);..#ifnd
1b470 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52 4f 52  ef fts5YYNOERROR
1b480 52 45 43 4f 56 45 52 59 0d 0a 20 20 20 20 20 20  RECOVERY..      
1b490 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d    fts5yypParser-
1b4a0 3e 66 74 73 35 79 79 65 72 72 63 6e 74 20 3d 20  >fts5yyerrcnt = 
1b4b0 2d 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20  -1;..#endif..   
1b4c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
1b4d0 6b 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20  k;..#endif..    
1b4e0 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20 66 74 73  }..  }while( fts
1b4f0 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
1b500 79 79 74 6f 73 3e 66 74 73 35 79 79 70 50 61 72  yytos>fts5yypPar
1b510 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b  ser->fts5yystack
1b520 20 29 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45   );..#ifndef NDE
1b530 42 55 47 0d 0a 20 20 69 66 28 20 66 74 73 35 79  BUG..  if( fts5y
1b540 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
1b550 20 20 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e     fts5yyStackEn
1b560 74 72 79 20 2a 69 3b 0d 0a 20 20 20 20 63 68 61  try *i;..    cha
1b570 72 20 63 44 69 76 20 3d 20 27 5b 27 3b 0d 0a 20  r cDiv = '[';.. 
1b580 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79     fprintf(fts5y
1b590 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73 52 65  yTraceFILE,"%sRe
1b5a0 74 75 72 6e 2e 20 53 74 61 63 6b 3d 22 2c 66 74  turn. Stack=",ft
1b5b0 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 29  s5yyTracePrompt)
1b5c0 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 26 66 74  ;..    for(i=&ft
1b5d0 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
1b5e0 35 79 79 73 74 61 63 6b 5b 31 5d 3b 20 69 3c 3d  5yystack[1]; i<=
1b5f0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1b600 74 73 35 79 79 74 6f 73 3b 20 69 2b 2b 29 7b 0d  ts5yytos; i++){.
1b610 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
1b620 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22  ts5yyTraceFILE,"
1b630 25 63 25 73 22 2c 20 63 44 69 76 2c 20 66 74 73  %c%s", cDiv, fts
1b640 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 69 2d 3e  5yyTokenName[i->
1b650 6d 61 6a 6f 72 5d 29 3b 0d 0a 20 20 20 20 20 20  major]);..      
1b660 63 44 69 76 20 3d 20 27 20 27 3b 0d 0a 20 20 20  cDiv = ' ';..   
1b670 20 7d 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28   }..    fprintf(
1b680 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c  fts5yyTraceFILE,
1b690 22 5d 5c 6e 22 29 3b 0d 0a 20 20 7d 0d 0a 23 65  "]\n");..  }..#e
1b6a0 6e 64 69 66 0d 0a 20 20 72 65 74 75 72 6e 3b 0d  ndif..  return;.
1b6b0 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74  .}..../*..** Ret
1b6c0 75 72 6e 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  urn the fallback
1b6d0 20 74 6f 6b 65 6e 20 63 6f 72 72 65 73 70 6f 6e   token correspon
1b6e0 64 69 6e 67 20 74 6f 20 63 61 6e 6f 6e 69 63 61  ding to canonica
1b6f0 6c 20 74 6f 6b 65 6e 20 69 54 6f 6b 65 6e 2c 20  l token iToken, 
1b700 6f 72 0d 0a 2a 2a 20 30 20 69 66 20 69 54 6f 6b  or..** 0 if iTok
1b710 65 6e 20 68 61 73 20 6e 6f 20 66 61 6c 6c 62 61  en has no fallba
1b720 63 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ck...*/..static 
1b730 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
1b740 61 72 73 65 72 46 61 6c 6c 62 61 63 6b 28 69 6e  arserFallback(in
1b750 74 20 69 54 6f 6b 65 6e 29 7b 0d 0a 23 69 66 64  t iToken){..#ifd
1b760 65 66 20 66 74 73 35 59 59 46 41 4c 4c 42 41 43  ef fts5YYFALLBAC
1b770 4b 0d 0a 20 20 69 66 28 20 69 54 6f 6b 65 6e 3c  K..  if( iToken<
1b780 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 66 74 73  (int)(sizeof(fts
1b790 35 79 79 46 61 6c 6c 62 61 63 6b 29 2f 73 69 7a  5yyFallback)/siz
1b7a0 65 6f 66 28 66 74 73 35 79 79 46 61 6c 6c 62 61  eof(fts5yyFallba
1b7b0 63 6b 5b 30 5d 29 29 20 29 7b 0d 0a 20 20 20 20  ck[0])) ){..    
1b7c0 72 65 74 75 72 6e 20 66 74 73 35 79 79 46 61 6c  return fts5yyFal
1b7d0 6c 62 61 63 6b 5b 69 54 6f 6b 65 6e 5d 3b 0d 0a  lback[iToken];..
1b7e0 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 28 76    }..#else..  (v
1b7f0 6f 69 64 29 69 54 6f 6b 65 6e 3b 0d 0a 23 65 6e  oid)iToken;..#en
1b800 64 69 66 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b  dif..  return 0;
1b810 0d 0a 7d 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22  ..}....#line 1 "
1b820 66 74 73 35 5f 61 75 78 2e 63 22 0d 0a 2f 2a 0d  fts5_aux.c"../*.
1b830 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33 31 0d  .** 2014 May 31.
1b840 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68  .**..** The auth
1b850 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
1b860 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
1b870 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
1b880 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c  place of..** a l
1b890 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
1b8a0 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
1b8b0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  ..**..**    May 
1b8c0 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
1b8d0 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20  not evil...**   
1b8e0 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
1b8f0 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
1b900 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
1b910 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20  ve others...**  
1b920 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
1b930 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
1b940 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
1b950 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  ou give...**..**
1b960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f  ************..*/
1b9b0 0d 0a 0d 0a 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64  ....../* #includ
1b9c0 65 20 22 66 74 73 35 49 6e 74 2e 68 22 20 2a 2f  e "fts5Int.h" */
1b9d0 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68  ..#include <math
1b9e0 2e 68 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  .h>             
1b9f0 20 20 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74      /* amalgamat
1ba00 6f 72 3a 20 6b 65 65 70 20 2a 2f 0d 0a 0d 0a 2f  or: keep */..../
1ba10 2a 0d 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  *..** Object use
1ba20 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1ba30 6f 75 67 68 20 61 6c 6c 20 22 63 6f 61 6c 65 73  ough all "coales
1ba40 63 65 64 20 70 68 72 61 73 65 20 69 6e 73 74 61  ced phrase insta
1ba50 6e 63 65 73 22 20 69 6e 20 0d 0a 2a 2a 20 61 20  nces" in ..** a 
1ba60 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
1ba70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1ba80 2e 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20  . If the phrase 
1ba90 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74 68 65  instances in the
1baa0 0d 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 62 65 69 6e  ..** column bein
1bab0 67 20 63 6f 6e 73 69 64 65 72 65 64 20 64 6f 20  g considered do 
1bac0 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 74 68 69  not overlap, thi
1bad0 73 20 6f 62 6a 65 63 74 20 73 69 6d 70 6c 79 20  s object simply 
1bae0 69 74 65 72 61 74 65 73 0d 0a 2a 2a 20 74 68 72  iterates..** thr
1baf0 6f 75 67 68 20 74 68 65 6d 2e 20 4f 72 2c 20 69  ough them. Or, i
1bb00 66 20 74 68 65 79 20 64 6f 20 6f 76 65 72 6c 61  f they do overla
1bb10 70 20 28 73 68 61 72 65 20 6f 6e 65 20 6f 72 20  p (share one or 
1bb20 6d 6f 72 65 20 74 6f 6b 65 6e 73 20 69 6e 0d 0a  more tokens in..
1bb30 2a 2a 20 63 6f 6d 6d 6f 6e 29 2c 20 65 61 63 68  ** common), each
1bb40 20 73 65 74 20 6f 66 20 6f 76 65 72 6c 61 70 70   set of overlapp
1bb50 69 6e 67 20 69 6e 73 74 61 6e 63 65 73 20 69 73  ing instances is
1bb60 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73 69   treated as a si
1bb70 6e 67 6c 65 0d 0a 2a 2a 20 6d 61 74 63 68 2e 20  ngle..** match. 
1bb80 53 65 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  See documentatio
1bb90 6e 20 66 6f 72 20 74 68 65 20 68 69 67 68 6c 69  n for the highli
1bba0 67 68 74 28 29 20 61 75 78 69 6c 69 61 72 79 20  ght() auxiliary 
1bbb0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0d 0a 2a 2a  function for..**
1bbc0 20 64 65 74 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a   details...**..*
1bbd0 2a 20 55 73 61 67 65 20 69 73 3a 0d 0a 2a 2a 0d  * Usage is:..**.
1bbe0 0a 2a 2a 20 20 20 66 6f 72 28 72 63 20 3d 20 66  .**   for(rc = f
1bbf0 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78 74  ts5CInstIterNext
1bc00 28 70 41 70 69 2c 20 70 46 74 73 2c 20 69 43 6f  (pApi, pFts, iCo
1bc10 6c 2c 20 26 69 74 65 72 29 3b 0d 0a 2a 2a 20 20  l, &iter);..**  
1bc20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
1bc30 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35 43 49 6e  OK && 0==fts5CIn
1bc40 73 74 49 74 65 72 45 6f 66 28 26 69 74 65 72 29  stIterEof(&iter)
1bc50 3b 0d 0a 2a 2a 20 20 20 20 20 20 72 63 20 3d 20  ;..**      rc = 
1bc60 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78  fts5CInstIterNex
1bc70 74 28 26 69 74 65 72 29 0d 0a 2a 2a 20 20 20 29  t(&iter)..**   )
1bc80 7b 0d 0a 2a 2a 20 20 20 20 20 70 72 69 6e 74 66  {..**     printf
1bc90 28 22 69 6e 73 74 61 6e 63 65 20 73 74 61 72 74  ("instance start
1bca0 73 20 61 74 20 25 64 2c 20 65 6e 64 73 20 61 74  s at %d, ends at
1bcb0 20 25 64 5c 6e 22 2c 20 69 74 65 72 2e 69 53 74   %d\n", iter.iSt
1bcc0 61 72 74 2c 20 69 74 65 72 2e 69 45 6e 64 29 3b  art, iter.iEnd);
1bcd0 0d 0a 2a 2a 20 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2f  ..**   }..**..*/
1bce0 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1bcf0 20 43 49 6e 73 74 49 74 65 72 20 43 49 6e 73 74   CInstIter CInst
1bd00 49 74 65 72 3b 0d 0a 73 74 72 75 63 74 20 43 49  Iter;..struct CI
1bd10 6e 73 74 49 74 65 72 20 7b 0d 0a 20 20 63 6f 6e  nstIter {..  con
1bd20 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e  st Fts5Extension
1bd30 41 70 69 20 2a 70 41 70 69 3b 20 20 20 2f 2a 20  Api *pApi;   /* 
1bd40 41 50 49 20 6f 66 66 65 72 65 64 20 62 79 20 63  API offered by c
1bd50 75 72 72 65 6e 74 20 46 54 53 20 76 65 72 73 69  urrent FTS versi
1bd60 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f 6e  on */..  Fts5Con
1bd70 74 65 78 74 20 2a 70 46 74 73 3b 20 20 20 20 20  text *pFts;     
1bd80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1bd90 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
1bda0 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e 73 20   pApi functions 
1bdb0 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  */..  int iCol; 
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
1bde0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0d 0a 20 20  to search */..  
1bdf0 69 6e 74 20 69 49 6e 73 74 3b 20 20 20 20 20 20  int iInst;      
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 2f 2a 20 4e 65 78 74 20 70 68 72 61 73 65 20 69  /* Next phrase i
1be20 6e 73 74 61 6e 63 65 20 69 6e 64 65 78 20 2a 2f  nstance index */
1be30 0d 0a 20 20 69 6e 74 20 6e 49 6e 73 74 3b 20 20  ..  int nInst;  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1be60 62 65 72 20 6f 66 20 70 68 72 61 73 65 20 69 6e  ber of phrase in
1be70 73 74 61 6e 63 65 73 20 2a 2f 0d 0a 0d 0a 20 20  stances */....  
1be80 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
1be90 6c 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53  les */..  int iS
1bea0 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
1beb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1bec0 73 74 20 74 6f 6b 65 6e 20 69 6e 20 63 6f 61 6c  st token in coal
1bed0 65 73 63 65 64 20 70 68 72 61 73 65 20 69 6e 73  esced phrase ins
1bee0 74 61 6e 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20  tance */..  int 
1bef0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1bf10 61 73 74 20 74 6f 6b 65 6e 20 69 6e 20 63 6f 61  ast token in coa
1bf20 6c 65 73 63 65 64 20 70 68 72 61 73 65 20 69 6e  lesced phrase in
1bf30 73 74 61 6e 63 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d  stance */..};...
1bf40 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ./*..** Advance 
1bf50 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
1bf60 74 68 65 20 6e 65 78 74 20 63 6f 61 6c 65 73 63  the next coalesc
1bf70 65 64 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e  ed phrase instan
1bf80 63 65 2e 20 52 65 74 75 72 6e 0d 0a 2a 2a 20 61  ce. Return..** a
1bf90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1bfa0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ode if an error 
1bfb0 6f 63 63 75 72 73 2c 20 6f 72 20 53 51 4c 49 54  occurs, or SQLIT
1bfc0 45 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e 0d  E_OK otherwise..
1bfd0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
1bfe0 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78  fts5CInstIterNex
1bff0 74 28 43 49 6e 73 74 49 74 65 72 20 2a 70 49 74  t(CInstIter *pIt
1c000 65 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  er){..  int rc =
1c010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 70   SQLITE_OK;..  p
1c020 49 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 2d  Iter->iStart = -
1c030 31 3b 0d 0a 20 20 70 49 74 65 72 2d 3e 69 45 6e  1;..  pIter->iEn
1c040 64 20 3d 20 2d 31 3b 0d 0a 0d 0a 20 20 77 68 69  d = -1;....  whi
1c050 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1c060 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 49 6e 73  K && pIter->iIns
1c070 74 3c 70 49 74 65 72 2d 3e 6e 49 6e 73 74 20 29  t<pIter->nInst )
1c080 7b 0d 0a 20 20 20 20 69 6e 74 20 69 70 3b 20 69  {..    int ip; i
1c090 6e 74 20 69 63 3b 20 69 6e 74 20 69 6f 3b 0d 0a  nt ic; int io;..
1c0a0 20 20 20 20 72 63 20 3d 20 70 49 74 65 72 2d 3e      rc = pIter->
1c0b0 70 41 70 69 2d 3e 78 49 6e 73 74 28 70 49 74 65  pApi->xInst(pIte
1c0c0 72 2d 3e 70 46 74 73 2c 20 70 49 74 65 72 2d 3e  r->pFts, pIter->
1c0d0 69 49 6e 73 74 2c 20 26 69 70 2c 20 26 69 63 2c  iInst, &ip, &ic,
1c0e0 20 26 69 6f 29 3b 0d 0a 20 20 20 20 69 66 28 20   &io);..    if( 
1c0f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c100 0d 0a 20 20 20 20 20 20 69 66 28 20 69 63 3d 3d  ..      if( ic==
1c110 70 49 74 65 72 2d 3e 69 43 6f 6c 20 29 7b 0d 0a  pIter->iCol ){..
1c120 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64          int iEnd
1c130 20 3d 20 69 6f 20 2d 20 31 20 2b 20 70 49 74 65   = io - 1 + pIte
1c140 72 2d 3e 70 41 70 69 2d 3e 78 50 68 72 61 73 65  r->pApi->xPhrase
1c150 53 69 7a 65 28 70 49 74 65 72 2d 3e 70 46 74 73  Size(pIter->pFts
1c160 2c 20 69 70 29 3b 0d 0a 20 20 20 20 20 20 20 20  , ip);..        
1c170 69 66 28 20 70 49 74 65 72 2d 3e 69 53 74 61 72  if( pIter->iStar
1c180 74 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  t<0 ){..        
1c190 20 20 70 49 74 65 72 2d 3e 69 53 74 61 72 74 20    pIter->iStart 
1c1a0 3d 20 69 6f 3b 0d 0a 20 20 20 20 20 20 20 20 20  = io;..         
1c1b0 20 70 49 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69   pIter->iEnd = i
1c1c0 45 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  End;..        }e
1c1d0 6c 73 65 20 69 66 28 20 69 6f 3c 3d 70 49 74 65  lse if( io<=pIte
1c1e0 72 2d 3e 69 45 6e 64 20 29 7b 0d 0a 20 20 20 20  r->iEnd ){..    
1c1f0 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 70        if( iEnd>p
1c200 49 74 65 72 2d 3e 69 45 6e 64 20 29 20 70 49 74  Iter->iEnd ) pIt
1c210 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e 64 3b  er->iEnd = iEnd;
1c220 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..        }else{
1c230 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ..          brea
1c240 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  k;..        }.. 
1c250 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 49       }..      pI
1c260 74 65 72 2d 3e 69 49 6e 73 74 2b 2b 3b 0d 0a 20  ter->iInst++;.. 
1c270 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72     }..  }....  r
1c280 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
1c290 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  /*..** Initializ
1c2a0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
1c2b0 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20  bject indicated 
1c2c0 62 79 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  by the final par
1c2d0 61 6d 65 74 65 72 20 74 6f 20 0d 0a 2a 2a 20 69  ameter to ..** i
1c2e0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
1c2f0 6f 61 6c 65 73 63 65 64 20 70 68 72 61 73 65 20  oalesced phrase 
1c300 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 63 6f 6c  instances in col
1c310 75 6d 6e 20 69 43 6f 6c 2e 0d 0a 2a 2f 0d 0a 73  umn iCol...*/..s
1c320 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 49  tatic int fts5CI
1c330 6e 73 74 49 74 65 72 49 6e 69 74 28 0d 0a 20 20  nstIterInit(..  
1c340 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73  const Fts5Extens
1c350 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c 0d 0a 20  ionApi *pApi,.. 
1c360 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 46   Fts5Context *pF
1c370 74 73 2c 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  ts,..  int iCol,
1c380 0d 0a 20 20 43 49 6e 73 74 49 74 65 72 20 2a 70  ..  CInstIter *p
1c390 49 74 65 72 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  Iter..){..  int 
1c3a0 72 63 3b 0d 0a 0d 0a 20 20 6d 65 6d 73 65 74 28  rc;....  memset(
1c3b0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
1c3c0 28 43 49 6e 73 74 49 74 65 72 29 29 3b 0d 0a 20  (CInstIter));.. 
1c3d0 20 70 49 74 65 72 2d 3e 70 41 70 69 20 3d 20 70   pIter->pApi = p
1c3e0 41 70 69 3b 0d 0a 20 20 70 49 74 65 72 2d 3e 70  Api;..  pIter->p
1c3f0 46 74 73 20 3d 20 70 46 74 73 3b 0d 0a 20 20 70  Fts = pFts;..  p
1c400 49 74 65 72 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  Iter->iCol = iCo
1c410 6c 3b 0d 0a 20 20 72 63 20 3d 20 70 41 70 69 2d  l;..  rc = pApi-
1c420 3e 78 49 6e 73 74 43 6f 75 6e 74 28 70 46 74 73  >xInstCount(pFts
1c430 2c 20 26 70 49 74 65 72 2d 3e 6e 49 6e 73 74 29  , &pIter->nInst)
1c440 3b 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  ;....  if( rc==S
1c450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
1c460 20 72 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49   rc = fts5CInstI
1c470 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0d  terNext(pIter);.
1c480 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  .  }....  return
1c490 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f   rc;..}......../
1c4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 53 74  *********..** St
1c4f0 61 72 74 20 6f 66 20 68 69 67 68 6c 69 67 68 74  art of highlight
1c500 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  () implementatio
1c510 6e 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20  n...*/..typedef 
1c520 73 74 72 75 63 74 20 48 69 67 68 6c 69 67 68 74  struct Highlight
1c530 43 6f 6e 74 65 78 74 20 48 69 67 68 6c 69 67 68  Context Highligh
1c540 74 43 6f 6e 74 65 78 74 3b 0d 0a 73 74 72 75 63  tContext;..struc
1c550 74 20 48 69 67 68 6c 69 67 68 74 43 6f 6e 74 65  t HighlightConte
1c560 78 74 20 7b 0d 0a 20 20 43 49 6e 73 74 49 74 65  xt {..  CInstIte
1c570 72 20 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  r iter;         
1c580 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 61 6c 65          /* Coale
1c590 73 63 65 64 20 49 6e 73 74 61 6e 63 65 20 49 74  sced Instance It
1c5a0 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74  erator */..  int
1c5b0 20 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   iPos;          
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5d0 43 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 6f 66  Current token of
1c5e0 66 73 65 74 20 69 6e 20 7a 49 6e 5b 5d 20 2a 2f  fset in zIn[] */
1c5f0 0d 0a 20 20 69 6e 74 20 69 52 61 6e 67 65 53 74  ..  int iRangeSt
1c600 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
1c610 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 6f 6b      /* First tok
1c620 65 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 2a 2f  en to include */
1c630 0d 0a 20 20 69 6e 74 20 69 52 61 6e 67 65 45 6e  ..  int iRangeEn
1c640 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1c650 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1c660 72 6f 2c 20 6c 61 73 74 20 74 6f 6b 65 6e 20 74  ro, last token t
1c670 6f 20 69 6e 63 6c 75 64 65 20 2a 2f 0d 0a 20 20  o include */..  
1c680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65  const char *zOpe
1c690 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c6a0 2f 2a 20 4f 70 65 6e 69 6e 67 20 68 69 67 68 6c  /* Opening highl
1c6b0 69 67 68 74 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  ight */..  const
1c6c0 20 63 68 61 72 20 2a 7a 43 6c 6f 73 65 3b 20 20   char *zClose;  
1c6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6c             /* Cl
1c6e0 6f 73 69 6e 67 20 68 69 67 68 6c 69 67 68 74 20  osing highlight 
1c6f0 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
1c700 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 20   *zIn;          
1c710 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 74        /* Input t
1c720 65 78 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 49  ext */..  int nI
1c730 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c750 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74 20  e of input text 
1c760 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 69  in bytes */..  i
1c770 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c790 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
1c7a0 20 77 69 74 68 69 6e 20 7a 49 6e 5b 5d 20 2a 2f   within zIn[] */
1c7b0 0d 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20  ..  char *zOut; 
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61      /* Output va
1c7e0 6c 75 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a  lue */..};..../*
1c7f0 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  ..** Append text
1c800 20 74 6f 20 74 68 65 20 48 69 67 68 6c 69 67 68   to the Highligh
1c810 74 43 6f 6e 74 65 78 74 20 6f 75 74 70 75 74 20  tContext output 
1c820 73 74 72 69 6e 67 20 2d 20 70 2d 3e 7a 4f 75 74  string - p->zOut
1c830 2e 20 41 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 7a  . Argument..** z
1c840 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
1c850 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
1c860 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20 74   bytes of text t
1c870 6f 20 61 70 70 65 6e 64 2e 20 49 66 20 6e 20 69  o append. If n i
1c880 73 20 0d 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  s ..** negative,
1c890 20 65 76 65 72 79 74 68 69 6e 67 20 75 70 20 75   everything up u
1c8a0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 27  ntil the first '
1c8b0 5c 30 27 20 69 73 20 61 70 70 65 6e 64 65 64 20  \0' is appended 
1c8c0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0d 0a  to the output...
1c8d0 2a 2a 0d 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  **..** If *pRc i
1c8e0 73 20 73 65 74 20 74 6f 20 61 6e 79 20 76 61 6c  s set to any val
1c8f0 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ue other than SQ
1c900 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
1c910 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0d 0a  s function is ..
1c920 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  ** called, it is
1c930 20 61 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e 20   a no-op. If an 
1c940 65 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f  error (i.e. an O
1c950 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 69 73  OM condition) is
1c960 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0d 0a   encountered, ..
1c970 2a 2a 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  ** *pRc is set t
1c980 6f 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  o an error code 
1c990 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c9a0 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  . ..*/..static v
1c9b0 6f 69 64 20 66 74 73 35 48 69 67 68 6c 69 67 68  oid fts5Highligh
1c9c0 74 41 70 70 65 6e 64 28 0d 0a 20 20 69 6e 74 20  tAppend(..  int 
1c9d0 2a 70 52 63 2c 20 0d 0a 20 20 48 69 67 68 6c 69  *pRc, ..  Highli
1c9e0 67 68 74 43 6f 6e 74 65 78 74 20 2a 70 2c 20 0d  ghtContext *p, .
1c9f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ca00 2c 20 69 6e 74 20 6e 0d 0a 29 7b 0d 0a 20 20 69  , int n..){..  i
1ca10 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
1ca20 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 6e  OK ){..    if( n
1ca30 3c 30 20 29 20 6e 20 3d 20 28 69 6e 74 29 73 74  <0 ) n = (int)st
1ca40 72 6c 65 6e 28 7a 29 3b 0d 0a 20 20 20 20 70 2d  rlen(z);..    p-
1ca50 3e 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  >zOut = sqlite3_
1ca60 6d 70 72 69 6e 74 66 28 22 25 7a 25 2e 2a 73 22  mprintf("%z%.*s"
1ca70 2c 20 70 2d 3e 7a 4f 75 74 2c 20 6e 2c 20 7a 29  , p->zOut, n, z)
1ca80 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 4f  ;..    if( p->zO
1ca90 75 74 3d 3d 30 20 29 20 2a 70 52 63 20 3d 20 53  ut==0 ) *pRc = S
1caa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20  QLITE_NOMEM;..  
1cab0 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54  }..}..../*..** T
1cac0 6f 6b 65 6e 69 7a 65 72 20 63 61 6c 6c 62 61 63  okenizer callbac
1cad0 6b 20 75 73 65 64 20 62 79 20 69 6d 70 6c 65 6d  k used by implem
1cae0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 68 69 67 68  entation of high
1caf0 6c 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  light() function
1cb00 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
1cb10 74 20 66 74 73 35 48 69 67 68 6c 69 67 68 74 43  t fts5HighlightC
1cb20 62 28 0d 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  b(..  void *pCon
1cb30 74 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  text,           
1cb40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1cb50 20 74 6f 20 48 69 67 68 6c 69 67 68 74 43 6f 6e   to HighlightCon
1cb60 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a  text object */..
1cb70 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 20 20 20    int tflags,   
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb90 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
1cba0 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20  5_TOKEN_* flags 
1cbb0 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
1cbc0 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
1cbd0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1cbe0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
1cbf0 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   */..  int nToke
1cc00 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1cc10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1cc20 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73  f token in bytes
1cc30 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53 74 61 72   */..  int iStar
1cc40 74 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  tOff,           
1cc50 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1cc60 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20  offset of token 
1cc70 2a 2f 0d 0a 20 20 69 6e 74 20 69 45 6e 64 4f 66  */..  int iEndOf
1cc80 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1cc90 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 66        /* End off
1cca0 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d  set of token */.
1ccb0 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68 74  .){..  Highlight
1ccc0 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 48 69  Context *p = (Hi
1ccd0 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 2a 29  ghlightContext*)
1cce0 70 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 69 6e 74  pContext;..  int
1ccf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cd00 0d 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0d 0a 0d  ..  int iPos;...
1cd10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
1cd20 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
1cd30 3b 0d 0a 0d 0a 20 20 69 66 28 20 74 66 6c 61 67  ;....  if( tflag
1cd40 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s & FTS5_TOKEN_C
1cd50 4f 4c 4f 43 41 54 45 44 20 29 20 72 65 74 75 72  OLOCATED ) retur
1cd60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  n SQLITE_OK;..  
1cd70 69 50 6f 73 20 3d 20 70 2d 3e 69 50 6f 73 2b 2b  iPos = p->iPos++
1cd80 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 2d 3e 69 52  ;....  if( p->iR
1cd90 61 6e 67 65 45 6e 64 3e 30 20 29 7b 0d 0a 20 20  angeEnd>0 ){..  
1cda0 20 20 69 66 28 20 69 50 6f 73 3c 70 2d 3e 69 52    if( iPos<p->iR
1cdb0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 69 50 6f  angeStart || iPo
1cdc0 73 3e 70 2d 3e 69 52 61 6e 67 65 45 6e 64 20 29  s>p->iRangeEnd )
1cdd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cde0 4b 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  K;..    if( p->i
1cdf0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 69 50  RangeStart && iP
1ce00 6f 73 3d 3d 70 2d 3e 69 52 61 6e 67 65 53 74 61  os==p->iRangeSta
1ce10 72 74 20 29 20 70 2d 3e 69 4f 66 66 20 3d 20 69  rt ) p->iOff = i
1ce20 53 74 61 72 74 4f 66 66 3b 0d 0a 20 20 7d 0d 0a  StartOff;..  }..
1ce30 0d 0a 20 20 69 66 28 20 69 50 6f 73 3d 3d 70 2d  ..  if( iPos==p-
1ce40 3e 69 74 65 72 2e 69 53 74 61 72 74 20 29 7b 0d  >iter.iStart ){.
1ce50 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69 67  .    fts5Highlig
1ce60 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70 2c  htAppend(&rc, p,
1ce70 20 26 70 2d 3e 7a 49 6e 5b 70 2d 3e 69 4f 66 66   &p->zIn[p->iOff
1ce80 5d 2c 20 69 53 74 61 72 74 4f 66 66 20 2d 20 70  ], iStartOff - p
1ce90 2d 3e 69 4f 66 66 29 3b 0d 0a 20 20 20 20 66 74  ->iOff);..    ft
1cea0 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65 6e  s5HighlightAppen
1ceb0 64 28 26 72 63 2c 20 70 2c 20 70 2d 3e 7a 4f 70  d(&rc, p, p->zOp
1cec0 65 6e 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 70 2d  en, -1);..    p-
1ced0 3e 69 4f 66 66 20 3d 20 69 53 74 61 72 74 4f 66  >iOff = iStartOf
1cee0 66 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28  f;..  }....  if(
1cef0 20 69 50 6f 73 3d 3d 70 2d 3e 69 74 65 72 2e 69   iPos==p->iter.i
1cf00 45 6e 64 20 29 7b 0d 0a 20 20 20 20 69 66 28 20  End ){..    if( 
1cf10 70 2d 3e 69 52 61 6e 67 65 45 6e 64 20 26 26 20  p->iRangeEnd && 
1cf20 70 2d 3e 69 74 65 72 2e 69 53 74 61 72 74 3c 70  p->iter.iStart<p
1cf30 2d 3e 69 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ->iRangeStart ){
1cf40 0d 0a 20 20 20 20 20 20 66 74 73 35 48 69 67 68  ..      fts5High
1cf50 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c  lightAppend(&rc,
1cf60 20 70 2c 20 70 2d 3e 7a 4f 70 65 6e 2c 20 2d 31   p, p->zOpen, -1
1cf70 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66  );..    }..    f
1cf80 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1cf90 6e 64 28 26 72 63 2c 20 70 2c 20 26 70 2d 3e 7a  nd(&rc, p, &p->z
1cfa0 49 6e 5b 70 2d 3e 69 4f 66 66 5d 2c 20 69 45 6e  In[p->iOff], iEn
1cfb0 64 4f 66 66 20 2d 20 70 2d 3e 69 4f 66 66 29 3b  dOff - p->iOff);
1cfc0 0d 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69  ..    fts5Highli
1cfd0 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70  ghtAppend(&rc, p
1cfe0 2c 20 70 2d 3e 7a 43 6c 6f 73 65 2c 20 2d 31 29  , p->zClose, -1)
1cff0 3b 0d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  ;..    p->iOff =
1d000 20 69 45 6e 64 4f 66 66 3b 0d 0a 20 20 20 20 69   iEndOff;..    i
1d010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d020 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20   ){..      rc = 
1d030 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78  fts5CInstIterNex
1d040 74 28 26 70 2d 3e 69 74 65 72 29 3b 0d 0a 20 20  t(&p->iter);..  
1d050 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66    }..  }....  if
1d060 28 20 70 2d 3e 69 52 61 6e 67 65 45 6e 64 3e 30  ( p->iRangeEnd>0
1d070 20 26 26 20 69 50 6f 73 3d 3d 70 2d 3e 69 52 61   && iPos==p->iRa
1d080 6e 67 65 45 6e 64 20 29 7b 0d 0a 20 20 20 20 66  ngeEnd ){..    f
1d090 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1d0a0 6e 64 28 26 72 63 2c 20 70 2c 20 26 70 2d 3e 7a  nd(&rc, p, &p->z
1d0b0 49 6e 5b 70 2d 3e 69 4f 66 66 5d 2c 20 69 45 6e  In[p->iOff], iEn
1d0c0 64 4f 66 66 20 2d 20 70 2d 3e 69 4f 66 66 29 3b  dOff - p->iOff);
1d0d0 0d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20  ..    p->iOff = 
1d0e0 69 45 6e 64 4f 66 66 3b 0d 0a 20 20 20 20 69 66  iEndOff;..    if
1d0f0 28 20 69 50 6f 73 3e 3d 70 2d 3e 69 74 65 72 2e  ( iPos>=p->iter.
1d100 69 53 74 61 72 74 20 26 26 20 69 50 6f 73 3c 70  iStart && iPos<p
1d110 2d 3e 69 74 65 72 2e 69 45 6e 64 20 29 7b 0d 0a  ->iter.iEnd ){..
1d120 20 20 20 20 20 20 66 74 73 35 48 69 67 68 6c 69        fts5Highli
1d130 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70  ghtAppend(&rc, p
1d140 2c 20 70 2d 3e 7a 43 6c 6f 73 65 2c 20 2d 31 29  , p->zClose, -1)
1d150 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
1d160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
1d170 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65  ..../*..** Imple
1d180 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 68 69 67  mentation of hig
1d190 68 6c 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f  hlight() functio
1d1a0 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  n...*/..static v
1d1b0 6f 69 64 20 66 74 73 35 48 69 67 68 6c 69 67 68  oid fts5Highligh
1d1c0 74 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 63 6f  tFunction(..  co
1d1d0 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
1d1e0 6e 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f 2a  nApi *pApi,   /*
1d1f0 20 41 50 49 20 6f 66 66 65 72 65 64 20 62 79 20   API offered by 
1d200 63 75 72 72 65 6e 74 20 46 54 53 20 76 65 72 73  current FTS vers
1d210 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f  ion */..  Fts5Co
1d220 6e 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20 20  ntext *pFts,    
1d230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d240 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74  st arg to pass t
1d250 6f 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e 73  o pApi functions
1d260 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63   */..  sqlite3_c
1d270 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
1d280 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
1d290 74 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  t for returning 
1d2a0 72 65 73 75 6c 74 2f 65 72 72 6f 72 20 2a 2f 0d  result/error */.
1d2b0 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20  .  int nVal,    
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d2e0 76 61 6c 75 65 73 20 69 6e 20 61 70 56 61 6c 5b  values in apVal[
1d2f0 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 73 71  ] array */..  sq
1d300 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1d310 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
1d320 20 41 72 72 61 79 20 6f 66 20 74 72 61 69 6c 69   Array of traili
1d330 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0d  ng arguments */.
1d340 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68 74  .){..  Highlight
1d350 43 6f 6e 74 65 78 74 20 63 74 78 3b 0d 0a 20 20  Context ctx;..  
1d360 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20 69  int rc;..  int i
1d370 43 6f 6c 3b 0d 0a 0d 0a 20 20 69 66 28 20 6e 56  Col;....  if( nV
1d380 61 6c 21 3d 33 20 29 7b 0d 0a 20 20 20 20 63 6f  al!=3 ){..    co
1d390 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
1d3a0 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
1d3b0 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1d3c0 75 6e 63 74 69 6f 6e 20 68 69 67 68 6c 69 67 68  unction highligh
1d3d0 74 28 29 22 3b 0d 0a 20 20 20 20 73 71 6c 69 74  t()";..    sqlit
1d3e0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1d3f0 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  pCtx, zErr, -1);
1d400 0d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20  ..    return;.. 
1d410 20 7d 0d 0a 0d 0a 20 20 69 43 6f 6c 20 3d 20 73   }....  iCol = s
1d420 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1d430 28 61 70 56 61 6c 5b 30 5d 29 3b 0d 0a 20 20 6d  (apVal[0]);..  m
1d440 65 6d 73 65 74 28 26 63 74 78 2c 20 30 2c 20 73  emset(&ctx, 0, s
1d450 69 7a 65 6f 66 28 48 69 67 68 6c 69 67 68 74 43  izeof(HighlightC
1d460 6f 6e 74 65 78 74 29 29 3b 0d 0a 20 20 63 74 78  ontext));..  ctx
1d470 2e 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20  .zOpen = (const 
1d480 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1d490 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31  lue_text(apVal[1
1d4a0 5d 29 3b 0d 0a 20 20 63 74 78 2e 7a 43 6c 6f 73  ]);..  ctx.zClos
1d4b0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
1d4c0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1d4d0 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0d 0a  ext(apVal[2]);..
1d4e0 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f    rc = pApi->xCo
1d4f0 6c 75 6d 6e 54 65 78 74 28 70 46 74 73 2c 20 69  lumnText(pFts, i
1d500 43 6f 6c 2c 20 26 63 74 78 2e 7a 49 6e 2c 20 26  Col, &ctx.zIn, &
1d510 63 74 78 2e 6e 49 6e 29 3b 0d 0a 0d 0a 20 20 69  ctx.nIn);....  i
1d520 66 28 20 63 74 78 2e 7a 49 6e 20 29 7b 0d 0a 20  f( ctx.zIn ){.. 
1d530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d540 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72  E_OK ){..      r
1d550 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65  c = fts5CInstIte
1d560 72 49 6e 69 74 28 70 41 70 69 2c 20 70 46 74 73  rInit(pApi, pFts
1d570 2c 20 69 43 6f 6c 2c 20 26 63 74 78 2e 69 74 65  , iCol, &ctx.ite
1d580 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  r);..    }....  
1d590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d5a0 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63  _OK ){..      rc
1d5b0 20 3d 20 70 41 70 69 2d 3e 78 54 6f 6b 65 6e 69   = pApi->xTokeni
1d5c0 7a 65 28 70 46 74 73 2c 20 63 74 78 2e 7a 49 6e  ze(pFts, ctx.zIn
1d5d0 2c 20 63 74 78 2e 6e 49 6e 2c 20 28 76 6f 69 64  , ctx.nIn, (void
1d5e0 2a 29 26 63 74 78 2c 66 74 73 35 48 69 67 68 6c  *)&ctx,fts5Highl
1d5f0 69 67 68 74 43 62 29 3b 0d 0a 20 20 20 20 7d 0d  ightCb);..    }.
1d600 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69 67  .    fts5Highlig
1d610 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 26 63  htAppend(&rc, &c
1d620 74 78 2c 20 26 63 74 78 2e 7a 49 6e 5b 63 74 78  tx, &ctx.zIn[ctx
1d630 2e 69 4f 66 66 5d 2c 20 63 74 78 2e 6e 49 6e 20  .iOff], ctx.nIn 
1d640 2d 20 63 74 78 2e 69 4f 66 66 29 3b 0d 0a 0d 0a  - ctx.iOff);....
1d650 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d660 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
1d670 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1d680 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
1d690 20 63 68 61 72 2a 29 63 74 78 2e 7a 4f 75 74 2c   char*)ctx.zOut,
1d6a0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
1d6b0 53 49 45 4e 54 29 3b 0d 0a 20 20 20 20 7d 0d 0a  SIENT);..    }..
1d6c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d6d0 28 63 74 78 2e 7a 4f 75 74 29 3b 0d 0a 20 20 7d  (ctx.zOut);..  }
1d6e0 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
1d6f0 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73 71  TE_OK ){..    sq
1d700 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1d710 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
1d720 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 2f 2a 0d 0a  );..  }..}../*..
1d730 2a 2a 20 45 6e 64 20 6f 66 20 68 69 67 68 6c 69  ** End of highli
1d740 67 68 74 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61  ght() implementa
1d750 74 69 6f 6e 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion...*********
1d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7a0 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e  */..../*..** Con
1d7b0 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
1d7c0 65 64 20 74 6f 20 74 68 65 20 66 74 73 35 53 65  ed to the fts5Se
1d7d0 6e 74 65 6e 63 65 46 69 6e 64 65 72 43 62 28 29  ntenceFinderCb()
1d7e0 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a   function...*/..
1d7f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1d800 74 73 35 53 46 69 6e 64 65 72 20 46 74 73 35 53  ts5SFinder Fts5S
1d810 46 69 6e 64 65 72 3b 0d 0a 73 74 72 75 63 74 20  Finder;..struct 
1d820 46 74 73 35 53 46 69 6e 64 65 72 20 7b 0d 0a 20  Fts5SFinder {.. 
1d830 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20 20   int iPos;      
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 6f 6b 65   /* Current toke
1d860 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0d 0a 20  n position */.. 
1d870 20 69 6e 74 20 6e 46 69 72 73 74 41 6c 6c 6f 63   int nFirstAlloc
1d880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d890 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
1d8a0 7a 65 20 6f 66 20 61 46 69 72 73 74 5b 5d 20 2a  ze of aFirst[] *
1d8b0 2f 0d 0a 20 20 69 6e 74 20 6e 46 69 72 73 74 3b  /..  int nFirst;
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d8e0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 46 69  f entries in aFi
1d8f0 72 73 74 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20  rst[] */..  int 
1d900 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
1d910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d920 72 72 61 79 20 6f 66 20 66 69 72 73 74 20 74 6f  rray of first to
1d930 6b 65 6e 20 69 6e 20 65 61 63 68 20 73 65 6e 74  ken in each sent
1d940 65 6e 63 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  ence */..  const
1d950 20 63 68 61 72 20 2a 7a 44 6f 63 3b 20 20 20 20   char *zDoc;    
1d960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1d970 63 75 6d 65 6e 74 20 62 65 69 6e 67 20 74 6f 6b  cument being tok
1d980 65 6e 69 7a 65 64 20 2a 2f 0d 0a 7d 3b 0d 0a 0d  enized */..};...
1d990 0a 2f 2a 0d 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ./*..** Add an e
1d9a0 6e 74 72 79 20 74 6f 20 74 68 65 20 46 74 73 35  ntry to the Fts5
1d9b0 53 46 69 6e 64 65 72 2e 61 46 69 72 73 74 5b 5d  SFinder.aFirst[]
1d9c0 20 61 72 72 61 79 2e 20 47 72 6f 77 20 74 68 65   array. Grow the
1d9d0 20 61 72 72 61 79 20 69 66 0d 0a 2a 2a 20 6e 65   array if..** ne
1d9e0 63 65 73 73 61 72 79 2e 20 52 65 74 75 72 6e 20  cessary. Return 
1d9f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1da00 63 65 73 73 66 75 6c 2c 20 6f 72 20 53 51 4c 49  cessful, or SQLI
1da10 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 6e 0d 0a  TE_NOMEM if an..
1da20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
1da30 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
1da40 20 66 74 73 35 53 65 6e 74 65 6e 63 65 46 69 6e   fts5SentenceFin
1da50 64 65 72 41 64 64 28 46 74 73 35 53 46 69 6e 64  derAdd(Fts5SFind
1da60 65 72 20 2a 70 2c 20 69 6e 74 20 69 41 64 64 29  er *p, int iAdd)
1da70 7b 0d 0a 20 20 69 66 28 20 70 2d 3e 6e 46 69 72  {..  if( p->nFir
1da80 73 74 41 6c 6c 6f 63 3d 3d 70 2d 3e 6e 46 69 72  stAlloc==p->nFir
1da90 73 74 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e  st ){..    int n
1daa0 4e 65 77 20 3d 20 70 2d 3e 6e 46 69 72 73 74 41  New = p->nFirstA
1dab0 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 46 69 72 73 74  lloc ? p->nFirst
1dac0 41 6c 6c 6f 63 2a 32 20 3a 20 36 34 3b 0d 0a 20  Alloc*2 : 64;.. 
1dad0 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0d 0a 0d     int *aNew;...
1dae0 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 69 6e 74  .    aNew = (int
1daf0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1db00 63 28 70 2d 3e 61 46 69 72 73 74 2c 20 6e 4e 65  c(p->aFirst, nNe
1db10 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0d  w*sizeof(int));.
1db20 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
1db30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1db40 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 70 2d 3e  _NOMEM;..    p->
1db50 61 46 69 72 73 74 20 3d 20 61 4e 65 77 3b 0d 0a  aFirst = aNew;..
1db60 20 20 20 20 70 2d 3e 6e 46 69 72 73 74 41 6c 6c      p->nFirstAll
1db70 6f 63 20 3d 20 6e 4e 65 77 3b 0d 0a 20 20 7d 0d  oc = nNew;..  }.
1db80 0a 20 20 70 2d 3e 61 46 69 72 73 74 5b 70 2d 3e  .  p->aFirst[p->
1db90 6e 46 69 72 73 74 2b 2b 5d 20 3d 20 69 41 64 64  nFirst++] = iAdd
1dba0 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
1dbb0 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  TE_OK;..}..../*.
1dbc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1dbd0 6e 20 69 73 20 61 6e 20 78 54 6f 6b 65 6e 69 7a  n is an xTokeniz
1dbe0 65 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  e() callback use
1dbf0 64 20 62 79 20 74 68 65 20 61 75 78 69 6c 69 61  d by the auxilia
1dc00 72 79 20 73 6e 69 70 70 65 74 28 29 0d 0a 2a 2a  ry snippet()..**
1dc10 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 73 20 6a   function. Its j
1dc20 6f 62 20 69 73 20 74 6f 20 69 64 65 6e 74 69 66  ob is to identif
1dc30 79 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 61 72  y tokens that ar
1dc40 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
1dc50 20 73 65 6e 74 65 6e 63 65 2e 0d 0a 2a 2a 20 46   sentence...** F
1dc60 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 6f 6b  or each such tok
1dc70 65 6e 2c 20 61 6e 20 65 6e 74 72 79 20 69 73 20  en, an entry is 
1dc80 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 46 69  added to the SFi
1dc90 6e 64 65 72 2e 61 46 69 72 73 74 5b 5d 20 61 72  nder.aFirst[] ar
1dca0 72 61 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ray...*/..static
1dcb0 20 69 6e 74 20 66 74 73 35 53 65 6e 74 65 6e 63   int fts5Sentenc
1dcc0 65 46 69 6e 64 65 72 43 62 28 0d 0a 20 20 76 6f  eFinderCb(..  vo
1dcd0 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20  id *pContext,   
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dcf0 20 50 6f 69 6e 74 65 72 20 74 6f 20 48 69 67 68   Pointer to High
1dd00 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 6f 62 6a  lightContext obj
1dd10 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 74 66  ect */..  int tf
1dd20 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1dd30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1dd40 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f  k of FTS5_TOKEN_
1dd50 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 63 6f  * flags */..  co
1dd60 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
1dd70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1dd80 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
1dd90 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 69  ng token */..  i
1dda0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddc0 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20  * Size of token 
1ddd0 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 69  in bytes */..  i
1dde0 6e 74 20 69 53 74 61 72 74 4f 66 66 2c 20 20 20  nt iStartOff,   
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de00 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74 20 6f  * Start offset o
1de10 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 69 6e  f token */..  in
1de20 74 20 69 45 6e 64 4f 66 66 20 20 20 20 20 20 20  t iEndOff       
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de40 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66 20 74   End offset of t
1de50 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69  oken */..){..  i
1de60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1de70 4b 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50  K;....  UNUSED_P
1de80 41 52 41 4d 32 28 70 54 6f 6b 65 6e 2c 20 6e 54  ARAM2(pToken, nT
1de90 6f 6b 65 6e 29 3b 0d 0a 20 20 55 4e 55 53 45 44  oken);..  UNUSED
1dea0 5f 50 41 52 41 4d 28 69 45 6e 64 4f 66 66 29 3b  _PARAM(iEndOff);
1deb0 0d 0a 0d 0a 20 20 69 66 28 20 28 74 66 6c 61 67  ....  if( (tflag
1dec0 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s & FTS5_TOKEN_C
1ded0 4f 4c 4f 43 41 54 45 44 29 3d 3d 30 20 29 7b 0d  OLOCATED)==0 ){.
1dee0 0a 20 20 20 20 46 74 73 35 53 46 69 6e 64 65 72  .    Fts5SFinder
1def0 20 2a 70 20 3d 20 28 46 74 73 35 53 46 69 6e 64   *p = (Fts5SFind
1df00 65 72 2a 29 70 43 6f 6e 74 65 78 74 3b 0d 0a 20  er*)pContext;.. 
1df10 20 20 20 69 66 28 20 70 2d 3e 69 50 6f 73 3e 30     if( p->iPos>0
1df20 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69   ){..      int i
1df30 3b 0d 0a 20 20 20 20 20 20 63 68 61 72 20 63 20  ;..      char c 
1df40 3d 20 30 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28  = 0;..      for(
1df50 69 3d 69 53 74 61 72 74 4f 66 66 2d 31 3b 20 69  i=iStartOff-1; i
1df60 3e 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 20  >=0; i--){..    
1df70 20 20 20 20 63 20 3d 20 70 2d 3e 7a 44 6f 63 5b      c = p->zDoc[
1df80 69 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  i];..        if(
1df90 20 63 21 3d 27 20 27 20 26 26 20 63 21 3d 27 5c   c!=' ' && c!='\
1dfa0 74 27 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26  t' && c!='\n' &&
1dfb0 20 63 21 3d 27 5c 72 27 20 29 20 62 72 65 61 6b   c!='\r' ) break
1dfc0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
1dfd0 20 20 69 66 28 20 69 21 3d 69 53 74 61 72 74 4f    if( i!=iStartO
1dfe0 66 66 2d 31 20 26 26 20 28 63 3d 3d 27 2e 27 20  ff-1 && (c=='.' 
1dff0 7c 7c 20 63 3d 3d 27 3a 27 29 20 29 7b 0d 0a 20  || c==':') ){.. 
1e000 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
1e010 53 65 6e 74 65 6e 63 65 46 69 6e 64 65 72 41 64  SentenceFinderAd
1e020 64 28 70 2c 20 70 2d 3e 69 50 6f 73 29 3b 0d 0a  d(p, p->iPos);..
1e030 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c        }..    }el
1e040 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20  se{..      rc = 
1e050 66 74 73 35 53 65 6e 74 65 6e 63 65 46 69 6e 64  fts5SentenceFind
1e060 65 72 41 64 64 28 70 2c 20 30 29 3b 0d 0a 20 20  erAdd(p, 0);..  
1e070 20 20 7d 0d 0a 20 20 20 20 70 2d 3e 69 50 6f 73    }..    p->iPos
1e080 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  ++;..  }..  retu
1e090 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  rn rc;..}....sta
1e0a0 74 69 63 20 69 6e 74 20 66 74 73 35 53 6e 69 70  tic int fts5Snip
1e0b0 70 65 74 53 63 6f 72 65 28 0d 0a 20 20 63 6f 6e  petScore(..  con
1e0c0 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e  st Fts5Extension
1e0d0 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f 2a 20  Api *pApi,   /* 
1e0e0 41 50 49 20 6f 66 66 65 72 65 64 20 62 79 20 63  API offered by c
1e0f0 75 72 72 65 6e 74 20 46 54 53 20 76 65 72 73 69  urrent FTS versi
1e100 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f 6e  on */..  Fts5Con
1e110 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20 20 20  text *pFts,     
1e120 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1e130 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
1e140 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e 73 20   pApi functions 
1e150 2a 2f 0d 0a 20 20 69 6e 74 20 6e 44 6f 63 73 69  */..  int nDocsi
1e160 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1e170 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e180 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 6f 6b 65 6e   column in token
1e190 73 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64  s */..  unsigned
1e1a0 20 63 68 61 72 20 2a 61 53 65 65 6e 2c 20 20 20   char *aSeen,   
1e1b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1e1c0 20 77 69 74 68 20 6f 6e 65 20 65 6c 65 6d 65 6e   with one elemen
1e1d0 74 20 70 65 72 20 71 75 65 72 79 20 70 68 72 61  t per query phra
1e1e0 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f  se */..  int iCo
1e1f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e200 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
1e210 6d 6e 20 74 6f 20 73 63 6f 72 65 20 2a 2f 0d 0a  mn to score */..
1e220 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
1e250 66 73 65 74 20 74 6f 20 73 63 6f 72 65 20 2a 2f  fset to score */
1e260 0d 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  ..  int nToken, 
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 2f 2a 20 4d 61 78 20 74 6f 6b 65 6e      /* Max token
1e290 73 20 70 65 72 20 73 6e 69 70 70 65 74 20 2a 2f  s per snippet */
1e2a0 0d 0a 20 20 69 6e 74 20 2a 70 6e 53 63 6f 72 65  ..  int *pnScore
1e2b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e2c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 63 6f 72      /* OUT: Scor
1e2d0 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 69 50  e */..  int *piP
1e2e0 6f 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  os              
1e2f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e300 41 64 6a 75 73 74 65 64 20 6f 66 66 73 65 74 20  Adjusted offset 
1e310 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  */..){..  int rc
1e320 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 69  ;..  int i;..  i
1e330 6e 74 20 69 70 20 3d 20 30 3b 0d 0a 20 20 69 6e  nt ip = 0;..  in
1e340 74 20 69 63 20 3d 20 30 3b 0d 0a 20 20 69 6e 74  t ic = 0;..  int
1e350 20 69 4f 66 66 20 3d 20 30 3b 0d 0a 20 20 69 6e   iOff = 0;..  in
1e360 74 20 69 46 69 72 73 74 20 3d 20 2d 31 3b 0d 0a  t iFirst = -1;..
1e370 20 20 69 6e 74 20 6e 49 6e 73 74 3b 0d 0a 20 20    int nInst;..  
1e380 69 6e 74 20 6e 53 63 6f 72 65 20 3d 20 30 3b 0d  int nScore = 0;.
1e390 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 30  .  int iLast = 0
1e3a0 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 70 41 70 69  ;....  rc = pApi
1e3b0 2d 3e 78 49 6e 73 74 43 6f 75 6e 74 28 70 46 74  ->xInstCount(pFt
1e3c0 73 2c 20 26 6e 49 6e 73 74 29 3b 0d 0a 20 20 66  s, &nInst);..  f
1e3d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 73 74 20  or(i=0; i<nInst 
1e3e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1e3f0 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 72 63 20  ; i++){..    rc 
1e400 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74 28 70 46  = pApi->xInst(pF
1e410 74 73 2c 20 69 2c 20 26 69 70 2c 20 26 69 63 2c  ts, i, &ip, &ic,
1e420 20 26 69 4f 66 66 29 3b 0d 0a 20 20 20 20 69 66   &iOff);..    if
1e430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e440 26 26 20 69 63 3d 3d 69 43 6f 6c 20 26 26 20 69  && ic==iCol && i
1e450 4f 66 66 3e 3d 69 50 6f 73 20 26 26 20 69 4f 66  Off>=iPos && iOf
1e460 66 3c 28 69 50 6f 73 2b 6e 54 6f 6b 65 6e 29 20  f<(iPos+nToken) 
1e470 29 7b 0d 0a 20 20 20 20 20 20 6e 53 63 6f 72 65  ){..      nScore
1e480 20 2b 3d 20 28 61 53 65 65 6e 5b 69 70 5d 20 3f   += (aSeen[ip] ?
1e490 20 31 20 3a 20 31 30 30 30 29 3b 0d 0a 20 20 20   1 : 1000);..   
1e4a0 20 20 20 61 53 65 65 6e 5b 69 70 5d 20 3d 20 31     aSeen[ip] = 1
1e4b0 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 69 46 69  ;..      if( iFi
1e4c0 72 73 74 3c 30 20 29 20 69 46 69 72 73 74 20 3d  rst<0 ) iFirst =
1e4d0 20 69 4f 66 66 3b 0d 0a 20 20 20 20 20 20 69 4c   iOff;..      iL
1e4e0 61 73 74 20 3d 20 69 4f 66 66 20 2b 20 70 41 70  ast = iOff + pAp
1e4f0 69 2d 3e 78 50 68 72 61 73 65 53 69 7a 65 28 70  i->xPhraseSize(p
1e500 46 74 73 2c 20 69 70 29 3b 0d 0a 20 20 20 20 7d  Fts, ip);..    }
1e510 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 6e 53 63  ..  }....  *pnSc
1e520 6f 72 65 20 3d 20 6e 53 63 6f 72 65 3b 0d 0a 20  ore = nScore;.. 
1e530 20 69 66 28 20 70 69 50 6f 73 20 29 7b 0d 0a 20   if( piPos ){.. 
1e540 20 20 20 69 6e 74 20 69 41 64 6a 20 3d 20 69 46     int iAdj = iF
1e550 69 72 73 74 20 2d 20 28 6e 54 6f 6b 65 6e 20 2d  irst - (nToken -
1e560 20 28 69 4c 61 73 74 2d 69 46 69 72 73 74 29 29   (iLast-iFirst))
1e570 20 2f 20 32 3b 0d 0a 20 20 20 20 69 66 28 20 28   / 2;..    if( (
1e580 69 41 64 6a 2b 6e 54 6f 6b 65 6e 29 3e 6e 44 6f  iAdj+nToken)>nDo
1e590 63 73 69 7a 65 20 29 20 69 41 64 6a 20 3d 20 6e  csize ) iAdj = n
1e5a0 44 6f 63 73 69 7a 65 20 2d 20 6e 54 6f 6b 65 6e  Docsize - nToken
1e5b0 3b 0d 0a 20 20 20 20 69 66 28 20 69 41 64 6a 3c  ;..    if( iAdj<
1e5c0 30 20 29 20 69 41 64 6a 20 3d 20 30 3b 0d 0a 20  0 ) iAdj = 0;.. 
1e5d0 20 20 20 2a 70 69 50 6f 73 20 3d 20 69 41 64 6a     *piPos = iAdj
1e5e0 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75  ;..  }....  retu
1e5f0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  rn rc;..}..../*.
1e600 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
1e610 61 6c 75 65 20 69 6e 20 70 56 61 6c 20 69 6e 74  alue in pVal int
1e620 65 72 70 72 65 74 65 64 20 61 73 20 75 74 66 2d  erpreted as utf-
1e630 38 20 74 65 78 74 2e 20 45 78 63 65 70 74 2c 20  8 text. Except, 
1e640 69 66 20 70 56 61 6c 20 0d 0a 2a 2a 20 63 6f 6e  if pVal ..** con
1e650 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 76 61 6c  tains a NULL val
1e660 75 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ue, return a poi
1e670 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69 63  nter to a static
1e680 20 73 74 72 69 6e 67 20 7a 65 72 6f 0d 0a 2a 2a   string zero..**
1e690 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1e6a0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 4e 55   instead of a NU
1e6b0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d  LL pointer...*/.
1e6c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1e6d0 61 72 20 2a 66 74 73 35 56 61 6c 75 65 54 6f 54  ar *fts5ValueToT
1e6e0 65 78 74 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ext(sqlite3_valu
1e6f0 65 20 2a 70 56 61 6c 29 7b 0d 0a 20 20 63 6f 6e  e *pVal){..  con
1e700 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
1e710 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e720 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1e730 70 56 61 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e  pVal);..  return
1e740 20 7a 52 65 74 20 3f 20 7a 52 65 74 20 3a 20 22   zRet ? zRet : "
1e750 22 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  ";..}..../*..** 
1e760 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1e770 66 20 73 6e 69 70 70 65 74 28 29 20 66 75 6e 63  f snippet() func
1e780 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  tion...*/..stati
1e790 63 20 76 6f 69 64 20 66 74 73 35 53 6e 69 70 70  c void fts5Snipp
1e7a0 65 74 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 63  etFunction(..  c
1e7b0 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69  onst Fts5Extensi
1e7c0 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f  onApi *pApi,   /
1e7d0 2a 20 41 50 49 20 6f 66 66 65 72 65 64 20 62 79  * API offered by
1e7e0 20 63 75 72 72 65 6e 74 20 46 54 53 20 76 65 72   current FTS ver
1e7f0 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43  sion */..  Fts5C
1e800 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20  ontext *pFts,   
1e810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e820 72 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20  rst arg to pass 
1e830 74 6f 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e  to pApi function
1e840 73 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f  s */..  sqlite3_
1e850 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
1e860 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1e870 78 74 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67  xt for returning
1e880 20 72 65 73 75 6c 74 2f 65 72 72 6f 72 20 2a 2f   result/error */
1e890 0d 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20  ..  int nVal,   
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e8c0 20 76 61 6c 75 65 73 20 69 6e 20 61 70 56 61 6c   values in apVal
1e8d0 5b 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 73  [] array */..  s
1e8e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1e8f0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
1e900 2a 20 41 72 72 61 79 20 6f 66 20 74 72 61 69 6c  * Array of trail
1e910 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ing arguments */
1e920 0d 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68  ..){..  Highligh
1e930 74 43 6f 6e 74 65 78 74 20 63 74 78 3b 0d 0a 20  tContext ctx;.. 
1e940 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e950 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1e960 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e970 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  */..  int iCol; 
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67        /* 1st arg
1e9a0 75 6d 65 6e 74 20 74 6f 20 73 6e 69 70 70 65 74  ument to snippet
1e9b0 28 29 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63  () */..  const c
1e9c0 68 61 72 20 2a 7a 45 6c 6c 69 70 73 3b 20 20 20  har *zEllips;   
1e9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 74 68 20           /* 4th 
1e9e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 6e 69 70  argument to snip
1e9f0 70 65 74 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20  pet() */..  int 
1ea00 6e 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  nToken;         
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35              /* 5
1ea20 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  th argument to s
1ea30 6e 69 70 70 65 74 28 29 20 2a 2f 0d 0a 20 20 69  nippet() */..  i
1ea40 6e 74 20 6e 49 6e 73 74 20 3d 20 30 3b 20 20 20  nt nInst = 0;   
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74  * Number of inst
1ea70 61 6e 63 65 20 6d 61 74 63 68 65 73 20 74 68 69  ance matches thi
1ea80 73 20 72 6f 77 20 2a 2f 0d 0a 20 20 69 6e 74 20  s row */..  int 
1ea90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1eab0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1eac0 68 72 6f 75 67 68 20 69 6e 73 74 61 6e 63 65 73  hrough instances
1ead0 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 68 72 61   */..  int nPhra
1eae0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1eaf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1eb00 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20 71   of phrases in q
1eb10 75 65 72 79 20 2a 2f 0d 0a 20 20 75 6e 73 69 67  uery */..  unsig
1eb20 6e 65 64 20 63 68 61 72 20 2a 61 53 65 65 6e 3b  ned char *aSeen;
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1eb40 72 61 79 20 6f 66 20 22 73 65 65 6e 20 69 6e 73  ray of "seen ins
1eb50 74 61 6e 63 65 22 20 66 6c 61 67 73 20 2a 2f 0d  tance" flags */.
1eb60 0a 20 20 69 6e 74 20 69 42 65 73 74 43 6f 6c 3b  .  int iBestCol;
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 6e     /* Column con
1eb90 74 61 69 6e 69 6e 67 20 62 65 73 74 20 73 6e 69  taining best sni
1eba0 70 70 65 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  ppet */..  int i
1ebb0 42 65 73 74 53 74 61 72 74 20 3d 20 30 3b 20 20  BestStart = 0;  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1ebd0 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20 62 65 73  rst token of bes
1ebe0 74 20 73 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20  t snippet */..  
1ebf0 69 6e 74 20 6e 42 65 73 74 53 63 6f 72 65 20 3d  int nBestScore =
1ec00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ec10 2f 2a 20 53 63 6f 72 65 20 6f 66 20 62 65 73 74  /* Score of best
1ec20 20 73 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20 69   snippet */..  i
1ec30 6e 74 20 6e 43 6f 6c 53 69 7a 65 20 3d 20 30 3b  nt nColSize = 0;
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec50 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
1ec60 69 42 65 73 74 43 6f 6c 20 69 6e 20 74 6f 6b 65  iBestCol in toke
1ec70 6e 73 20 2a 2f 0d 0a 20 20 46 74 73 35 53 46 69  ns */..  Fts5SFi
1ec80 6e 64 65 72 20 73 46 69 6e 64 65 72 3b 20 20 20  nder sFinder;   
1ec90 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1eca0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 65 67   to find the beg
1ecb0 69 6e 6e 69 6e 67 73 20 6f 66 20 73 65 6e 74 65  innings of sente
1ecc0 6e 63 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e  nces */..  int n
1ecd0 43 6f 6c 3b 0d 0a 0d 0a 20 20 69 66 28 20 6e 56  Col;....  if( nV
1ece0 61 6c 21 3d 35 20 29 7b 0d 0a 20 20 20 20 63 6f  al!=5 ){..    co
1ecf0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
1ed00 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
1ed10 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1ed20 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74 28  unction snippet(
1ed30 29 22 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  )";..    sqlite3
1ed40 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
1ed50 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0d 0a  tx, zErr, -1);..
1ed60 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d      return;..  }
1ed70 0d 0a 0d 0a 20 20 6e 43 6f 6c 20 3d 20 70 41 70  ....  nCol = pAp
1ed80 69 2d 3e 78 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  i->xColumnCount(
1ed90 70 46 74 73 29 3b 0d 0a 20 20 6d 65 6d 73 65 74  pFts);..  memset
1eda0 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (&ctx, 0, sizeof
1edb0 28 48 69 67 68 6c 69 67 68 74 43 6f 6e 74 65 78  (HighlightContex
1edc0 74 29 29 3b 0d 0a 20 20 69 43 6f 6c 20 3d 20 73  t));..  iCol = s
1edd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1ede0 28 61 70 56 61 6c 5b 30 5d 29 3b 0d 0a 20 20 63  (apVal[0]);..  c
1edf0 74 78 2e 7a 4f 70 65 6e 20 3d 20 66 74 73 35 56  tx.zOpen = fts5V
1ee00 61 6c 75 65 54 6f 54 65 78 74 28 61 70 56 61 6c  alueToText(apVal
1ee10 5b 31 5d 29 3b 0d 0a 20 20 63 74 78 2e 7a 43 6c  [1]);..  ctx.zCl
1ee20 6f 73 65 20 3d 20 66 74 73 35 56 61 6c 75 65 54  ose = fts5ValueT
1ee30 6f 54 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  oText(apVal[2]);
1ee40 0d 0a 20 20 7a 45 6c 6c 69 70 73 20 3d 20 66 74  ..  zEllips = ft
1ee50 73 35 56 61 6c 75 65 54 6f 54 65 78 74 28 61 70  s5ValueToText(ap
1ee60 56 61 6c 5b 33 5d 29 3b 0d 0a 20 20 6e 54 6f 6b  Val[3]);..  nTok
1ee70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  en = sqlite3_val
1ee80 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29  ue_int(apVal[4])
1ee90 3b 0d 0a 0d 0a 20 20 69 42 65 73 74 43 6f 6c 20  ;....  iBestCol 
1eea0 3d 20 28 69 43 6f 6c 3e 3d 30 20 3f 20 69 43 6f  = (iCol>=0 ? iCo
1eeb0 6c 20 3a 20 30 29 3b 0d 0a 20 20 6e 50 68 72 61  l : 0);..  nPhra
1eec0 73 65 20 3d 20 70 41 70 69 2d 3e 78 50 68 72 61  se = pApi->xPhra
1eed0 73 65 43 6f 75 6e 74 28 70 46 74 73 29 3b 0d 0a  seCount(pFts);..
1eee0 20 20 61 53 65 65 6e 20 3d 20 73 71 6c 69 74 65    aSeen = sqlite
1eef0 33 5f 6d 61 6c 6c 6f 63 28 6e 50 68 72 61 73 65  3_malloc(nPhrase
1ef00 29 3b 0d 0a 20 20 69 66 28 20 61 53 65 65 6e 3d  );..  if( aSeen=
1ef10 3d 30 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  =0 ){..    rc = 
1ef20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20  SQLITE_NOMEM;.. 
1ef30 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1ef40 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
1ef50 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74  rc = pApi->xInst
1ef60 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e 49 6e  Count(pFts, &nIn
1ef70 73 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 6d  st);..  }....  m
1ef80 65 6d 73 65 74 28 26 73 46 69 6e 64 65 72 2c 20  emset(&sFinder, 
1ef90 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 46  0, sizeof(Fts5SF
1efa0 69 6e 64 65 72 29 29 3b 0d 0a 20 20 66 6f 72 28  inder));..  for(
1efb0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1efc0 29 7b 0d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ){..    if( iCol
1efd0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 69 20 29 7b  <0 || iCol==i ){
1efe0 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63  ..      int nDoc
1eff0 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  ;..      int nDo
1f000 63 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20 69 6e  csize;..      in
1f010 74 20 69 69 3b 0d 0a 20 20 20 20 20 20 73 46 69  t ii;..      sFi
1f020 6e 64 65 72 2e 69 50 6f 73 20 3d 20 30 3b 0d 0a  nder.iPos = 0;..
1f030 20 20 20 20 20 20 73 46 69 6e 64 65 72 2e 6e 46        sFinder.nF
1f040 69 72 73 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20  irst = 0;..     
1f050 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f 6c   rc = pApi->xCol
1f060 75 6d 6e 54 65 78 74 28 70 46 74 73 2c 20 69 2c  umnText(pFts, i,
1f070 20 26 73 46 69 6e 64 65 72 2e 7a 44 6f 63 2c 20   &sFinder.zDoc, 
1f080 26 6e 44 6f 63 29 3b 0d 0a 20 20 20 20 20 20 69  &nDoc);..      i
1f090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f0a0 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20   ) break;..     
1f0b0 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 54 6f 6b   rc = pApi->xTok
1f0c0 65 6e 69 7a 65 28 70 46 74 73 2c 20 0d 0a 20 20  enize(pFts, ..  
1f0d0 20 20 20 20 20 20 20 20 73 46 69 6e 64 65 72 2e          sFinder.
1f0e0 7a 44 6f 63 2c 20 6e 44 6f 63 2c 20 28 76 6f 69  zDoc, nDoc, (voi
1f0f0 64 2a 29 26 73 46 69 6e 64 65 72 2c 66 74 73 35  d*)&sFinder,fts5
1f100 53 65 6e 74 65 6e 63 65 46 69 6e 64 65 72 43 62  SentenceFinderCb
1f110 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20  ..      );..    
1f120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f130 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20  _OK ) break;..  
1f140 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
1f150 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73 2c  ColumnSize(pFts,
1f160 20 69 2c 20 26 6e 44 6f 63 73 69 7a 65 29 3b 0d   i, &nDocsize);.
1f170 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f180 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
1f190 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 28 69  ;....      for(i
1f1a0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1f1b0 4f 4b 20 26 26 20 69 69 3c 6e 49 6e 73 74 3b 20  OK && ii<nInst; 
1f1c0 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20  ii++){..        
1f1d0 69 6e 74 20 69 70 2c 20 69 63 2c 20 69 6f 3b 0d  int ip, ic, io;.
1f1e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
1f1f0 6a 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  j;..        int 
1f200 6e 53 63 6f 72 65 3b 0d 0a 20 20 20 20 20 20 20  nScore;..       
1f210 20 69 6e 74 20 6a 6a 3b 0d 0a 0d 0a 20 20 20 20   int jj;....    
1f220 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
1f230 49 6e 73 74 28 70 46 74 73 2c 20 69 69 2c 20 26  Inst(pFts, ii, &
1f240 69 70 2c 20 26 69 63 2c 20 26 69 6f 29 3b 0d 0a  ip, &ic, &io);..
1f250 20 20 20 20 20 20 20 20 69 66 28 20 69 63 21 3d          if( ic!=
1f260 69 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  i || rc!=SQLITE_
1f270 4f 4b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a  OK ) continue;..
1f280 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
1f290 53 65 65 6e 2c 20 30 2c 20 6e 50 68 72 61 73 65  Seen, 0, nPhrase
1f2a0 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d  );..        rc =
1f2b0 20 66 74 73 35 53 6e 69 70 70 65 74 53 63 6f 72   fts5SnippetScor
1f2c0 65 28 70 41 70 69 2c 20 70 46 74 73 2c 20 6e 44  e(pApi, pFts, nD
1f2d0 6f 63 73 69 7a 65 2c 20 61 53 65 65 6e 2c 20 69  ocsize, aSeen, i
1f2e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ,..            i
1f2f0 6f 2c 20 6e 54 6f 6b 65 6e 2c 20 26 6e 53 63 6f  o, nToken, &nSco
1f300 72 65 2c 20 26 69 41 64 6a 0d 0a 20 20 20 20 20  re, &iAdj..     
1f310 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 69     );..        i
1f320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f330 20 26 26 20 6e 53 63 6f 72 65 3e 6e 42 65 73 74   && nScore>nBest
1f340 53 63 6f 72 65 20 29 7b 0d 0a 20 20 20 20 20 20  Score ){..      
1f350 20 20 20 20 6e 42 65 73 74 53 63 6f 72 65 20 3d      nBestScore =
1f360 20 6e 53 63 6f 72 65 3b 0d 0a 20 20 20 20 20 20   nScore;..      
1f370 20 20 20 20 69 42 65 73 74 43 6f 6c 20 3d 20 69      iBestCol = i
1f380 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ;..          iBe
1f390 73 74 53 74 61 72 74 20 3d 20 69 41 64 6a 3b 0d  stStart = iAdj;.
1f3a0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 53  .          nColS
1f3b0 69 7a 65 20 3d 20 6e 44 6f 63 73 69 7a 65 3b 0d  ize = nDocsize;.
1f3c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f3d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f3e0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 46 69 6e 64  LITE_OK && sFind
1f3f0 65 72 2e 6e 46 69 72 73 74 20 26 26 20 6e 44 6f  er.nFirst && nDo
1f400 63 73 69 7a 65 3e 6e 54 6f 6b 65 6e 20 29 7b 0d  csize>nToken ){.
1f410 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
1f420 6a 3d 30 3b 20 6a 6a 3c 28 73 46 69 6e 64 65 72  j=0; jj<(sFinder
1f430 2e 6e 46 69 72 73 74 2d 31 29 3b 20 6a 6a 2b 2b  .nFirst-1); jj++
1f440 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){..            
1f450 69 66 28 20 73 46 69 6e 64 65 72 2e 61 46 69 72  if( sFinder.aFir
1f460 73 74 5b 6a 6a 2b 31 5d 3e 69 6f 20 29 20 62 72  st[jj+1]>io ) br
1f470 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
1f480 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
1f490 66 28 20 73 46 69 6e 64 65 72 2e 61 46 69 72 73  f( sFinder.aFirs
1f4a0 74 5b 6a 6a 5d 3c 69 6f 20 29 7b 0d 0a 20 20 20  t[jj]<io ){..   
1f4b0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1f4c0 61 53 65 65 6e 2c 20 30 2c 20 6e 50 68 72 61 73  aSeen, 0, nPhras
1f4d0 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
1f4e0 20 72 63 20 3d 20 66 74 73 35 53 6e 69 70 70 65   rc = fts5Snippe
1f4f0 74 53 63 6f 72 65 28 70 41 70 69 2c 20 70 46 74  tScore(pApi, pFt
1f500 73 2c 20 6e 44 6f 63 73 69 7a 65 2c 20 61 53 65  s, nDocsize, aSe
1f510 65 6e 2c 20 69 2c 20 0d 0a 20 20 20 20 20 20 20  en, i, ..       
1f520 20 20 20 20 20 20 20 73 46 69 6e 64 65 72 2e 61         sFinder.a
1f530 46 69 72 73 74 5b 6a 6a 5d 2c 20 6e 54 6f 6b 65  First[jj], nToke
1f540 6e 2c 20 26 6e 53 63 6f 72 65 2c 20 30 0d 0a 20  n, &nScore, 0.. 
1f550 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
1f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 63  .            nSc
1f570 6f 72 65 20 2b 3d 20 28 73 46 69 6e 64 65 72 2e  ore += (sFinder.
1f580 61 46 69 72 73 74 5b 6a 6a 5d 3d 3d 30 20 3f 20  aFirst[jj]==0 ? 
1f590 31 32 30 20 3a 20 31 30 30 29 3b 0d 0a 20 20 20  120 : 100);..   
1f5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1f5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53  =SQLITE_OK && nS
1f5c0 63 6f 72 65 3e 6e 42 65 73 74 53 63 6f 72 65 20  core>nBestScore 
1f5d0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){..            
1f5e0 20 20 6e 42 65 73 74 53 63 6f 72 65 20 3d 20 6e    nBestScore = n
1f5f0 53 63 6f 72 65 3b 0d 0a 20 20 20 20 20 20 20 20  Score;..        
1f600 20 20 20 20 20 20 69 42 65 73 74 43 6f 6c 20 3d        iBestCol =
1f610 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   i;..           
1f620 20 20 20 69 42 65 73 74 53 74 61 72 74 20 3d 20     iBestStart = 
1f630 73 46 69 6e 64 65 72 2e 61 46 69 72 73 74 5b 6a  sFinder.aFirst[j
1f640 6a 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  j];..           
1f650 20 20 20 6e 43 6f 6c 53 69 7a 65 20 3d 20 6e 44     nColSize = nD
1f660 6f 63 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20 20  ocsize;..       
1f670 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f680 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f690 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1f6a0 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d    }....  if( rc=
1f6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
1f6c0 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43     rc = pApi->xC
1f6d0 6f 6c 75 6d 6e 54 65 78 74 28 70 46 74 73 2c 20  olumnText(pFts, 
1f6e0 69 42 65 73 74 43 6f 6c 2c 20 26 63 74 78 2e 7a  iBestCol, &ctx.z
1f6f0 49 6e 2c 20 26 63 74 78 2e 6e 49 6e 29 3b 0d 0a  In, &ctx.nIn);..
1f700 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1f710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 43 6f 6c  QLITE_OK && nCol
1f720 53 69 7a 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Size==0 ){..    
1f730 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f 6c 75  rc = pApi->xColu
1f740 6d 6e 53 69 7a 65 28 70 46 74 73 2c 20 69 42 65  mnSize(pFts, iBe
1f750 73 74 43 6f 6c 2c 20 26 6e 43 6f 6c 53 69 7a 65  stCol, &nColSize
1f760 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 63  );..  }..  if( c
1f770 74 78 2e 7a 49 6e 20 29 7b 0d 0a 20 20 20 20 69  tx.zIn ){..    i
1f780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f790 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20   ){..      rc = 
1f7a0 66 74 73 35 43 49 6e 73 74 49 74 65 72 49 6e 69  fts5CInstIterIni
1f7b0 74 28 70 41 70 69 2c 20 70 46 74 73 2c 20 69 42  t(pApi, pFts, iB
1f7c0 65 73 74 43 6f 6c 2c 20 26 63 74 78 2e 69 74 65  estCol, &ctx.ite
1f7d0 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  r);..    }....  
1f7e0 20 20 63 74 78 2e 69 52 61 6e 67 65 53 74 61 72    ctx.iRangeStar
1f7f0 74 20 3d 20 69 42 65 73 74 53 74 61 72 74 3b 0d  t = iBestStart;.
1f800 0a 20 20 20 20 63 74 78 2e 69 52 61 6e 67 65 45  .    ctx.iRangeE
1f810 6e 64 20 3d 20 69 42 65 73 74 53 74 61 72 74 20  nd = iBestStart 
1f820 2b 20 6e 54 6f 6b 65 6e 20 2d 20 31 3b 0d 0a 0d  + nToken - 1;...
1f830 0a 20 20 20 20 69 66 28 20 69 42 65 73 74 53 74  .    if( iBestSt
1f840 61 72 74 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20  art>0 ){..      
1f850 66 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70  fts5HighlightApp
1f860 65 6e 64 28 26 72 63 2c 20 26 63 74 78 2c 20 7a  end(&rc, &ctx, z
1f870 45 6c 6c 69 70 73 2c 20 2d 31 29 3b 0d 0a 20 20  Ellips, -1);..  
1f880 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 64    }....    /* Ad
1f890 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 63  vance iterator c
1f8a0 74 78 2e 69 74 65 72 20 73 6f 20 74 68 61 74 20  tx.iter so that 
1f8b0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1f8c0 20 66 69 72 73 74 20 63 6f 61 6c 65 73 63 65 64   first coalesced
1f8d0 0d 0a 20 20 20 20 2a 2a 20 70 68 72 61 73 65 20  ..    ** phrase 
1f8e0 69 6e 73 74 61 6e 63 65 20 61 74 20 6f 72 20 66  instance at or f
1f8f0 6f 6c 6c 6f 77 69 6e 67 20 70 6f 73 69 74 69 6f  ollowing positio
1f900 6e 20 69 42 65 73 74 53 74 61 72 74 2e 20 2a 2f  n iBestStart. */
1f910 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 74 78  ..    while( ctx
1f920 2e 69 74 65 72 2e 69 53 74 61 72 74 3e 3d 30 20  .iter.iStart>=0 
1f930 26 26 20 63 74 78 2e 69 74 65 72 2e 69 53 74 61  && ctx.iter.iSta
1f940 72 74 3c 69 42 65 73 74 53 74 61 72 74 20 26 26  rt<iBestStart &&
1f950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f960 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  {..      rc = ft
1f970 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78 74 28  s5CInstIterNext(
1f980 26 63 74 78 2e 69 74 65 72 29 3b 0d 0a 20 20 20  &ctx.iter);..   
1f990 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 72 63   }....    if( rc
1f9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
1f9b0 20 20 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d        rc = pApi-
1f9c0 3e 78 54 6f 6b 65 6e 69 7a 65 28 70 46 74 73 2c  >xTokenize(pFts,
1f9d0 20 63 74 78 2e 7a 49 6e 2c 20 63 74 78 2e 6e 49   ctx.zIn, ctx.nI
1f9e0 6e 2c 20 28 76 6f 69 64 2a 29 26 63 74 78 2c 66  n, (void*)&ctx,f
1f9f0 74 73 35 48 69 67 68 6c 69 67 68 74 43 62 29 3b  ts5HighlightCb);
1fa00 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28  ..    }..    if(
1fa10 20 63 74 78 2e 69 52 61 6e 67 65 45 6e 64 3e 3d   ctx.iRangeEnd>=
1fa20 28 6e 43 6f 6c 53 69 7a 65 2d 31 29 20 29 7b 0d  (nColSize-1) ){.
1fa30 0a 20 20 20 20 20 20 66 74 73 35 48 69 67 68 6c  .      fts5Highl
1fa40 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20  ightAppend(&rc, 
1fa50 26 63 74 78 2c 20 26 63 74 78 2e 7a 49 6e 5b 63  &ctx, &ctx.zIn[c
1fa60 74 78 2e 69 4f 66 66 5d 2c 20 63 74 78 2e 6e 49  tx.iOff], ctx.nI
1fa70 6e 20 2d 20 63 74 78 2e 69 4f 66 66 29 3b 0d 0a  n - ctx.iOff);..
1fa80 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
1fa90 20 20 66 74 73 35 48 69 67 68 6c 69 67 68 74 41    fts5HighlightA
1faa0 70 70 65 6e 64 28 26 72 63 2c 20 26 63 74 78 2c  ppend(&rc, &ctx,
1fab0 20 7a 45 6c 6c 69 70 73 2c 20 2d 31 29 3b 0d 0a   zEllips, -1);..
1fac0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66      }..  }..  if
1fad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fae0 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){..    sqlite3_
1faf0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
1fb00 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 63  , (const char*)c
1fb10 74 78 2e 7a 4f 75 74 2c 20 2d 31 2c 20 53 51 4c  tx.zOut, -1, SQL
1fb20 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0d  ITE_TRANSIENT);.
1fb30 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73  .  }else{..    s
1fb40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1fb50 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72  ror_code(pCtx, r
1fb60 63 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69  c);..  }..  sqli
1fb70 74 65 33 5f 66 72 65 65 28 63 74 78 2e 7a 4f 75  te3_free(ctx.zOu
1fb80 74 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66  t);..  sqlite3_f
1fb90 72 65 65 28 61 53 65 65 6e 29 3b 0d 0a 20 20 73  ree(aSeen);..  s
1fba0 71 6c 69 74 65 33 5f 66 72 65 65 28 73 46 69 6e  qlite3_free(sFin
1fbb0 64 65 72 2e 61 46 69 72 73 74 29 3b 0d 0a 7d 0d  der.aFirst);..}.
1fbc0 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
1fbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
1fc10 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 69 72 73  ./*..** The firs
1fc20 74 20 74 69 6d 65 20 74 68 65 20 62 6d 32 35 28  t time the bm25(
1fc30 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
1fc40 6c 6c 65 64 20 66 6f 72 20 61 20 71 75 65 72 79  lled for a query
1fc50 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 0d 0a 2a  , an instance..*
1fc60 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
1fc70 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
1fc80 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
1fc90 70 75 6c 61 74 65 64 2e 0d 0a 2a 2f 0d 0a 74 79  pulated...*/..ty
1fca0 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
1fcb0 35 42 6d 32 35 44 61 74 61 20 46 74 73 35 42 6d  5Bm25Data Fts5Bm
1fcc0 32 35 44 61 74 61 3b 0d 0a 73 74 72 75 63 74 20  25Data;..struct 
1fcd0 46 74 73 35 42 6d 32 35 44 61 74 61 20 7b 0d 0a  Fts5Bm25Data {..
1fce0 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20    int nPhrase;  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1fd10 68 72 61 73 65 73 20 69 6e 20 71 75 65 72 79 20  hrases in query 
1fd20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 61 76 67  */..  double avg
1fd30 64 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dl;             
1fd40 20 20 20 20 20 20 2f 2a 20 41 76 65 72 61 67 65        /* Average
1fd50 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e   number of token
1fd60 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f  s in each row */
1fd70 0d 0a 20 20 64 6f 75 62 6c 65 20 2a 61 49 44 46  ..  double *aIDF
1fd80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fd90 20 20 20 20 2f 2a 20 49 44 46 20 66 6f 72 20 65      /* IDF for e
1fda0 61 63 68 20 70 68 72 61 73 65 20 2a 2f 0d 0a 20  ach phrase */.. 
1fdb0 20 64 6f 75 62 6c 65 20 2a 61 46 72 65 71 3b 20   double *aFreq; 
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 2f 2a 20 41 72 72 61 79 20 75 73 65 64 20 74   /* Array used t
1fde0 6f 20 63 61 6c 63 75 6c 61 74 65 20 70 68 72 61  o calculate phra
1fdf0 73 65 20 66 72 65 71 2e 20 2a 2f 0d 0a 7d 3b 0d  se freq. */..};.
1fe00 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c 62 61  .../*..** Callba
1fe10 63 6b 20 75 73 65 64 20 62 79 20 66 74 73 35 42  ck used by fts5B
1fe20 6d 32 35 47 65 74 44 61 74 61 28 29 20 74 6f 20  m25GetData() to 
1fe30 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  count the number
1fe40 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 0d   of rows in the.
1fe50 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 74 63 68 65  .** table matche
1fe60 64 20 62 79 20 65 61 63 68 20 69 6e 64 69 76 69  d by each indivi
1fe70 64 75 61 6c 20 70 68 72 61 73 65 20 77 69 74 68  dual phrase with
1fe80 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0d 0a 2a  in the query...*
1fe90 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
1fea0 73 35 43 6f 75 6e 74 43 62 28 0d 0a 20 20 63 6f  s5CountCb(..  co
1feb0 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
1fec0 6e 41 70 69 20 2a 70 41 70 69 2c 20 0d 0a 20 20  nApi *pApi, ..  
1fed0 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74  Fts5Context *pFt
1fee0 73 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  s,..  void *pUse
1fef0 72 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20  rData           
1ff00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ff10 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   to sqlite3_int6
1ff20 34 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 29  4 variable */..)
1ff30 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  {..  sqlite3_int
1ff40 36 34 20 2a 70 6e 20 3d 20 28 73 71 6c 69 74 65  64 *pn = (sqlite
1ff50 33 5f 69 6e 74 36 34 2a 29 70 55 73 65 72 44 61  3_int64*)pUserDa
1ff60 74 61 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41  ta;..  UNUSED_PA
1ff70 52 41 4d 32 28 70 41 70 69 2c 20 70 46 74 73 29  RAM2(pApi, pFts)
1ff80 3b 0d 0a 20 20 28 2a 70 6e 29 2b 2b 3b 0d 0a 20  ;..  (*pn)++;.. 
1ff90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ffa0 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  K;..}..../*..** 
1ffb0 53 65 74 20 2a 70 70 44 61 74 61 20 74 6f 20 70  Set *ppData to p
1ffc0 6f 69 6e 74 20 74 6f 20 74 68 65 20 46 74 73 35  oint to the Fts5
1ffd0 42 6d 32 35 44 61 74 61 20 6f 62 6a 65 63 74 20  Bm25Data object 
1ffe0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1fff0 71 75 65 72 79 2e 20 0d 0a 2a 2a 20 49 66 20 74  query. ..** If t
20000 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 6f  he object has no
20010 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
20020 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20030 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
20040 69 74 0d 0a 2a 2a 20 6e 6f 77 2e 0d 0a 2a 2f 0d  it..** now...*/.
20050 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
20060 42 6d 32 35 47 65 74 44 61 74 61 28 0d 0a 20 20  Bm25GetData(..  
20070 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73  const Fts5Extens
20080 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20 0d 0a  ionApi *pApi, ..
20090 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70    Fts5Context *p
200a0 46 74 73 2c 0d 0a 20 20 46 74 73 35 42 6d 32 35  Fts,..  Fts5Bm25
200b0 44 61 74 61 20 2a 2a 70 70 44 61 74 61 20 20 20  Data **ppData   
200c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
200d0 62 6d 32 35 2d 64 61 74 61 20 6f 62 6a 65 63 74  bm25-data object
200e0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
200f0 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  */..){..  int rc
20100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
20110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20120 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 46  urn code */..  F
20130 74 73 35 42 6d 32 35 44 61 74 61 20 2a 70 3b 20  ts5Bm25Data *p; 
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20150 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  * Object to retu
20160 72 6e 20 2a 2f 0d 0a 0d 0a 20 20 70 20 3d 20 70  rn */....  p = p
20170 41 70 69 2d 3e 78 47 65 74 41 75 78 64 61 74 61  Api->xGetAuxdata
20180 28 70 46 74 73 2c 20 30 29 3b 0d 0a 20 20 69 66  (pFts, 0);..  if
20190 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69  ( p==0 ){..    i
201a0 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20  nt nPhrase;     
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201c0 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65  Number of phrase
201d0 73 20 69 6e 20 71 75 65 72 79 20 2a 2f 0d 0a 20  s in query */.. 
201e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
201f0 20 6e 52 6f 77 20 3d 20 30 3b 20 20 20 20 20 20   nRow = 0;      
20200 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
20210 77 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0d 0a  ws in table */..
20220 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
20230 34 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20  4 nToken = 0;   
20240 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
20250 6f 6b 65 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a  okens in table *
20260 2f 0d 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  /..    int nByte
20270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20280 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
20290 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
202a0 74 65 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69  te */..    int i
202b0 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  ;....    /* Allo
202c0 63 61 74 65 20 74 68 65 20 46 74 73 35 42 6d 32  cate the Fts5Bm2
202d0 35 44 61 74 61 20 6f 62 6a 65 63 74 20 2a 2f 0d  5Data object */.
202e0 0a 20 20 20 20 6e 50 68 72 61 73 65 20 3d 20 70  .    nPhrase = p
202f0 41 70 69 2d 3e 78 50 68 72 61 73 65 43 6f 75 6e  Api->xPhraseCoun
20300 74 28 70 46 74 73 29 3b 0d 0a 20 20 20 20 6e 42  t(pFts);..    nB
20310 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
20320 35 42 6d 32 35 44 61 74 61 29 20 2b 20 6e 50 68  5Bm25Data) + nPh
20330 72 61 73 65 2a 32 2a 73 69 7a 65 6f 66 28 64 6f  rase*2*sizeof(do
20340 75 62 6c 65 29 3b 0d 0a 20 20 20 20 70 20 3d 20  uble);..    p = 
20350 28 46 74 73 35 42 6d 32 35 44 61 74 61 2a 29 73  (Fts5Bm25Data*)s
20360 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
20370 79 74 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 70  yte);..    if( p
20380 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63  ==0 ){..      rc
20390 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
203a0 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  ..    }else{..  
203b0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
203c0 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20   nByte);..      
203d0 70 2d 3e 6e 50 68 72 61 73 65 20 3d 20 6e 50 68  p->nPhrase = nPh
203e0 72 61 73 65 3b 0d 0a 20 20 20 20 20 20 70 2d 3e  rase;..      p->
203f0 61 49 44 46 20 3d 20 28 64 6f 75 62 6c 65 2a 29  aIDF = (double*)
20400 26 70 5b 31 5d 3b 0d 0a 20 20 20 20 20 20 70 2d  &p[1];..      p-
20410 3e 61 46 72 65 71 20 3d 20 26 70 2d 3e 61 49 44  >aFreq = &p->aID
20420 46 5b 6e 50 68 72 61 73 65 5d 3b 0d 0a 20 20 20  F[nPhrase];..   
20430 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 61 6c   }....    /* Cal
20440 63 75 6c 61 74 65 20 74 68 65 20 61 76 65 72 61  culate the avera
20450 67 65 20 64 6f 63 75 6d 65 6e 74 20 6c 65 6e 67  ge document leng
20460 74 68 20 66 6f 72 20 74 68 69 73 20 46 54 53 35  th for this FTS5
20470 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 69   table */..    i
20480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20490 20 29 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 52   ) rc = pApi->xR
204a0 6f 77 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e  owCount(pFts, &n
204b0 52 6f 77 29 3b 0d 0a 20 20 20 20 69 66 28 20 72  Row);..    if( r
204c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
204d0 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f 6c 75 6d  c = pApi->xColum
204e0 6e 54 6f 74 61 6c 53 69 7a 65 28 70 46 74 73 2c  nTotalSize(pFts,
204f0 20 2d 31 2c 20 26 6e 54 6f 6b 65 6e 29 3b 0d 0a   -1, &nToken);..
20500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20510 54 45 5f 4f 4b 20 29 20 70 2d 3e 61 76 67 64 6c  TE_OK ) p->avgdl
20520 20 3d 20 28 64 6f 75 62 6c 65 29 6e 54 6f 6b 65   = (double)nToke
20530 6e 20 20 2f 20 28 64 6f 75 62 6c 65 29 6e 52 6f  n  / (double)nRo
20540 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 61 6c  w;....    /* Cal
20550 63 75 6c 61 74 65 20 61 6e 20 49 44 46 20 66 6f  culate an IDF fo
20560 72 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  r each phrase in
20570 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0d 0a 20   the query */.. 
20580 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
20590 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
205a0 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20  Phrase; i++){.. 
205b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
205c0 36 34 20 6e 48 69 74 20 3d 20 30 3b 0d 0a 20 20  64 nHit = 0;..  
205d0 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
205e0 51 75 65 72 79 50 68 72 61 73 65 28 70 46 74 73  QueryPhrase(pFts
205f0 2c 20 69 2c 20 28 76 6f 69 64 2a 29 26 6e 48 69  , i, (void*)&nHi
20600 74 2c 20 66 74 73 35 43 6f 75 6e 74 43 62 29 3b  t, fts5CountCb);
20610 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
20620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
20630 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61        /* Calcula
20640 74 65 20 74 68 65 20 49 44 46 20 28 49 6e 76 65  te the IDF (Inve
20650 72 73 65 20 44 6f 63 75 6d 65 6e 74 20 46 72 65  rse Document Fre
20660 71 75 65 6e 63 79 29 20 66 6f 72 20 70 68 72 61  quency) for phra
20670 73 65 20 69 2e 0d 0a 20 20 20 20 20 20 20 20 2a  se i...        *
20680 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 75  * This is done u
20690 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72  sing the standar
206a0 64 20 42 4d 32 35 20 66 6f 72 6d 75 6c 61 20 61  d BM25 formula a
206b0 73 20 66 6f 75 6e 64 20 6f 6e 20 77 69 6b 69 70  s found on wikip
206c0 65 64 69 61 3a 0d 0a 20 20 20 20 20 20 20 20 2a  edia:..        *
206d0 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  *..        **   
206e0 49 44 46 20 3d 20 6c 6f 67 28 20 28 4e 20 2d 20  IDF = log( (N - 
206f0 6e 48 69 74 20 2b 20 30 2e 35 29 20 2f 20 28 6e  nHit + 0.5) / (n
20700 48 69 74 20 2b 20 30 2e 35 29 20 29 0d 0a 20 20  Hit + 0.5) )..  
20710 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20        **..      
20720 20 20 2a 2a 20 77 68 65 72 65 20 22 4e 22 20 69    ** where "N" i
20730 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
20740 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
20750 69 6e 20 74 68 65 20 73 65 74 20 61 6e 64 20 6e  in the set and n
20760 48 69 74 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20  Hit..        ** 
20770 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 74 68  is the number th
20780 61 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  at contain at le
20790 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
207a0 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 0d 0a   of the phrase..
207b0 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 64 65 72          ** under
207c0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0d   consideration..
207d0 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20  .        **..   
207e0 20 20 20 20 20 2a 2a 20 54 68 65 20 70 72 6f 62       ** The prob
207f0 6c 65 6d 20 77 69 74 68 20 74 68 69 73 20 69 73  lem with this is
20800 20 74 68 61 74 20 69 66 20 28 4e 20 3c 20 32 2a   that if (N < 2*
20810 6e 48 69 74 29 2c 20 74 68 65 20 49 44 46 20 69  nHit), the IDF i
20820 73 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  s ..        ** n
20830 65 67 61 74 69 76 65 2e 20 57 68 69 63 68 20 69  egative. Which i
20840 73 20 75 6e 64 65 73 69 72 61 62 6c 65 2e 20 53  s undesirable. S
20850 6f 20 74 68 65 20 6d 69 6d 69 6d 75 6d 20 61 6c  o the mimimum al
20860 6c 6f 77 61 62 6c 65 20 49 44 46 20 69 73 0d 0a  lowable IDF is..
20870 20 20 20 20 20 20 20 20 2a 2a 20 28 31 65 2d 36          ** (1e-6
20880 29 20 2d 20 72 6f 75 67 68 6c 79 20 74 68 65 20  ) - roughly the 
20890 73 61 6d 65 20 61 73 20 61 20 74 65 72 6d 20 74  same as a term t
208a0 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 6a  hat appears in j
208b0 75 73 74 20 6f 76 65 72 0d 0a 20 20 20 20 20 20  ust over..      
208c0 20 20 2a 2a 20 68 61 6c 66 20 6f 66 20 73 65 74    ** half of set
208d0 20 6f 66 20 35 2c 30 30 30 2c 30 30 30 20 64 6f   of 5,000,000 do
208e0 63 75 6d 65 6e 74 73 2e 20 20 2a 2f 0d 0a 20 20  cuments.  */..  
208f0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 69 64 66        double idf
20900 20 3d 20 6c 6f 67 28 20 28 6e 52 6f 77 20 2d 20   = log( (nRow - 
20910 6e 48 69 74 20 2b 20 30 2e 35 29 20 2f 20 28 6e  nHit + 0.5) / (n
20920 48 69 74 20 2b 20 30 2e 35 29 20 29 3b 0d 0a 20  Hit + 0.5) );.. 
20930 20 20 20 20 20 20 20 69 66 28 20 69 64 66 3c 3d         if( idf<=
20940 30 2e 30 20 29 20 69 64 66 20 3d 20 31 65 2d 36  0.0 ) idf = 1e-6
20950 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 49  ;..        p->aI
20960 44 46 5b 69 5d 20 3d 20 69 64 66 3b 0d 0a 20 20  DF[i] = idf;..  
20970 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
20980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20990 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
209a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
209b0 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  ..    }else{..  
209c0 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
209d0 53 65 74 41 75 78 64 61 74 61 28 70 46 74 73 2c  SetAuxdata(pFts,
209e0 20 70 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   p, sqlite3_free
209f0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  );..    }..    i
20a00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20a10 20 29 20 70 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a   ) p = 0;..  }..
20a20 20 20 2a 70 70 44 61 74 61 20 3d 20 70 3b 0d 0a    *ppData = p;..
20a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
20a40 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d  .../*..** Implem
20a50 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6d 32 35  entation of bm25
20a60 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f  () function...*/
20a70 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
20a80 73 35 42 6d 32 35 46 75 6e 63 74 69 6f 6e 28 0d  s5Bm25Function(.
20a90 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74  .  const Fts5Ext
20aa0 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c  ensionApi *pApi,
20ab0 20 20 20 2f 2a 20 41 50 49 20 6f 66 66 65 72 65     /* API offere
20ac0 64 20 62 79 20 63 75 72 72 65 6e 74 20 46 54 53  d by current FTS
20ad0 20 76 65 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46   version */..  F
20ae0 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73  ts5Context *pFts
20af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20b00 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70  * First arg to p
20b10 61 73 73 20 74 6f 20 70 41 70 69 20 66 75 6e 63  ass to pApi func
20b20 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 73 71 6c 69  tions */..  sqli
20b30 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
20b40 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x,          /* C
20b50 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 74 75 72  ontext for retur
20b60 6e 69 6e 67 20 72 65 73 75 6c 74 2f 65 72 72 6f  ning result/erro
20b70 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 56 61 6c  r */..  int nVal
20b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20ba0 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 61  r of values in a
20bb0 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0d  pVal[] array */.
20bc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
20bd0 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
20be0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
20bf0 72 61 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74  railing argument
20c00 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73  s */..){..  cons
20c10 74 20 64 6f 75 62 6c 65 20 6b 31 20 3d 20 31 2e  t double k1 = 1.
20c20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  2;          /* C
20c30 6f 6e 73 74 61 6e 74 20 22 6b 31 22 20 66 72 6f  onstant "k1" fro
20c40 6d 20 42 4d 32 35 20 66 6f 72 6d 75 6c 61 20 2a  m BM25 formula *
20c50 2f 0d 0a 20 20 63 6f 6e 73 74 20 64 6f 75 62 6c  /..  const doubl
20c60 65 20 62 20 3d 20 30 2e 37 35 3b 20 20 20 20 20  e b = 0.75;     
20c70 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74       /* Constant
20c80 20 22 62 22 20 66 72 6f 6d 20 42 4d 32 35 20 66   "b" from BM25 f
20c90 6f 72 6d 75 6c 61 20 2a 2f 0d 0a 20 20 69 6e 74  ormula */..  int
20ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cc0 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 20  Error code */.. 
20cd0 20 64 6f 75 62 6c 65 20 73 63 6f 72 65 20 3d 20   double score = 
20ce0 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  0.0;            
20cf0 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
20d00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
20d10 0d 0a 20 20 46 74 73 35 42 6d 32 35 44 61 74 61  ..  Fts5Bm25Data
20d20 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
20d30 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 61 6c      /* Values al
20d40 6c 6f 63 61 74 65 64 2f 63 61 6c 63 75 6c 61 74  located/calculat
20d50 65 64 20 6f 6e 63 65 20 6f 6e 6c 79 20 2a 2f 0d  ed once only */.
20d60 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
20d90 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 69 6e  ariable */..  in
20da0 74 20 6e 49 6e 73 74 20 3d 20 30 3b 20 20 20 20  t nInst = 0;    
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20dc0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
20dd0 62 79 20 78 49 6e 73 74 43 6f 75 6e 74 28 29 20  by xInstCount() 
20de0 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 44 20 3d  */..  double D =
20df0 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20 20   0.0;           
20e00 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
20e10 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
20e20 69 6e 20 72 6f 77 20 2a 2f 0d 0a 20 20 64 6f 75  in row */..  dou
20e30 62 6c 65 20 2a 61 46 72 65 71 20 3d 20 30 3b 20  ble *aFreq = 0; 
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e50 41 72 72 61 79 20 6f 66 20 70 68 72 61 73 65 20  Array of phrase 
20e60 66 72 65 71 2e 20 66 6f 72 20 63 75 72 72 65 6e  freq. for curren
20e70 74 20 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a  t row */....  /*
20e80 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70   Calculate the p
20e90 68 72 61 73 65 20 66 72 65 71 75 65 6e 63 79 20  hrase frequency 
20ea0 28 73 79 6d 62 6f 6c 20 22 66 28 71 69 2c 44 29  (symbol "f(qi,D)
20eb0 22 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  " in the documen
20ec0 74 61 74 69 6f 6e 29 0d 0a 20 20 2a 2a 20 66 6f  tation)..  ** fo
20ed0 72 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  r each phrase in
20ee0 20 74 68 65 20 71 75 65 72 79 20 66 6f 72 20 74   the query for t
20ef0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
20f00 2a 2f 0d 0a 20 20 72 63 20 3d 20 66 74 73 35 42  */..  rc = fts5B
20f10 6d 32 35 47 65 74 44 61 74 61 28 70 41 70 69 2c  m25GetData(pApi,
20f20 20 70 46 74 73 2c 20 26 70 44 61 74 61 29 3b 0d   pFts, &pData);.
20f30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20f40 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 61 46 72  E_OK ){..    aFr
20f50 65 71 20 3d 20 70 44 61 74 61 2d 3e 61 46 72 65  eq = pData->aFre
20f60 71 3b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  q;..    memset(a
20f70 46 72 65 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Freq, 0, sizeof(
20f80 64 6f 75 62 6c 65 29 20 2a 20 70 44 61 74 61 2d  double) * pData-
20f90 3e 6e 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20  >nPhrase);..    
20fa0 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74  rc = pApi->xInst
20fb0 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e 49 6e  Count(pFts, &nIn
20fc0 73 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 66 6f 72  st);..  }..  for
20fd0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
20fe0 5f 4f 4b 20 26 26 20 69 3c 6e 49 6e 73 74 3b 20  _OK && i<nInst; 
20ff0 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69  i++){..    int i
21000 70 3b 20 69 6e 74 20 69 63 3b 20 69 6e 74 20 69  p; int ic; int i
21010 6f 3b 0d 0a 20 20 20 20 72 63 20 3d 20 70 41 70  o;..    rc = pAp
21020 69 2d 3e 78 49 6e 73 74 28 70 46 74 73 2c 20 69  i->xInst(pFts, i
21030 2c 20 26 69 70 2c 20 26 69 63 2c 20 26 69 6f 29  , &ip, &ic, &io)
21040 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
21050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
21060 20 20 20 64 6f 75 62 6c 65 20 77 20 3d 20 28 6e     double w = (n
21070 56 61 6c 20 3e 20 69 63 29 20 3f 20 73 71 6c 69  Val > ic) ? sqli
21080 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
21090 28 61 70 56 61 6c 5b 69 63 5d 29 20 3a 20 31 2e  (apVal[ic]) : 1.
210a0 30 3b 0d 0a 20 20 20 20 20 20 61 46 72 65 71 5b  0;..      aFreq[
210b0 69 70 5d 20 2b 3d 20 77 3b 0d 0a 20 20 20 20 7d  ip] += w;..    }
210c0 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46 69  ..  }....  /* Fi
210d0 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 6f 74  gure out the tot
210e0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  al size of the c
210f0 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 6f  urrent row in to
21100 6b 65 6e 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20  kens. */..  if( 
21110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21120 0d 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 3b 0d  ..    int nTok;.
21130 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e  .    rc = pApi->
21140 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73  xColumnSize(pFts
21150 2c 20 2d 31 2c 20 26 6e 54 6f 6b 29 3b 0d 0a 20  , -1, &nTok);.. 
21160 20 20 20 44 20 3d 20 28 64 6f 75 62 6c 65 29 6e     D = (double)n
21170 54 6f 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f  Tok;..  }....  /
21180 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
21190 42 4d 32 35 20 73 63 6f 72 65 20 66 6f 72 20 74  BM25 score for t
211a0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
211b0 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */..  for(i=0; r
211c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
211d0 69 3c 70 44 61 74 61 2d 3e 6e 50 68 72 61 73 65  i<pData->nPhrase
211e0 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 73 63 6f  ; i++){..    sco
211f0 72 65 20 2b 3d 20 70 44 61 74 61 2d 3e 61 49 44  re += pData->aID
21200 46 5b 69 5d 20 2a 20 28 0d 0a 20 20 20 20 20 20  F[i] * (..      
21210 28 20 61 46 72 65 71 5b 69 5d 20 2a 20 28 6b 31  ( aFreq[i] * (k1
21220 20 2b 20 31 2e 30 29 20 29 20 2f 20 0d 0a 20 20   + 1.0) ) / ..  
21230 20 20 20 20 28 20 61 46 72 65 71 5b 69 5d 20 2b      ( aFreq[i] +
21240 20 6b 31 20 2a 20 28 31 20 2d 20 62 20 2b 20 62   k1 * (1 - b + b
21250 20 2a 20 44 20 2f 20 70 44 61 74 61 2d 3e 61 76   * D / pData->av
21260 67 64 6c 29 20 29 0d 0a 20 20 20 20 29 3b 0d 0a  gdl) )..    );..
21270 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 49 66    }..  ..  /* If
21280 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
21290 63 75 72 72 65 64 2c 20 72 65 74 75 72 6e 20 74  curred, return t
212a0 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 73 63  he calculated sc
212b0 6f 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0d  ore. Otherwise,.
212c0 0a 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53  .  ** throw an S
212d0 51 4c 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a  QL exception.  *
212e0 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  /..  if( rc==SQL
212f0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73  ITE_OK ){..    s
21300 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
21310 75 62 6c 65 28 70 43 74 78 2c 20 2d 31 2e 30 20  uble(pCtx, -1.0 
21320 2a 20 73 63 6f 72 65 29 3b 0d 0a 20 20 7d 65 6c  * score);..  }el
21330 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  se{..    sqlite3
21340 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
21350 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0d 0a 20  de(pCtx, rc);.. 
21360 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20   }..}....static 
21370 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 41  int sqlite3Fts5A
21380 75 78 49 6e 69 74 28 66 74 73 35 5f 61 70 69 20  uxInit(fts5_api 
21390 2a 70 41 70 69 29 7b 0d 0a 20 20 73 74 72 75 63  *pApi){..  struc
213a0 74 20 42 75 69 6c 74 69 6e 20 7b 0d 0a 20 20 20  t Builtin {..   
213b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
213c0 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc;            /
213d0 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  * Function name 
213e0 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29  (nul-terminated)
213f0 20 2a 2f 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70   */..    void *p
21400 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20 20  UserData;       
21410 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 2d 64         /* User-d
21420 61 74 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a  ata pointer */..
21430 20 20 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69      fts5_extensi
21440 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e  on_function xFun
21450 63 3b 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  c;/* Callback fu
21460 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 76  nction */..    v
21470 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
21480 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 2f 2a 20  void*);      /* 
21490 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  Destructor funct
214a0 69 6f 6e 20 2a 2f 0d 0a 20 20 7d 20 61 42 75 69  ion */..  } aBui
214b0 6c 74 69 6e 20 5b 5d 20 3d 20 7b 0d 0a 20 20 20  ltin [] = {..   
214c0 20 7b 20 22 73 6e 69 70 70 65 74 22 2c 20 20 20   { "snippet",   
214d0 30 2c 20 66 74 73 35 53 6e 69 70 70 65 74 46 75  0, fts5SnippetFu
214e0 6e 63 74 69 6f 6e 2c 20 30 20 7d 2c 0d 0a 20 20  nction, 0 },..  
214f0 20 20 7b 20 22 68 69 67 68 6c 69 67 68 74 22 2c    { "highlight",
21500 20 30 2c 20 66 74 73 35 48 69 67 68 6c 69 67 68   0, fts5Highligh
21510 74 46 75 6e 63 74 69 6f 6e 2c 20 30 20 7d 2c 0d  tFunction, 0 },.
21520 0a 20 20 20 20 7b 20 22 62 6d 32 35 22 2c 20 20  .    { "bm25",  
21530 20 20 20 20 30 2c 20 66 74 73 35 42 6d 32 35 46      0, fts5Bm25F
21540 75 6e 63 74 69 6f 6e 2c 20 20 20 20 30 20 7d 2c  unction,    0 },
21550 0d 0a 20 20 7d 3b 0d 0a 20 20 69 6e 74 20 72 63  ..  };..  int rc
21560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21580 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69  urn code */..  i
21590 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215b0 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
215c0 6f 75 67 68 20 62 75 69 6c 74 69 6e 20 66 75 6e  ough builtin fun
215d0 63 74 69 6f 6e 73 20 2a 2f 0d 0a 0d 0a 20 20 66  ctions */....  f
215e0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
215f0 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72 61 79  TE_OK && i<Array
21600 53 69 7a 65 28 61 42 75 69 6c 74 69 6e 29 3b 20  Size(aBuiltin); 
21610 69 2b 2b 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  i++){..    rc = 
21620 70 41 70 69 2d 3e 78 43 72 65 61 74 65 46 75 6e  pApi->xCreateFun
21630 63 74 69 6f 6e 28 70 41 70 69 2c 0d 0a 20 20 20  ction(pApi,..   
21640 20 20 20 20 20 61 42 75 69 6c 74 69 6e 5b 69 5d       aBuiltin[i]
21650 2e 7a 46 75 6e 63 2c 0d 0a 20 20 20 20 20 20 20  .zFunc,..       
21660 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 70 55 73   aBuiltin[i].pUs
21670 65 72 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  erData,..       
21680 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 46 75   aBuiltin[i].xFu
21690 6e 63 2c 0d 0a 20 20 20 20 20 20 20 20 61 42 75  nc,..        aBu
216a0 69 6c 74 69 6e 5b 69 5d 2e 78 44 65 73 74 72 6f  iltin[i].xDestro
216b0 79 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 7d 0d 0a  y..    );..  }..
216c0 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
216d0 7d 0d 0a 0d 0a 0d 0a 0d 0a 23 6c 69 6e 65 20 31  }........#line 1
216e0 20 22 66 74 73 35 5f 62 75 66 66 65 72 2e 63 22   "fts5_buffer.c"
216f0 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 34 20 4d 61  ../*..** 2014 Ma
21700 79 20 33 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  y 31..**..** The
21710 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
21720 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
21730 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
21740 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a    In place of..*
21750 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
21760 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
21770 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  sing:..**..**   
21780 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
21790 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a   and not evil...
217a0 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  **    May you fi
217b0 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
217c0 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
217d0 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d  forgive others..
217e0 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73  .**    May you s
217f0 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
21800 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
21810 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a  han you give...*
21820 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *..*************
21830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21870 2a 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20  *..*/......../* 
21880 23 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e  #include "fts5In
21890 74 2e 68 22 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69  t.h" */....stati
218a0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
218b0 35 42 75 66 66 65 72 53 69 7a 65 28 69 6e 74 20  5BufferSize(int 
218c0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
218d0 20 2a 70 42 75 66 2c 20 75 33 32 20 6e 42 79 74   *pBuf, u32 nByt
218e0 65 29 7b 0d 0a 20 20 69 66 28 20 28 75 33 32 29  e){..  if( (u32)
218f0 70 42 75 66 2d 3e 6e 53 70 61 63 65 3c 6e 42 79  pBuf->nSpace<nBy
21900 74 65 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 6e  te ){..    u32 n
21910 4e 65 77 20 3d 20 70 42 75 66 2d 3e 6e 53 70 61  New = pBuf->nSpa
21920 63 65 20 3f 20 70 42 75 66 2d 3e 6e 53 70 61 63  ce ? pBuf->nSpac
21930 65 20 3a 20 36 34 3b 0d 0a 20 20 20 20 75 38 20  e : 64;..    u8 
21940 2a 70 4e 65 77 3b 0d 0a 20 20 20 20 77 68 69 6c  *pNew;..    whil
21950 65 28 20 6e 4e 65 77 3c 6e 42 79 74 65 20 29 7b  e( nNew<nByte ){
21960 0d 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6e  ..      nNew = n
21970 4e 65 77 20 2a 20 32 3b 0d 0a 20 20 20 20 7d 0d  New * 2;..    }.
21980 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
21990 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42 75 66  te3_realloc(pBuf
219a0 2d 3e 70 2c 20 6e 4e 65 77 29 3b 0d 0a 20 20 20  ->p, nNew);..   
219b0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0d   if( pNew==0 ){.
219c0 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
219d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
219e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
219f0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
21a00 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 3d 20 6e  pBuf->nSpace = n
21a10 4e 65 77 3b 0d 0a 20 20 20 20 20 20 70 42 75 66  New;..      pBuf
21a20 2d 3e 70 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20  ->p = pNew;..   
21a30 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72   }..  }..  retur
21a40 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d  n 0;..}....../*.
21a50 0a 2a 2a 20 45 6e 63 6f 64 65 20 76 61 6c 75 65  .** Encode value
21a60 20 69 56 61 6c 20 61 73 20 61 6e 20 53 51 4c 69   iVal as an SQLi
21a70 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  te varint and ap
21a80 70 65 6e 64 20 69 74 20 74 6f 20 74 68 65 20 62  pend it to the b
21a90 75 66 66 65 72 20 6f 62 6a 65 63 74 0d 0a 2a 2a  uffer object..**
21aa0 20 70 42 75 66 2e 20 49 66 20 61 6e 20 4f 4f 4d   pBuf. If an OOM
21ab0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
21ac0 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
21ad0 65 20 69 6e 20 70 2e 0d 0a 2a 2f 0d 0a 73 74 61  e in p...*/..sta
21ae0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
21af0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
21b00 56 61 72 69 6e 74 28 69 6e 74 20 2a 70 52 63 2c  Varint(int *pRc,
21b10 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
21b20 66 2c 20 69 36 34 20 69 56 61 6c 29 7b 0d 0a 20  f, i64 iVal){.. 
21b30 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72 47   if( fts5BufferG
21b40 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20 39  row(pRc, pBuf, 9
21b50 29 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 70  ) ) return;..  p
21b60 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
21b70 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
21b80 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
21b90 2c 20 69 56 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 73  , iVal);..}....s
21ba0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
21bb0 65 33 46 74 73 35 50 75 74 33 32 28 75 38 20 2a  e3Fts5Put32(u8 *
21bc0 61 42 75 66 2c 20 69 6e 74 20 69 56 61 6c 29 7b  aBuf, int iVal){
21bd0 0d 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69  ..  aBuf[0] = (i
21be0 56 61 6c 3e 3e 32 34 29 20 26 20 30 78 30 30 46  Val>>24) & 0x00F
21bf0 46 3b 0d 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20  F;..  aBuf[1] = 
21c00 28 69 56 61 6c 3e 3e 31 36 29 20 26 20 30 78 30  (iVal>>16) & 0x0
21c10 30 46 46 3b 0d 0a 20 20 61 42 75 66 5b 32 5d 20  0FF;..  aBuf[2] 
21c20 3d 20 28 69 56 61 6c 3e 3e 20 38 29 20 26 20 30  = (iVal>> 8) & 0
21c30 78 30 30 46 46 3b 0d 0a 20 20 61 42 75 66 5b 33  x00FF;..  aBuf[3
21c40 5d 20 3d 20 28 69 56 61 6c 3e 3e 20 30 29 20 26  ] = (iVal>> 0) &
21c50 20 30 78 30 30 46 46 3b 0d 0a 7d 0d 0a 0d 0a 73   0x00FF;..}....s
21c60 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
21c70 33 46 74 73 35 47 65 74 33 32 28 63 6f 6e 73 74  3Fts5Get32(const
21c80 20 75 38 20 2a 61 42 75 66 29 7b 0d 0a 20 20 72   u8 *aBuf){..  r
21c90 65 74 75 72 6e 20 28 61 42 75 66 5b 30 5d 20 3c  eturn (aBuf[0] <
21ca0 3c 20 32 34 29 20 2b 20 28 61 42 75 66 5b 31 5d  < 24) + (aBuf[1]
21cb0 20 3c 3c 20 31 36 29 20 2b 20 28 61 42 75 66 5b   << 16) + (aBuf[
21cc0 32 5d 20 3c 3c 20 38 29 20 2b 20 61 42 75 66 5b  2] << 8) + aBuf[
21cd0 33 5d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  3];..}..../*..**
21ce0 20 41 70 70 65 6e 64 20 62 75 66 66 65 72 20 6e   Append buffer n
21cf0 44 61 74 61 2f 70 44 61 74 61 20 74 6f 20 62 75  Data/pData to bu
21d00 66 66 65 72 20 70 42 75 66 2e 20 49 66 20 61 6e  ffer pBuf. If an
21d10 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
21d20 73 2c 20 73 65 74 20 0d 0a 2a 2a 20 74 68 65 20  s, set ..** the 
21d30 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e  error code in p.
21d40 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
21d50 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
21d60 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
21d70 74 69 6f 6e 0d 0a 2a 2a 20 69 73 20 63 61 6c 6c  tion..** is call
21d80 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
21d90 70 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  p...*/..static v
21da0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
21db0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
21dc0 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20  ..  int *pRc,.. 
21dd0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
21de0 66 2c 20 0d 0a 20 20 75 33 32 20 6e 44 61 74 61  f, ..  u32 nData
21df0 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  , ..  const u8 *
21e00 70 44 61 74 61 0d 0a 29 7b 0d 0a 20 20 61 73 73  pData..){..  ass
21e10 65 72 74 5f 6e 63 28 20 2a 70 52 63 20 7c 7c 20  ert_nc( *pRc || 
21e20 6e 44 61 74 61 3e 3d 30 20 29 3b 0d 0a 20 20 69  nData>=0 );..  i
21e30 66 28 20 6e 44 61 74 61 20 29 7b 0d 0a 20 20 20  f( nData ){..   
21e40 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72 47   if( fts5BufferG
21e50 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20 6e  row(pRc, pBuf, n
21e60 44 61 74 61 29 20 29 20 72 65 74 75 72 6e 3b 0d  Data) ) return;.
21e70 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 75  .    memcpy(&pBu
21e80 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70  f->p[pBuf->n], p
21e90 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0d 0a 20  Data, nData);.. 
21ea0 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 44     pBuf->n += nD
21eb0 61 74 61 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  ata;..  }..}....
21ec0 2f 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  /*..** Append th
21ed0 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
21ee0 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20   string zStr to 
21ef0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
21f00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a   This function..
21f10 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ** ensures that 
21f20 74 68 65 20 62 79 74 65 20 66 6f 6c 6c 6f 77 69  the byte followi
21f30 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 64 61  ng the buffer da
21f40 74 61 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  ta is set to 0x0
21f50 30 2c 20 65 76 65 6e 20 0d 0a 2a 2a 20 74 68 6f  0, even ..** tho
21f60 75 67 68 20 74 68 69 73 20 62 79 74 65 20 69 73  ugh this byte is
21f70 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e   not included in
21f80 20 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75   the pBuf->n cou
21f90 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  nt...*/..static 
21fa0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
21fb0 42 75 66 66 65 72 41 70 70 65 6e 64 53 74 72 69  BufferAppendStri
21fc0 6e 67 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ng(..  int *pRc,
21fd0 0d 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ..  Fts5Buffer *
21fe0 70 42 75 66 2c 20 0d 0a 20 20 63 6f 6e 73 74 20  pBuf, ..  const 
21ff0 63 68 61 72 20 2a 7a 53 74 72 0d 0a 29 7b 0d 0a  char *zStr..){..
22000 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 69 6e    int nStr = (in
22010 74 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0d  t)strlen(zStr);.
22020 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
22030 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70  fferAppendBlob(p
22040 52 63 2c 20 70 42 75 66 2c 20 6e 53 74 72 2b 31  Rc, pBuf, nStr+1
22050 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 53 74  , (const u8*)zSt
22060 72 29 3b 0d 0a 20 20 70 42 75 66 2d 3e 6e 2d 2d  r);..  pBuf->n--
22070 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  ;..}..../*..** A
22080 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
22090 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65  a printf() style
220a0 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
220b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
220c0 72 66 6f 72 6d 73 0d 0a 2a 2a 20 74 68 65 20 70  rforms..** the p
220d0 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 70 72  rintf() style pr
220e0 6f 63 65 73 73 69 6e 67 2c 20 74 68 65 6e 20 61  ocessing, then a
220f0 70 70 65 6e 64 73 20 74 68 65 20 72 65 73 75 6c  ppends the resul
22100 74 73 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  ts to buffer pBu
22110 66 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4c 69 6b 65 20  f...**..** Like 
22120 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
22130 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 29 2c  rAppendString(),
22140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   this function e
22150 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
22160 62 79 74 65 20 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77  byte ..** follow
22170 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 64  ing the buffer d
22180 61 74 61 20 69 73 20 73 65 74 20 74 6f 20 30 78  ata is set to 0x
22190 30 30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  00, even though 
221a0 74 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  this byte is not
221b0 0d 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e  ..** included in
221c0 20 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75   the pBuf->n cou
221d0 6e 74 2e 0d 0a 2a 2f 20 0d 0a 73 74 61 74 69 63  nt...*/ ..static
221e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
221f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
22200 6e 74 66 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63  ntf(..  int *pRc
22210 2c 0d 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ,..  Fts5Buffer 
22220 2a 70 42 75 66 2c 20 0d 0a 20 20 63 68 61 72 20  *pBuf, ..  char 
22230 2a 7a 46 6d 74 2c 20 2e 2e 2e 0d 0a 29 7b 0d 0a  *zFmt, .....){..
22240 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
22250 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 63 68  TE_OK ){..    ch
22260 61 72 20 2a 7a 54 6d 70 3b 0d 0a 20 20 20 20 76  ar *zTmp;..    v
22270 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20 20 20  a_list ap;..    
22280 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
22290 74 29 3b 0d 0a 20 20 20 20 7a 54 6d 70 20 3d 20  t);..    zTmp = 
222a0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
222b0 28 7a 46 6d 74 2c 20 61 70 29 3b 0d 0a 20 20 20  (zFmt, ap);..   
222c0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 0d 0a   va_end(ap);....
222d0 20 20 20 20 69 66 28 20 7a 54 6d 70 3d 3d 30 20      if( zTmp==0 
222e0 29 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  ){..      *pRc =
222f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a   SQLITE_NOMEM;..
22300 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
22310 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
22320 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28  ferAppendString(
22330 70 52 63 2c 20 70 42 75 66 2c 20 7a 54 6d 70 29  pRc, pBuf, zTmp)
22340 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
22350 5f 66 72 65 65 28 7a 54 6d 70 29 3b 0d 0a 20 20  _free(zTmp);..  
22360 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73    }..  }..}....s
22370 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69  tatic char *sqli
22380 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 69  te3Fts5Mprintf(i
22390 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63  nt *pRc, const c
223a0 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
223b0 0d 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  ..  char *zRet =
223c0 20 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63 3d   0;..  if( *pRc=
223d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
223e0 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a     va_list ap;..
223f0 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
22400 20 7a 46 6d 74 29 3b 0d 0a 20 20 20 20 7a 52 65   zFmt);..    zRe
22410 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  t = sqlite3_vmpr
22420 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0d  intf(zFmt, ap);.
22430 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
22440 0d 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d  ..    if( zRet==
22450 30 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63  0 ){..      *pRc
22460 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22470 20 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20   ..    }..  }.. 
22480 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a 7d   return zRet;..}
22490 0d 0a 20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72  .. ..../*..** Fr
224a0 65 65 20 61 6e 79 20 62 75 66 66 65 72 20 61 6c  ee any buffer al
224b0 6c 6f 63 61 74 65 64 20 62 79 20 70 42 75 66 2e  located by pBuf.
224c0 20 5a 65 72 6f 20 74 68 65 20 73 74 72 75 63 74   Zero the struct
224d0 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
224e0 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ning...*/..stati
224f0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
22500 73 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73  s5BufferFree(Fts
22510 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0d  5Buffer *pBuf){.
22520 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22530 70 42 75 66 2d 3e 70 29 3b 0d 0a 20 20 6d 65 6d  pBuf->p);..  mem
22540 73 65 74 28 70 42 75 66 2c 20 30 2c 20 73 69 7a  set(pBuf, 0, siz
22550 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
22560 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 5a  ;..}..../*..** Z
22570 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
22580 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6f   of the buffer o
22590 62 6a 65 63 74 2e 20 42 75 74 20 64 6f 20 6e 6f  bject. But do no
225a0 74 20 66 72 65 65 20 74 68 65 20 61 73 73 6f 63  t free the assoc
225b0 69 61 74 65 64 20 0d 0a 2a 2a 20 6d 65 6d 6f 72  iated ..** memor
225c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a  y allocation...*
225d0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
225e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
225f0 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 20  Zero(Fts5Buffer 
22600 2a 70 42 75 66 29 7b 0d 0a 20 20 70 42 75 66 2d  *pBuf){..  pBuf-
22610 3e 6e 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  >n = 0;..}..../*
22620 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 66  ..** Set the buf
22630 66 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6e  fer to contain n
22640 44 61 74 61 2f 70 44 61 74 61 2e 20 49 66 20 61  Data/pData. If a
22650 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
22660 72 73 2c 20 6c 65 61 76 65 20 61 6e 0d 0a 2a 2a  rs, leave an..**
22670 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
22680 69 6e 20 70 2e 20 49 66 20 61 6e 20 65 72 72 6f  in p. If an erro
22690 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
226a0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
226b0 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 69 73   function..** is
226c0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
226d0 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 74 61   no-op...*/..sta
226e0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
226f0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 0d 0a  Fts5BufferSet(..
22700 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20 20 46    int *pRc,..  F
22710 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
22720 20 0d 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20   ..  int nData, 
22730 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  ..  const u8 *pD
22740 61 74 61 0d 0a 29 7b 0d 0a 20 20 70 42 75 66 2d  ata..){..  pBuf-
22750 3e 6e 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74  >n = 0;..  sqlit
22760 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
22770 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66  ndBlob(pRc, pBuf
22780 2c 20 6e 44 61 74 61 2c 20 70 44 61 74 61 29 3b  , nData, pData);
22790 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  ..}....static in
227a0 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
227b0 6c 69 73 74 4e 65 78 74 36 34 28 0d 0a 20 20 63  listNext64(..  c
227c0 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
227d0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
227e0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
227f0 69 6e 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0d 0a  ing poslist */..
22800 20 20 69 6e 74 20 2a 70 69 2c 20 20 20 20 20 20    int *pi,      
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66    /* IN/OUT: Off
22830 73 65 74 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a  set within a[] *
22840 2f 0d 0a 20 20 69 36 34 20 2a 70 69 4f 66 66 20  /..  i64 *piOff 
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
22870 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 2a  Current offset *
22880 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 20 3d  /..){..  int i =
22890 20 2a 70 69 3b 0d 0a 20 20 69 66 28 20 69 3e 3d   *pi;..  if( i>=
228a0 6e 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 45 4f 46  n ){..    /* EOF
228b0 20 2a 2f 0d 0a 20 20 20 20 2a 70 69 4f 66 66 20   */..    *piOff 
228c0 3d 20 2d 31 3b 0d 0a 20 20 20 20 72 65 74 75 72  = -1;..    retur
228d0 6e 20 31 3b 20 20 0d 0a 20 20 7d 65 6c 73 65 7b  n 1;  ..  }else{
228e0 0d 0a 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d  ..    i64 iOff =
228f0 20 2a 70 69 4f 66 66 3b 0d 0a 20 20 20 20 69 6e   *piOff;..    in
22900 74 20 69 56 61 6c 3b 0d 0a 20 20 20 20 66 74 73  t iVal;..    fts
22910 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
22920 28 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0d 0a 20  (a, i, iVal);.. 
22930 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29     if( iVal==1 )
22940 7b 0d 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  {..      fts5Fas
22950 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
22960 69 2c 20 69 56 61 6c 29 3b 0d 0a 20 20 20 20 20  i, iVal);..     
22970 20 69 4f 66 66 20 3d 20 28 28 69 36 34 29 69 56   iOff = ((i64)iV
22980 61 6c 29 20 3c 3c 20 33 32 3b 0d 0a 20 20 20 20  al) << 32;..    
22990 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
229a0 69 6e 74 33 32 28 61 2c 20 69 2c 20 69 56 61 6c  int32(a, i, iVal
229b0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 2a  );..    }..    *
229c0 70 69 4f 66 66 20 3d 20 69 4f 66 66 20 2b 20 28  piOff = iOff + (
229d0 69 56 61 6c 2d 32 29 3b 0d 0a 20 20 20 20 2a 70  iVal-2);..    *p
229e0 69 20 3d 20 69 3b 0d 0a 20 20 20 20 72 65 74 75  i = i;..    retu
229f0 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  rn 0;..  }..}...
22a00 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63  .../*..** Advanc
22a10 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
22a20 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
22a30 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
22a40 74 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0d 0a  t. Return true..
22a50 2a 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ** if the iterat
22a60 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
22a70 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
22a80 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  se...*/..static 
22a90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
22aa0 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
22ab0 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  (Fts5PoslistRead
22ac0 65 72 20 2a 70 49 74 65 72 29 7b 0d 0a 20 20 69  er *pIter){..  i
22ad0 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  f( sqlite3Fts5Po
22ae0 73 6c 69 73 74 4e 65 78 74 36 34 28 70 49 74 65  slistNext64(pIte
22af0 72 2d 3e 61 2c 20 70 49 74 65 72 2d 3e 6e 2c 20  r->a, pIter->n, 
22b00 26 70 49 74 65 72 2d 3e 69 2c 20 26 70 49 74 65  &pIter->i, &pIte
22b10 72 2d 3e 69 50 6f 73 29 20 29 7b 0d 0a 20 20 20  r->iPos) ){..   
22b20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
22b30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
22b40 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0d 0a 7d   pIter->bEof;..}
22b50 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
22b60 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
22b70 74 52 65 61 64 65 72 49 6e 69 74 28 0d 0a 20 20  tReaderInit(..  
22b80 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
22b90 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
22ba0 2f 2a 20 50 6f 73 6c 69 73 74 20 62 75 66 66 65  /* Poslist buffe
22bb0 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
22bc0 6f 75 67 68 20 2a 2f 0d 0a 20 20 46 74 73 35 50  ough */..  Fts5P
22bd0 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70 49  oslistReader *pI
22be0 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ter        /* It
22bf0 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f  erator object to
22c00 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a   initialize */..
22c10 29 7b 0d 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  ){..  memset(pIt
22c20 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
22c30 49 74 65 72 29 29 3b 0d 0a 20 20 70 49 74 65 72  Iter));..  pIter
22c40 2d 3e 61 20 3d 20 61 3b 0d 0a 20 20 70 49 74 65  ->a = a;..  pIte
22c50 72 2d 3e 6e 20 3d 20 6e 3b 0d 0a 20 20 73 71 6c  r->n = n;..  sql
22c60 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
22c70 65 61 64 65 72 4e 65 78 74 28 70 49 74 65 72 29  eaderNext(pIter)
22c80 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ;..  return pIte
22c90 72 2d 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 2f  r->bEof;..}..../
22ca0 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 70 6f 73  *..** Append pos
22cb0 69 74 69 6f 6e 20 69 50 6f 73 20 74 6f 20 74 68  ition iPos to th
22cc0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
22cd0 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65  being accumulate
22ce0 64 20 69 6e 20 62 75 66 66 65 72 0d 0a 2a 2a 20  d in buffer..** 
22cf0 70 42 75 66 2c 20 77 68 69 63 68 20 6d 75 73 74  pBuf, which must
22d00 20 62 65 20 61 6c 72 65 61 64 79 20 62 65 20 6c   be already be l
22d10 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
22d20 6f 6c 64 20 74 68 65 20 6e 65 77 20 64 61 74 61  old the new data
22d30 2e 0d 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f  ...** The previo
22d40 75 73 20 70 6f 73 69 74 69 6f 6e 20 77 72 69 74  us position writ
22d50 74 65 6e 20 74 6f 20 74 68 69 73 20 6c 69 73 74  ten to this list
22d60 20 69 73 20 2a 70 69 50 72 65 76 2e 20 2a 70 69   is *piPrev. *pi
22d70 50 72 65 76 20 69 73 20 73 65 74 0d 0a 2a 2a 20  Prev is set..** 
22d80 74 6f 20 69 50 6f 73 20 62 65 66 6f 72 65 20 72  to iPos before r
22d90 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73  eturning...*/..s
22da0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
22db0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
22dc0 65 41 70 70 65 6e 64 28 0d 0a 20 20 46 74 73 35  eAppend(..  Fts5
22dd0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0d 0a  Buffer *pBuf, ..
22de0 20 20 69 36 34 20 2a 70 69 50 72 65 76 2c 20 0d    i64 *piPrev, .
22df0 0a 20 20 69 36 34 20 69 50 6f 73 0d 0a 29 7b 0d  .  i64 iPos..){.
22e00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
22e10 69 36 34 20 63 6f 6c 6d 61 73 6b 20 3d 20 28 28  i64 colmask = ((
22e20 69 36 34 29 28 30 78 37 46 46 46 46 46 46 46 29  i64)(0x7FFFFFFF)
22e30 29 20 3c 3c 20 33 32 3b 0d 0a 20 20 69 66 28 20  ) << 32;..  if( 
22e40 28 69 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b 29  (iPos & colmask)
22e50 20 21 3d 20 28 2a 70 69 50 72 65 76 20 26 20 63   != (*piPrev & c
22e60 6f 6c 6d 61 73 6b 29 20 29 7b 0d 0a 20 20 20 20  olmask) ){..    
22e70 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
22e80 2b 5d 20 3d 20 31 3b 0d 0a 20 20 20 20 70 42 75  +] = 1;..    pBu
22e90 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
22ea0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
22eb0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
22ec0 28 69 50 6f 73 3e 3e 33 32 29 29 3b 0d 0a 20 20  (iPos>>32));..  
22ed0 20 20 2a 70 69 50 72 65 76 20 3d 20 28 69 50 6f    *piPrev = (iPo
22ee0 73 20 26 20 63 6f 6c 6d 61 73 6b 29 3b 0d 0a 20  s & colmask);.. 
22ef0 20 7d 0d 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d   }..  pBuf->n +=
22f00 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
22f10 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
22f20 42 75 66 2d 3e 6e 5d 2c 20 28 69 50 6f 73 2d 2a  Buf->n], (iPos-*
22f30 70 69 50 72 65 76 29 2b 32 29 3b 0d 0a 20 20 2a  piPrev)+2);..  *
22f40 70 69 50 72 65 76 20 3d 20 69 50 6f 73 3b 0d 0a  piPrev = iPos;..
22f50 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
22f60 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
22f70 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0d  stWriterAppend(.
22f80 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
22f90 42 75 66 2c 20 0d 0a 20 20 46 74 73 35 50 6f 73  Buf, ..  Fts5Pos
22fa0 6c 69 73 74 57 72 69 74 65 72 20 2a 70 57 72 69  listWriter *pWri
22fb0 74 65 72 2c 0d 0a 20 20 69 36 34 20 69 50 6f 73  ter,..  i64 iPos
22fc0 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  ..){..  int rc =
22fd0 20 30 3b 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0;   /* Initial
22fe0 69 7a 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75 70  ized only to sup
22ff0 70 72 65 73 73 20 65 72 72 6f 6e 65 6f 75 73 20  press erroneous 
23000 77 61 72 6e 69 6e 67 20 66 72 6f 6d 20 43 6c 61  warning from Cla
23010 6e 67 20 2a 2f 0d 0a 20 20 69 66 28 20 66 74 73  ng */..  if( fts
23020 35 42 75 66 66 65 72 47 72 6f 77 28 26 72 63 2c  5BufferGrow(&rc,
23030 20 70 42 75 66 2c 20 35 2b 35 2b 35 29 20 29 20   pBuf, 5+5+5) ) 
23040 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 73 71  return rc;..  sq
23050 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
23060 53 61 66 65 41 70 70 65 6e 64 28 70 42 75 66 2c  SafeAppend(pBuf,
23070 20 26 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76   &pWriter->iPrev
23080 2c 20 69 50 6f 73 29 3b 0d 0a 20 20 72 65 74 75  , iPos);..  retu
23090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d  rn SQLITE_OK;..}
230a0 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
230b0 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  *sqlite3Fts5Mall
230c0 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c  ocZero(int *pRc,
230d0 20 69 6e 74 20 6e 42 79 74 65 29 7b 0d 0a 20 20   int nByte){..  
230e0 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0d  void *pRet = 0;.
230f0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
23100 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70  ITE_OK ){..    p
23110 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
23120 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0d 0a 20 20  lloc(nByte);..  
23130 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
23140 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74  ..      if( nByt
23150 65 3e 30 20 29 20 2a 70 52 63 20 3d 20 53 51 4c  e>0 ) *pRc = SQL
23160 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20  ITE_NOMEM;..    
23170 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65  }else{..      me
23180 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42  mset(pRet, 0, nB
23190 79 74 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  yte);..    }..  
231a0 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
231b0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52  ;..}..../*..** R
231c0 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
231d0 69 6e 61 74 65 64 20 63 6f 70 79 20 6f 66 20 74  inated copy of t
231e0 68 65 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  he string indica
231f0 74 65 64 20 62 79 20 70 49 6e 2e 20 49 66 20 6e  ted by pIn. If n
23200 49 6e 0d 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 6e 65  In..** is non-ne
23210 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
23220 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  is the length of
23230 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 62   the string in b
23240 79 74 65 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ytes. Otherwise,
23250 0d 0a 2a 2a 20 74 68 65 20 6c 65 6e 67 74 68 20  ..** the length 
23260 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  of the string is
23270 20 64 65 74 65 72 6d 69 6e 65 64 20 75 73 69 6e   determined usin
23280 67 20 73 74 72 6c 65 6e 28 29 2e 0d 0a 2a 2a 0d  g strlen()...**.
23290 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
232a0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
232b0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
232c0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
232d0 65 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a 20 62  e returned..** b
232e0 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
232f0 74 65 33 5f 66 72 65 65 28 29 2e 20 49 66 20 61  te3_free(). If a
23300 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
23310 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
23320 72 6e 65 64 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74  rned. ..*/..stat
23330 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  ic char *sqlite3
23340 46 74 73 35 53 74 72 6e 64 75 70 28 69 6e 74 20  Fts5Strndup(int 
23350 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
23360 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *pIn, int nIn){
23370 0d 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  ..  char *zRet =
23380 20 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63 3d   0;..  if( *pRc=
23390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
233a0 20 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 7b 0d     if( nIn<0 ){.
233b0 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 28 69 6e  .      nIn = (in
233c0 74 29 73 74 72 6c 65 6e 28 70 49 6e 29 3b 0d 0a  t)strlen(pIn);..
233d0 20 20 20 20 7d 0d 0a 20 20 20 20 7a 52 65 74 20      }..    zRet 
233e0 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
233f0 5f 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b 0d  _malloc(nIn+1);.
23400 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b  .    if( zRet ){
23410 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ..      memcpy(z
23420 52 65 74 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b 0d  Ret, pIn, nIn);.
23430 0a 20 20 20 20 20 20 7a 52 65 74 5b 6e 49 6e 5d  .      zRet[nIn]
23440 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 7d 65   = '\0';..    }e
23450 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63  lse{..      *pRc
23460 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23470 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20  ..    }..  }..  
23480 72 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a 7d 0d  return zRet;..}.
23490 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75  ...../*..** Retu
234a0 72 6e 20 74 72 75 65 20 69 66 20 63 68 61 72 61  rn true if chara
234b0 63 74 65 72 20 27 74 27 20 6d 61 79 20 62 65 20  cter 't' may be 
234c0 70 61 72 74 20 6f 66 20 61 6e 20 46 54 53 35 20  part of an FTS5 
234d0 62 61 72 65 77 6f 72 64 2c 20 6f 72 20 66 61 6c  bareword, or fal
234e0 73 65 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  se..** otherwise
234f0 2e 20 43 68 61 72 61 63 74 65 72 73 20 74 68 61  . Characters tha
23500 74 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f 66  t may be part of
23510 20 62 61 72 65 77 6f 72 64 73 3a 0d 0a 2a 2a 0d   barewords:..**.
23520 0a 2a 2a 20 20 20 2a 20 41 6c 6c 20 6e 6f 6e 2d  .**   * All non-
23530 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73  ASCII characters
23540 2c 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 35 32  ,..**   * The 52
23550 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
23560 20 63 61 73 65 20 41 53 43 49 49 20 63 68 61 72   case ASCII char
23570 61 63 74 65 72 73 2c 20 61 6e 64 0d 0a 2a 2a 20  acters, and..** 
23580 20 20 2a 20 54 68 65 20 31 30 20 69 6e 74 65 67    * The 10 integ
23590 65 72 20 41 53 43 49 49 20 63 68 61 72 61 63 74  er ASCII charact
235a0 65 72 73 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68 65  ers...**   * The
235b0 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72   underscore char
235c0 61 63 74 65 72 20 22 5f 22 20 28 30 78 35 46 29  acter "_" (0x5F)
235d0 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 75 6e  ...**   * The un
235e0 69 63 6f 64 65 20 22 73 75 62 73 69 74 75 74 65  icode "subsitute
235f0 22 20 63 68 61 72 61 63 74 65 72 20 28 30 78 31  " character (0x1
23600 41 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  A)...*/..static 
23610 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
23620 73 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74  sBareword(char t
23630 29 7b 0d 0a 20 20 75 38 20 61 42 61 72 65 77 6f  ){..  u8 aBarewo
23640 72 64 5b 31 32 38 5d 20 3d 20 7b 0d 0a 20 20 20  rd[128] = {..   
23650 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23660 30 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30  0, 0, 0,    0, 0
23670 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
23680 20 30 2c 20 20 20 2f 2a 20 30 78 30 30 20 2e 2e   0,   /* 0x00 ..
23690 20 30 78 30 46 20 2a 2f 0d 0a 20 20 20 20 30 2c   0x0F */..    0,
236a0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
236b0 30 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 31  0, 0,    0, 0, 1
236c0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
236d0 20 20 20 2f 2a 20 30 78 31 30 20 2e 2e 20 30 78     /* 0x10 .. 0x
236e0 31 46 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 30 2c  1F */..    0, 0,
236f0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23700 30 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  0,    0, 0, 0, 0
23710 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
23720 2f 2a 20 30 78 32 30 20 2e 2e 20 30 78 32 46 20  /* 0x20 .. 0x2F 
23730 2a 2f 0d 0a 20 20 20 20 31 2c 20 31 2c 20 31 2c  */..    1, 1, 1,
23740 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23750 20 20 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30     1, 1, 0, 0, 0
23760 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20  , 0, 0, 0,   /* 
23770 30 78 33 30 20 2e 2e 20 30 78 33 46 20 2a 2f 0d  0x30 .. 0x3F */.
23780 0a 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 31 2c  .    0, 1, 1, 1,
23790 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20   1, 1, 1, 1,    
237a0 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
237b0 2c 20 31 2c 20 31 2c 20 20 20 2f 2a 20 30 78 34  , 1, 1,   /* 0x4
237c0 30 20 2e 2e 20 30 78 34 46 20 2a 2f 0d 0a 20 20  0 .. 0x4F */..  
237d0 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
237e0 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20   1, 1, 1,    1, 
237f0 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
23800 2c 20 31 2c 20 20 20 2f 2a 20 30 78 35 30 20 2e  , 1,   /* 0x50 .
23810 2e 20 30 78 35 46 20 2a 2f 0d 0a 20 20 20 20 30  . 0x5F */..    0
23820 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23830 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20   1, 1,    1, 1, 
23840 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
23850 2c 20 20 20 2f 2a 20 30 78 36 30 20 2e 2e 20 30  ,   /* 0x60 .. 0
23860 78 36 46 20 2a 2f 0d 0a 20 20 20 20 31 2c 20 31  x6F */..    1, 1
23870 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23880 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c 20   1,    1, 1, 1, 
23890 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 20 20  0, 0, 0, 0, 0   
238a0 20 2f 2a 20 30 78 37 30 20 2e 2e 20 30 78 37 46   /* 0x70 .. 0x7F
238b0 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20 20 72   */..  };....  r
238c0 65 74 75 72 6e 20 28 74 20 26 20 30 78 38 30 29  eturn (t & 0x80)
238d0 20 7c 7c 20 61 42 61 72 65 77 6f 72 64 5b 28 69   || aBareword[(i
238e0 6e 74 29 74 5d 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f  nt)t];..}....../
238f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23930 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d 0a 74  *********..*/..t
23940 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
23950 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 46  s5TermsetEntry F
23960 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 3b  ts5TermsetEntry;
23970 0d 0a 73 74 72 75 63 74 20 46 74 73 35 54 65 72  ..struct Fts5Ter
23980 6d 73 65 74 45 6e 74 72 79 20 7b 0d 0a 20 20 63  msetEntry {..  c
23990 68 61 72 20 2a 70 54 65 72 6d 3b 0d 0a 20 20 69  har *pTerm;..  i
239a0 6e 74 20 6e 54 65 72 6d 3b 0d 0a 20 20 69 6e 74  nt nTerm;..  int
239b0 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239d0 49 6e 64 65 78 20 28 6d 61 69 6e 20 6f 72 20 61  Index (main or a
239e0 50 72 65 66 69 78 5b 5d 20 65 6e 74 72 79 29 20  Prefix[] entry) 
239f0 2a 2f 0d 0a 20 20 46 74 73 35 54 65 72 6d 73 65  */..  Fts5Termse
23a00 74 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0d 0a  tEntry *pNext;..
23a10 7d 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73  };....struct Fts
23a20 35 54 65 72 6d 73 65 74 20 7b 0d 0a 20 20 46 74  5Termset {..  Ft
23a30 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 2a  s5TermsetEntry *
23a40 61 70 48 61 73 68 5b 35 31 32 5d 3b 0d 0a 7d 3b  apHash[512];..};
23a50 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
23a60 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73 65  qlite3Fts5Termse
23a70 74 4e 65 77 28 46 74 73 35 54 65 72 6d 73 65 74  tNew(Fts5Termset
23a80 20 2a 2a 70 70 29 7b 0d 0a 20 20 69 6e 74 20 72   **pp){..  int r
23a90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
23aa0 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 46    *pp = sqlite3F
23ab0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
23ac0 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54 65  c, sizeof(Fts5Te
23ad0 72 6d 73 65 74 29 29 3b 0d 0a 20 20 72 65 74 75  rmset));..  retu
23ae0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  rn rc;..}....sta
23af0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
23b00 74 73 35 54 65 72 6d 73 65 74 41 64 64 28 0d 0a  ts5TermsetAdd(..
23b10 20 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70    Fts5Termset *p
23b20 2c 20 0d 0a 20 20 69 6e 74 20 69 49 64 78 2c 0d  , ..  int iIdx,.
23b30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
23b40 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
23b50 20 0d 0a 20 20 69 6e 74 20 2a 70 62 50 72 65 73   ..  int *pbPres
23b60 65 6e 74 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72  ent..){..  int r
23b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
23b80 20 20 2a 70 62 50 72 65 73 65 6e 74 20 3d 20 30    *pbPresent = 0
23b90 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20  ;..  if( p ){.. 
23ba0 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 75     int i;..    u
23bb0 33 32 20 68 61 73 68 20 3d 20 31 33 3b 0d 0a 20  32 hash = 13;.. 
23bc0 20 20 20 46 74 73 35 54 65 72 6d 73 65 74 45 6e     Fts5TermsetEn
23bd0 74 72 79 20 2a 70 45 6e 74 72 79 3b 0d 0a 0d 0a  try *pEntry;....
23be0 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65      /* Calculate
23bf0 20 61 20 68 61 73 68 20 76 61 6c 75 65 20 66 6f   a hash value fo
23c00 72 20 74 68 69 73 20 74 65 72 6d 2e 20 54 68 69  r this term. Thi
23c10 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 68 61  s is the same ha
23c20 73 68 20 63 68 65 63 6b 73 75 6d 0d 0a 20 20 20  sh checksum..   
23c30 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
23c40 66 74 73 35 5f 68 61 73 68 2e 63 20 6d 6f 64 75  fts5_hash.c modu
23c50 6c 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  le. This is not 
23c60 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 63 6f  important for co
23c70 72 72 65 63 74 0d 0a 20 20 20 20 2a 2a 20 6f 70  rrect..    ** op
23c80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  eration of the m
23c90 6f 64 75 6c 65 2c 20 62 75 74 20 69 73 20 6e 65  odule, but is ne
23ca0 63 65 73 73 61 72 79 20 74 6f 20 65 6e 73 75 72  cessary to ensur
23cb0 65 20 74 68 61 74 20 73 6f 6d 65 20 74 65 73 74  e that some test
23cc0 73 0d 0a 20 20 20 20 2a 2a 20 64 65 73 69 67 6e  s..    ** design
23cd0 65 64 20 74 6f 20 70 72 6f 64 75 63 65 20 68 61  ed to produce ha
23ce0 73 68 20 74 61 62 6c 65 20 63 6f 6c 6c 69 73 69  sh table collisi
23cf0 6f 6e 73 20 72 65 61 6c 6c 79 20 64 6f 20 77 6f  ons really do wo
23d00 72 6b 2e 20 20 2a 2f 0d 0a 20 20 20 20 66 6f 72  rk.  */..    for
23d10 28 69 3d 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  (i=nTerm-1; i>=0
23d20 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 68  ; i--){..      h
23d30 61 73 68 20 3d 20 28 68 61 73 68 20 3c 3c 20 33  ash = (hash << 3
23d40 29 20 5e 20 68 61 73 68 20 5e 20 70 54 65 72 6d  ) ^ hash ^ pTerm
23d50 5b 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  [i];..    }..   
23d60 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 3c 3c   hash = (hash <<
23d70 20 33 29 20 5e 20 68 61 73 68 20 5e 20 69 49 64   3) ^ hash ^ iId
23d80 78 3b 0d 0a 20 20 20 20 68 61 73 68 20 3d 20 68  x;..    hash = h
23d90 61 73 68 20 25 20 41 72 72 61 79 53 69 7a 65 28  ash % ArraySize(
23da0 70 2d 3e 61 70 48 61 73 68 29 3b 0d 0a 0d 0a 20  p->apHash);.... 
23db0 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 2d     for(pEntry=p-
23dc0 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 3b 20 70  >apHash[hash]; p
23dd0 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 45  Entry; pEntry=pE
23de0 6e 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20  ntry->pNext){.. 
23df0 20 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d       if( pEntry-
23e00 3e 69 49 64 78 3d 3d 69 49 64 78 20 0d 0a 20 20  >iIdx==iIdx ..  
23e10 20 20 20 20 20 20 20 20 26 26 20 70 45 6e 74 72          && pEntr
23e20 79 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72 6d 20  y->nTerm==nTerm 
23e30 0d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  ..          && m
23e40 65 6d 63 6d 70 28 70 45 6e 74 72 79 2d 3e 70 54  emcmp(pEntry->pT
23e50 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
23e60 6d 29 3d 3d 30 20 0d 0a 20 20 20 20 20 20 29 7b  m)==0 ..      ){
23e70 0d 0a 20 20 20 20 20 20 20 20 2a 70 62 50 72 65  ..        *pbPre
23e80 73 65 6e 74 20 3d 20 31 3b 0d 0a 20 20 20 20 20  sent = 1;..     
23e90 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
23ea0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
23eb0 20 69 66 28 20 70 45 6e 74 72 79 3d 3d 30 20 29   if( pEntry==0 )
23ec0 7b 0d 0a 20 20 20 20 20 20 70 45 6e 74 72 79 20  {..      pEntry 
23ed0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  = sqlite3Fts5Mal
23ee0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a  locZero(&rc, siz
23ef0 65 6f 66 28 46 74 73 35 54 65 72 6d 73 65 74 45  eof(Fts5TermsetE
23f00 6e 74 72 79 29 20 2b 20 6e 54 65 72 6d 29 3b 0d  ntry) + nTerm);.
23f10 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 74 72  .      if( pEntr
23f20 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 45  y ){..        pE
23f30 6e 74 72 79 2d 3e 70 54 65 72 6d 20 3d 20 28 63  ntry->pTerm = (c
23f40 68 61 72 2a 29 26 70 45 6e 74 72 79 5b 31 5d 3b  har*)&pEntry[1];
23f50 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79  ..        pEntry
23f60 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
23f70 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79  ..        pEntry
23f80 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0d 0a  ->iIdx = iIdx;..
23f90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
23fa0 45 6e 74 72 79 2d 3e 70 54 65 72 6d 2c 20 70 54  Entry->pTerm, pT
23fb0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0d 0a 20 20  erm, nTerm);..  
23fc0 20 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 4e        pEntry->pN
23fd0 65 78 74 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b  ext = p->apHash[
23fe0 68 61 73 68 5d 3b 0d 0a 20 20 20 20 20 20 20 20  hash];..        
23ff0 70 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 20  p->apHash[hash] 
24000 3d 20 70 45 6e 74 72 79 3b 0d 0a 20 20 20 20 20  = pEntry;..     
24010 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a   }..    }..  }..
24020 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
24030 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  }....static void
24040 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
24050 73 65 74 46 72 65 65 28 46 74 73 35 54 65 72 6d  setFree(Fts5Term
24060 73 65 74 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20  set *p){..  if( 
24070 70 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 69 3b  p ){..    u32 i;
24080 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
24090 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 70  <ArraySize(p->ap
240a0 48 61 73 68 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20  Hash); i++){..  
240b0 20 20 20 20 46 74 73 35 54 65 72 6d 73 65 74 45      Fts5TermsetE
240c0 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 70  ntry *pEntry = p
240d0 2d 3e 61 70 48 61 73 68 5b 69 5d 3b 0d 0a 20 20  ->apHash[i];..  
240e0 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e 74 72      while( pEntr
240f0 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74  y ){..        Ft
24100 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 2a  s5TermsetEntry *
24110 70 44 65 6c 20 3d 20 70 45 6e 74 72 79 3b 0d 0a  pDel = pEntry;..
24120 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d          pEntry =
24130 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b 0d   pEntry->pNext;.
24140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24150 5f 66 72 65 65 28 70 44 65 6c 29 3b 0d 0a 20 20  _free(pDel);..  
24160 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
24170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24180 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 23 6c  );..  }..}....#l
24190 69 6e 65 20 31 20 22 66 74 73 35 5f 63 6f 6e 66  ine 1 "fts5_conf
241a0 69 67 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30  ig.c"../*..** 20
241b0 31 34 20 4a 75 6e 20 30 39 0d 0a 2a 2a 0d 0a 2a  14 Jun 09..**..*
241c0 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  * The author dis
241d0 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
241e0 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
241f0 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
24200 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e  of..** a legal n
24210 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
24220 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a   blessing:..**..
24230 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  **    May you do
24240 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
24250 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79  il...**    May y
24260 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e  ou find forgiven
24270 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66  ess for yourself
24280 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68   and forgive oth
24290 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  ers...**    May 
242a0 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
242b0 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
242c0 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
242d0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  e...**..********
242e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24320 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54  ******..**..** T
24330 68 69 73 20 69 73 20 61 6e 20 53 51 4c 69 74 65  his is an SQLite
24340 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
24350 74 69 6e 67 20 66 75 6c 6c 2d 74 65 78 74 20 73  ting full-text s
24360 65 61 72 63 68 2e 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a  earch...*/......
24370 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74 73  /* #include "fts
24380 35 49 6e 74 2e 68 22 20 2a 2f 0d 0a 0d 0a 23 64  5Int.h" */....#d
24390 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55  efine FTS5_DEFAU
243a0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20 34  LT_PAGE_SIZE   4
243b0 30 35 30 0d 0a 23 64 65 66 69 6e 65 20 46 54 53  050..#define FTS
243c0 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45  5_DEFAULT_AUTOME
243d0 52 47 45 20 20 20 20 20 20 34 0d 0a 23 64 65 66  RGE      4..#def
243e0 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54  ine FTS5_DEFAULT
243f0 5f 55 53 45 52 4d 45 52 47 45 20 20 20 20 20 20  _USERMERGE      
24400 34 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  4..#define FTS5_
24410 44 45 46 41 55 4c 54 5f 43 52 49 53 49 53 4d 45  DEFAULT_CRISISME
24420 52 47 45 20 20 20 31 36 0d 0a 23 64 65 66 69 6e  RGE   16..#defin
24430 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 48  e FTS5_DEFAULT_H
24440 41 53 48 53 49 5a 45 20 20 20 20 28 31 30 32 34  ASHSIZE    (1024
24450 2a 31 30 32 34 29 0d 0a 0d 0a 2f 2a 20 4d 61 78  *1024)..../* Max
24460 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 70 61 67  imum allowed pag
24470 65 20 73 69 7a 65 20 2a 2f 0d 0a 23 64 65 66 69  e size */..#defi
24480 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 41 47 45  ne FTS5_MAX_PAGE
24490 5f 53 49 5a 45 20 28 31 32 38 2a 31 30 32 34 29  _SIZE (128*1024)
244a0 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ....static int f
244b0 74 73 35 5f 69 73 77 68 69 74 65 73 70 61 63 65  ts5_iswhitespace
244c0 28 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65 74  (char x){..  ret
244d0 75 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0d 0a 7d  urn (x==' ');..}
244e0 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ....static int f
244f0 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28  ts5_isopenquote(
24500 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65 74 75  char x){..  retu
24510 72 6e 20 28 78 3d 3d 27 22 27 20 7c 7c 20 78 3d  rn (x=='"' || x=
24520 3d 27 5c 27 27 20 7c 7c 20 78 3d 3d 27 5b 27 20  ='\'' || x=='[' 
24530 7c 7c 20 78 3d 3d 27 60 27 29 3b 0d 0a 7d 0d 0a  || x=='`');..}..
24540 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e  ../*..** Argumen
24550 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20  t pIn points to 
24560 61 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  a character that
24570 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75   is part of a nu
24580 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d 0a 2a  l-terminated ..*
24590 2a 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e  * string. Return
245a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
245b0 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
245c0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e  r following *pIn
245d0 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73 74 72   in ..** the str
245e0 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
245f0 61 20 77 68 69 74 65 2d 73 70 61 63 65 20 63 68  a white-space ch
24600 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74  aracter...*/..st
24610 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
24620 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57  *fts5ConfigSkipW
24630 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74 20  hitespace(const 
24640 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63  char *pIn){..  c
24650 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70  onst char *p = p
24660 49 6e 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d  In;..  if( p ){.
24670 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
24680 5f 69 73 77 68 69 74 65 73 70 61 63 65 28 2a 70  _iswhitespace(*p
24690 29 20 29 7b 20 70 2b 2b 3b 20 7d 0d 0a 20 20 7d  ) ){ p++; }..  }
246a0 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d  ..  return p;..}
246b0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d  ..../*..** Argum
246c0 65 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74  ent pIn points t
246d0 6f 20 61 20 63 68 61 72 61 63 74 65 72 20 74 68  o a character th
246e0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
246f0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d  nul-terminated .
24700 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74 75  .** string. Retu
24710 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
24720 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
24730 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70  ter following *p
24740 49 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73  In in ..** the s
24750 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
24760 74 20 61 20 22 62 61 72 65 77 6f 72 64 22 20 63  t a "bareword" c
24770 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73  haracter...*/..s
24780 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
24790 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70   *fts5ConfigSkip
247a0 42 61 72 65 77 6f 72 64 28 63 6f 6e 73 74 20 63  Bareword(const c
247b0 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63 6f  har *pIn){..  co
247c0 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49  nst char *p = pI
247d0 6e 3b 0d 0a 20 20 77 68 69 6c 65 20 28 20 73 71  n;..  while ( sq
247e0 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77  lite3Fts5IsBarew
247f0 6f 72 64 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a  ord(*p) ) p++;..
24800 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70    if( p==pIn ) p
24810 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
24820 70 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  p;..}....static 
24830 69 6e 74 20 66 74 73 35 5f 69 73 64 69 67 69 74  int fts5_isdigit
24840 28 63 68 61 72 20 61 29 7b 0d 0a 20 20 72 65 74  (char a){..  ret
24850 75 72 6e 20 28 61 3e 3d 27 30 27 20 26 26 20 61  urn (a>='0' && a
24860 3c 3d 27 39 27 29 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a  <='9');..}......
24870 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
24880 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53  har *fts5ConfigS
24890 6b 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e 73 74  kipLiteral(const
248a0 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20   char *pIn){..  
248b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
248c0 70 49 6e 3b 0d 0a 20 20 73 77 69 74 63 68 28 20  pIn;..  switch( 
248d0 2a 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20  *p ){..    case 
248e0 27 6e 27 3a 20 63 61 73 65 20 27 4e 27 3a 0d 0a  'n': case 'N':..
248f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24900 33 5f 73 74 72 6e 69 63 6d 70 28 22 6e 75 6c 6c  3_strnicmp("null
24910 22 2c 20 70 2c 20 34 29 3d 3d 30 20 29 7b 0d 0a  ", p, 4)==0 ){..
24920 20 20 20 20 20 20 20 20 70 20 3d 20 26 70 5b 34          p = &p[4
24930 5d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ];..      }else{
24940 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b  ..        p = 0;
24950 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
24960 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 63   break;....    c
24970 61 73 65 20 27 78 27 3a 20 63 61 73 65 20 27 58  ase 'x': case 'X
24980 27 3a 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a  ':..      p++;..
24990 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 5c        if( *p=='\
249a0 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70  '' ){..        p
249b0 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69  ++;..        whi
249c0 6c 65 28 20 28 2a 70 3e 3d 27 61 27 20 26 26 20  le( (*p>='a' && 
249d0 2a 70 3c 3d 27 66 27 29 20 0d 0a 20 20 20 20 20  *p<='f') ..     
249e0 20 20 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d 27         || (*p>='
249f0 41 27 20 26 26 20 2a 70 3c 3d 27 46 27 29 20 0d  A' && *p<='F') .
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
24a10 28 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c 3d  (*p>='0' && *p<=
24a20 27 39 27 29 20 0d 0a 20 20 20 20 20 20 20 20 20  '9') ..         
24a30 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20     ){..         
24a40 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d   p++;..        }
24a50 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ..        if( *p
24a60 3d 3d 27 5c 27 27 20 26 26 20 30 3d 3d 28 28 70  =='\'' && 0==((p
24a70 2d 70 49 6e 29 25 32 29 20 29 7b 0d 0a 20 20 20  -pIn)%2) ){..   
24a80 20 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20         p++;..   
24a90 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20       }else{..   
24aa0 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a 20         p = 0;.. 
24ab0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24ac0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20  }else{..        
24ad0 70 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d  p = 0;..      }.
24ae0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d  .      break;...
24af0 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0d  .    case '\'':.
24b00 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20  .      p++;..   
24b10 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0d 0a     while( p ){..
24b20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d          if( *p==
24b30 27 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20  '\'' ){..       
24b40 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20     p++;..       
24b50 20 20 20 69 66 28 20 2a 70 21 3d 27 5c 27 27 20     if( *p!='\'' 
24b60 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20  ) break;..      
24b70 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 70 2b 2b    }..        p++
24b80 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ;..        if( *
24b90 70 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0d 0a 20  p==0 ) p = 0;.. 
24ba0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72       }..      br
24bb0 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 64 65 66 61  eak;....    defa
24bc0 75 6c 74 3a 0d 0a 20 20 20 20 20 20 2f 2a 20 6d  ult:..      /* m
24bd0 61 79 62 65 20 61 20 6e 75 6d 62 65 72 20 2a 2f  aybe a number */
24be0 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d  ..      if( *p==
24bf0 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27 20 29  '+' || *p=='-' )
24c00 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 77 68 69   p++;..      whi
24c10 6c 65 28 20 66 74 73 35 5f 69 73 64 69 67 69 74  le( fts5_isdigit
24c20 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a 0d 0a 20  (*p) ) p++;.... 
24c30 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
24c40 70 6f 69 6e 74 2c 20 69 66 20 74 68 65 20 6c 69  point, if the li
24c50 74 65 72 61 6c 20 77 61 73 20 61 6e 20 69 6e 74  teral was an int
24c60 65 67 65 72 2c 20 74 68 65 20 70 61 72 73 65 20  eger, the parse 
24c70 69 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20 66 69  is ..      ** fi
24c80 6e 69 73 68 65 64 2e 20 4f 72 2c 20 69 66 20 69  nished. Or, if i
24c90 74 20 69 73 20 61 20 66 6c 6f 61 74 69 6e 67 20  t is a floating 
24ca0 70 6f 69 6e 74 20 76 61 6c 75 65 2c 20 69 74 20  point value, it 
24cb0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20  may continue..  
24cc0 20 20 20 20 2a 2a 20 77 69 74 68 20 65 69 74 68      ** with eith
24cd0 65 72 20 61 20 64 65 63 69 6d 61 6c 20 70 6f 69  er a decimal poi
24ce0 6e 74 20 6f 72 20 61 6e 20 27 45 27 20 63 68 61  nt or an 'E' cha
24cf0 72 61 63 74 65 72 2e 20 2a 2f 0d 0a 20 20 20 20  racter. */..    
24d00 20 20 69 66 28 20 2a 70 3d 3d 27 2e 27 20 26 26    if( *p=='.' &&
24d10 20 66 74 73 35 5f 69 73 64 69 67 69 74 28 70 5b   fts5_isdigit(p[
24d20 31 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  1]) ){..        
24d30 70 20 2b 3d 20 32 3b 0d 0a 20 20 20 20 20 20 20  p += 2;..       
24d40 20 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64   while( fts5_isd
24d50 69 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0d  igit(*p) ) p++;.
24d60 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
24d70 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70 20 3d  if( p==pIn ) p =
24d80 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 62 72 65   0;....      bre
24d90 61 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65  ak;..  }....  re
24da0 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  turn p;..}..../*
24db0 0d 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  ..** The first c
24dc0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
24dd0 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
24de0 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a 20  o by argument z 
24df0 69 73 20 67 75 61 72 61 6e 74 65 65 64 0d 0a 2a  is guaranteed..*
24e00 2a 20 74 6f 20 62 65 20 61 6e 20 6f 70 65 6e 2d  * to be an open-
24e10 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
24e20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 66 74  (see function ft
24e30 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28 29  s5_isopenquote()
24e40 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20  )...**..** This 
24e50 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
24e60 73 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  s for the corres
24e70 70 6f 6e 64 69 6e 67 20 63 6c 6f 73 65 2d 71 75  ponding close-qu
24e80 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77 69  ote character wi
24e90 74 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 73 74 72  thin..** the str
24ea0 69 6e 67 20 61 6e 64 2c 20 69 66 20 66 6f 75 6e  ing and, if foun
24eb0 64 2c 20 64 65 71 75 6f 74 65 73 20 74 68 65 20  d, dequotes the 
24ec0 73 74 72 69 6e 67 20 69 6e 20 70 6c 61 63 65 20  string in place 
24ed0 61 6e 64 20 61 64 64 73 20 61 20 6e 65 77 0d 0a  and adds a new..
24ee0 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
24ef0 72 20 62 79 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  r byte...**..** 
24f00 49 66 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f  If the close-quo
24f10 74 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  te is found, the
24f20 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
24f30 69 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  is the byte offs
24f40 65 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 63 68  et of..** the ch
24f50 61 72 61 63 74 65 72 20 69 6d 6d 65 64 69 61 74  aracter immediat
24f60 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ely following it
24f70 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6c 6f  . Or, if the clo
24f80 73 65 2d 71 75 6f 74 65 20 69 73 20 6e 6f 74 20  se-quote is not 
24f90 0d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d 31 20 69  ..** found, -1 i
24fa0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 2d  s returned. If -
24fb0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  1 is returned, t
24fc0 68 65 20 62 75 66 66 65 72 20 69 73 20 6c 65 66  he buffer is lef
24fd0 74 20 69 6e 20 61 6e 20 0d 0a 2a 2a 20 75 6e 64  t in an ..** und
24fe0 65 66 69 6e 65 64 20 73 74 61 74 65 2e 0d 0a 2a  efined state...*
24ff0 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
25000 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  s5Dequote(char *
25010 7a 29 7b 0d 0a 20 20 63 68 61 72 20 71 3b 0d 0a  z){..  char q;..
25020 20 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0d 0a    int iIn = 1;..
25030 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0d    int iOut = 0;.
25040 0a 20 20 71 20 3d 20 7a 5b 30 5d 3b 0d 0a 0d 0a  .  q = z[0];....
25050 20 20 2f 2a 20 53 65 74 20 73 74 61 63 6b 20 76    /* Set stack v
25060 61 72 69 61 62 6c 65 20 71 20 74 6f 20 74 68 65  ariable q to the
25070 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61   close-quote cha
25080 72 61 63 74 65 72 20 2a 2f 0d 0a 20 20 61 73 73  racter */..  ass
25090 65 72 74 28 20 71 3d 3d 27 5b 27 20 7c 7c 20 71  ert( q=='[' || q
250a0 3d 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22 27  =='\'' || q=='"'
250b0 20 7c 7c 20 71 3d 3d 27 60 27 20 29 3b 0d 0a 20   || q=='`' );.. 
250c0 20 69 66 28 20 71 3d 3d 27 5b 27 20 29 20 71 20   if( q=='[' ) q 
250d0 3d 20 27 5d 27 3b 20 20 0d 0a 0d 0a 20 20 77 68  = ']';  ....  wh
250e0 69 6c 65 28 20 41 4c 57 41 59 53 28 7a 5b 69 49  ile( ALWAYS(z[iI
250f0 6e 5d 29 20 29 7b 0d 0a 20 20 20 20 69 66 28 20  n]) ){..    if( 
25100 7a 5b 69 49 6e 5d 3d 3d 71 20 29 7b 0d 0a 20 20  z[iIn]==q ){..  
25110 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d      if( z[iIn+1]
25120 21 3d 71 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  !=q ){..        
25130 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e  /* Character iIn
25140 20 77 61 73 20 74 68 65 20 63 6c 6f 73 65 20 71   was the close q
25150 75 6f 74 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20  uote. */..      
25160 20 20 69 49 6e 2b 2b 3b 0d 0a 20 20 20 20 20 20    iIn++;..      
25170 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
25180 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20  }else{..        
25190 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e  /* Character iIn
251a0 20 61 6e 64 20 69 49 6e 2b 31 20 66 6f 72 6d 20   and iIn+1 form 
251b0 61 6e 20 65 73 63 61 70 65 64 20 71 75 6f 74 65  an escaped quote
251c0 20 63 68 61 72 61 63 74 65 72 2e 20 53 6b 69 70   character. Skip
251d0 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ..        ** the
251e0 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20 70 61   input cursor pa
251f0 73 74 20 62 6f 74 68 20 61 6e 64 20 63 6f 70 79  st both and copy
25200 20 61 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 20   a single quote 
25210 63 68 61 72 61 63 74 65 72 20 0d 0a 20 20 20 20  character ..    
25220 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 75      ** to the ou
25230 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0d  tput buffer. */.
25240 0a 20 20 20 20 20 20 20 20 69 49 6e 20 2b 3d 20  .        iIn += 
25250 32 3b 0d 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f  2;..        z[iO
25260 75 74 2b 2b 5d 20 3d 20 71 3b 0d 0a 20 20 20 20  ut++] = q;..    
25270 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d    }..    }else{.
25280 0a 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d  .      z[iOut++]
25290 20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0d 0a 20 20   = z[iIn++];..  
252a0 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 7a 5b    }..  }....  z[
252b0 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20  iOut] = '\0';.. 
252c0 20 72 65 74 75 72 6e 20 69 49 6e 3b 0d 0a 7d 0d   return iIn;..}.
252d0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72  .../*..** Conver
252e0 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71  t an SQL-style q
252f0 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74  uoted string int
25300 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e  o a normal strin
25310 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0d 0a 2a  g by removing..*
25320 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72  * the quote char
25330 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e  acters.  The con
25340 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20  version is done 
25350 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68  in-place.  If th
25360 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73  e..** input does
25370 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
25380 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  a quote characte
25390 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
253a0 74 69 6e 65 0d 0a 2a 2a 20 69 73 20 61 20 6e 6f  tine..** is a no
253b0 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 61  -op...**..** Exa
253c0 6d 70 6c 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20  mples:..**..**  
253d0 20 20 20 22 61 62 63 22 20 20 20 62 65 63 6f 6d     "abc"   becom
253e0 65 73 20 20 20 61 62 63 0d 0a 2a 2a 20 20 20 20  es   abc..**    
253f0 20 27 78 79 7a 27 20 20 20 62 65 63 6f 6d 65 73   'xyz'   becomes
25400 20 20 20 78 79 7a 0d 0a 2a 2a 20 20 20 20 20 5b     xyz..**     [
25410 70 71 72 5d 20 20 20 62 65 63 6f 6d 65 73 20 20  pqr]   becomes  
25420 20 70 71 72 0d 0a 2a 2a 20 20 20 20 20 60 6d 6e   pqr..**     `mn
25430 6f 60 20 20 20 62 65 63 6f 6d 65 73 20 20 20 6d  o`   becomes   m
25440 6e 6f 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  no..*/..static v
25450 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 44  oid sqlite3Fts5D
25460 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b  equote(char *z){
25470 0d 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b 20  ..  char quote; 
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63 68 61      /* Quote cha
254a0 72 61 63 74 65 72 20 28 69 66 20 61 6e 79 20 29  racter (if any )
254b0 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28   */....  assert(
254c0 20 30 3d 3d 66 74 73 35 5f 69 73 77 68 69 74 65   0==fts5_iswhite
254d0 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 3b 0d 0a  space(z[0]) );..
254e0 20 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0d    quote = z[0];.
254f0 0a 20 20 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b  .  if( quote=='[
25500 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 5c 27 27  ' || quote=='\''
25510 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 22 27 20 7c   || quote=='"' |
25520 7c 20 71 75 6f 74 65 3d 3d 27 60 27 20 29 7b 0d  | quote=='`' ){.
25530 0a 20 20 20 20 66 74 73 35 44 65 71 75 6f 74 65  .    fts5Dequote
25540 28 7a 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  (z);..  }..}....
25550 0d 0a 73 74 72 75 63 74 20 46 74 73 35 45 6e 75  ..struct Fts5Enu
25560 6d 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61  m {..  const cha
25570 72 20 2a 7a 4e 61 6d 65 3b 0d 0a 20 20 69 6e 74  r *zName;..  int
25580 20 65 56 61 6c 3b 0d 0a 7d 3b 0d 0a 74 79 70 65   eVal;..};..type
25590 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45  def struct Fts5E
255a0 6e 75 6d 20 46 74 73 35 45 6e 75 6d 3b 0d 0a 0d  num Fts5Enum;...
255b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
255c0 43 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28 0d 0a  ConfigSetEnum(..
255d0 20 20 63 6f 6e 73 74 20 46 74 73 35 45 6e 75 6d    const Fts5Enum
255e0 20 2a 61 45 6e 75 6d 2c 20 0d 0a 20 20 63 6f 6e   *aEnum, ..  con
255f0 73 74 20 63 68 61 72 20 2a 7a 45 6e 75 6d 2c 20  st char *zEnum, 
25600 0d 0a 20 20 69 6e 74 20 2a 70 65 56 61 6c 0d 0a  ..  int *peVal..
25610 29 7b 0d 0a 20 20 69 6e 74 20 6e 45 6e 75 6d 20  ){..  int nEnum 
25620 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 45  = (int)strlen(zE
25630 6e 75 6d 29 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d  num);..  int i;.
25640 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 2d 31  .  int iVal = -1
25650 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ;....  for(i=0; 
25660 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 3b 20  aEnum[i].zName; 
25670 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 73  i++){..    if( s
25680 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
25690 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  aEnum[i].zName, 
256a0 7a 45 6e 75 6d 2c 20 6e 45 6e 75 6d 29 3d 3d 30  zEnum, nEnum)==0
256b0 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 69   ){..      if( i
256c0 56 61 6c 3e 3d 30 20 29 20 72 65 74 75 72 6e 20  Val>=0 ) return 
256d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
256e0 20 20 20 20 20 69 56 61 6c 20 3d 20 61 45 6e 75       iVal = aEnu
256f0 6d 5b 69 5d 2e 65 56 61 6c 3b 0d 0a 20 20 20 20  m[i].eVal;..    
25700 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 65 56  }..  }....  *peV
25710 61 6c 20 3d 20 69 56 61 6c 3b 0d 0a 20 20 72 65  al = iVal;..  re
25720 74 75 72 6e 20 69 56 61 6c 3c 30 20 3f 20 53 51  turn iVal<0 ? SQ
25730 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
25740 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  ITE_OK;..}..../*
25750 0d 0a 2a 2a 20 50 61 72 73 65 20 61 20 22 73 70  ..** Parse a "sp
25760 65 63 69 61 6c 22 20 43 52 45 41 54 45 20 56 49  ecial" CREATE VI
25770 52 54 55 41 4c 20 54 41 42 4c 45 20 64 69 72 65  RTUAL TABLE dire
25780 63 74 69 76 65 20 61 6e 64 20 75 70 64 61 74 65  ctive and update
25790 0d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69  ..** configurati
257a0 6f 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66 69  on object pConfi
257b0 67 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  g as appropriate
257c0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63  ...**..** If suc
257d0 63 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63 74 20  cessful, object 
257e0 70 43 6f 6e 66 69 67 20 69 73 20 75 70 64 61 74  pConfig is updat
257f0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
25800 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0d 0a 2a   returned. If..*
25810 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
25820 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
25830 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25840 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
25850 20 6d 65 73 73 61 67 65 0d 0a 2a 2a 20 6d 61 79   message..** may
25860 20 62 65 20 6c 65 66 74 20 69 6e 20 2a 70 7a 45   be left in *pzE
25870 72 72 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  rr. It is the re
25880 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25890 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0d 0a 2a  the caller to..*
258a0 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  * eventually fre
258b0 65 20 61 6e 79 20 73 75 63 68 20 65 72 72 6f 72  e any such error
258c0 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
258d0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0d 0a  qlite3_free()...
258e0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
258f0 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 53 70  ts5ConfigParseSp
25900 65 63 69 61 6c 28 0d 0a 20 20 46 74 73 35 47 6c  ecial(..  Fts5Gl
25910 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 0d 0a  obal *pGlobal,..
25920 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
25930 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
25940 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
25950 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 70 64  on object to upd
25960 61 74 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  ate */..  const 
25970 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20 20  char *zCmd,     
25980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65            /* Spe
25990 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  cial command to 
259a0 70 61 72 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73  parse */..  cons
259b0 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 20  t char *zArg,   
259c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
259d0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65  rgument to parse
259e0 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a   */..  char **pz
259f0 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
25a00 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
25a10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0d  rror message */.
25a20 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20  .){..  int rc = 
25a30 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e  SQLITE_OK;..  in
25a40 74 20 6e 43 6d 64 20 3d 20 28 69 6e 74 29 73 74  t nCmd = (int)st
25a50 72 6c 65 6e 28 7a 43 6d 64 29 3b 0d 0a 20 20 69  rlen(zCmd);..  i
25a60 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
25a70 63 6d 70 28 22 70 72 65 66 69 78 22 2c 20 7a 43  cmp("prefix", zC
25a80 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d  md, nCmd)==0 ){.
25a90 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
25aa0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 69 6e  Byte = sizeof(in
25ab0 74 29 20 2a 20 46 54 53 35 5f 4d 41 58 5f 50 52  t) * FTS5_MAX_PR
25ac0 45 46 49 58 5f 49 4e 44 45 58 45 53 3b 0d 0a 20  EFIX_INDEXES;.. 
25ad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
25ae0 3b 0d 0a 20 20 20 20 69 6e 74 20 62 46 69 72 73  ;..    int bFirs
25af0 74 20 3d 20 31 3b 0d 0a 20 20 20 20 69 66 28 20  t = 1;..    if( 
25b00 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
25b10 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 43  ==0 ){..      pC
25b20 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 20 3d  onfig->aPrefix =
25b30 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
25b40 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74  ocZero(&rc, nByt
25b50 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72  e);..      if( r
25b60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  c ) return rc;..
25b70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 20 3d      }....    p =
25b80 20 7a 41 72 67 3b 0d 0a 20 20 20 20 77 68 69 6c   zArg;..    whil
25b90 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 20 20 69  e( 1 ){..      i
25ba0 6e 74 20 6e 50 72 65 20 3d 20 30 3b 0d 0a 0d 0a  nt nPre = 0;....
25bb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 5b 30        while( p[0
25bc0 5d 3d 3d 27 20 27 20 29 20 70 2b 2b 3b 0d 0a 20  ]==' ' ) p++;.. 
25bd0 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
25be0 3d 30 20 26 26 20 70 5b 30 5d 3d 3d 27 2c 27 20  =0 && p[0]==',' 
25bf0 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b  ){..        p++;
25c00 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ..        while(
25c10 20 70 5b 30 5d 3d 3d 27 20 27 20 29 20 70 2b 2b   p[0]==' ' ) p++
25c20 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ;..      }else i
25c30 66 28 20 70 5b 30 5d 3d 3d 27 5c 30 27 20 29 7b  f( p[0]=='\0' ){
25c40 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
25c50 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
25c60 20 69 66 28 20 70 5b 30 5d 3c 27 30 27 20 7c 7c   if( p[0]<'0' ||
25c70 20 70 5b 30 5d 3e 27 39 27 20 29 7b 0d 0a 20 20   p[0]>'9' ){..  
25c80 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
25c90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
25ca0 6d 61 6c 66 6f 72 6d 65 64 20 70 72 65 66 69 78  malformed prefix
25cb0 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 22 29  =... directive")
25cc0 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
25cd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
25ce0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
25cf0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25d00 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  if( pConfig->nPr
25d10 65 66 69 78 3d 3d 46 54 53 35 5f 4d 41 58 5f 50  efix==FTS5_MAX_P
25d20 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 29 7b  REFIX_INDEXES ){
25d30 0d 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  ..        *pzErr
25d40 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25d50 74 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tf(..           
25d60 20 22 74 6f 6f 20 6d 61 6e 79 20 70 72 65 66 69   "too many prefi
25d70 78 20 69 6e 64 65 78 65 73 20 28 6d 61 78 20 25  x indexes (max %
25d80 64 29 22 2c 20 46 54 53 35 5f 4d 41 58 5f 50 52  d)", FTS5_MAX_PR
25d90 45 46 49 58 5f 49 4e 44 45 58 45 53 0d 0a 20 20  EFIX_INDEXES..  
25da0 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20        );..      
25db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25dc0 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 62 72  ROR;..        br
25dd0 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  eak;..      }...
25de0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 5b  .      while( p[
25df0 30 5d 3e 3d 27 30 27 20 26 26 20 70 5b 30 5d 3c  0]>='0' && p[0]<
25e00 3d 27 39 27 20 26 26 20 6e 50 72 65 3c 31 30 30  ='9' && nPre<100
25e10 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 6e 50  0 ){..        nP
25e20 72 65 20 3d 20 6e 50 72 65 2a 31 30 20 2b 20 28  re = nPre*10 + (
25e30 70 5b 30 5d 20 2d 20 27 30 27 29 3b 0d 0a 20 20  p[0] - '0');..  
25e40 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20        p++;..    
25e50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28    }....      if(
25e60 20 6e 50 72 65 3c 3d 30 20 7c 7c 20 6e 50 72 65   nPre<=0 || nPre
25e70 3e 3d 31 30 30 30 20 29 7b 0d 0a 20 20 20 20 20  >=1000 ){..     
25e80 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
25e90 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 72 65  te3_mprintf("pre
25ea0 66 69 78 20 6c 65 6e 67 74 68 20 6f 75 74 20 6f  fix length out o
25eb0 66 20 72 61 6e 67 65 20 28 6d 61 78 20 39 39 39  f range (max 999
25ec0 29 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63  )");..        rc
25ed0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25ee0 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
25ef0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
25f00 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65     pConfig->aPre
25f10 66 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  fix[pConfig->nPr
25f20 65 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0d 0a 20  efix] = nPre;.. 
25f30 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 50       pConfig->nP
25f40 72 65 66 69 78 2b 2b 3b 0d 0a 20 20 20 20 20 20  refix++;..      
25f50 62 46 69 72 73 74 20 3d 20 30 3b 0d 0a 20 20 20  bFirst = 0;..   
25f60 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
25f70 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
25f80 3c 3d 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49  <=FTS5_MAX_PREFI
25f90 58 5f 49 4e 44 45 58 45 53 20 29 3b 0d 0a 20 20  X_INDEXES );..  
25fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20    return rc;..  
25fb0 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74  }....  if( sqlit
25fc0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 74 6f 6b  e3_strnicmp("tok
25fd0 65 6e 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e 43  enize", zCmd, nC
25fe0 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63  md)==0 ){..    c
25ff0 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 28  onst char *p = (
26000 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 41 72 67  const char*)zArg
26010 3b 0d 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  ;..    int nArg 
26020 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
26030 72 67 29 20 2b 20 31 3b 0d 0a 20 20 20 20 63 68  rg) + 1;..    ch
26040 61 72 20 2a 2a 61 7a 41 72 67 20 3d 20 73 71 6c  ar **azArg = sql
26050 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
26060 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 63  ro(&rc, sizeof(c
26070 68 61 72 2a 29 20 2a 20 6e 41 72 67 29 3b 0d 0a  har*) * nArg);..
26080 20 20 20 20 63 68 61 72 20 2a 70 44 65 6c 20 3d      char *pDel =
26090 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
260a0 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 41 72 67  ocZero(&rc, nArg
260b0 20 2a 20 32 29 3b 0d 0a 20 20 20 20 63 68 61 72   * 2);..    char
260c0 20 2a 70 53 70 61 63 65 20 3d 20 70 44 65 6c 3b   *pSpace = pDel;
260d0 0d 0a 0d 0a 20 20 20 20 69 66 28 20 61 7a 41 72  ....    if( azAr
260e0 67 20 26 26 20 70 53 70 61 63 65 20 29 7b 0d 0a  g && pSpace ){..
260f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
26100 67 2d 3e 70 54 6f 6b 20 29 7b 0d 0a 20 20 20 20  g->pTok ){..    
26110 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
26120 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75  ite3_mprintf("mu
26130 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 3d  ltiple tokenize=
26140 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73 22 29  ... directives")
26150 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
26160 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
26170 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20       }else{..   
26180 20 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b       for(nArg=0;
26190 20 70 20 26 26 20 2a 70 3b 20 6e 41 72 67 2b 2b   p && *p; nArg++
261a0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ){..          co
261b0 6e 73 74 20 63 68 61 72 20 2a 70 32 20 3d 20 66  nst char *p2 = f
261c0 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69  ts5ConfigSkipWhi
261d0 74 65 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20  tespace(p);..   
261e0 20 20 20 20 20 20 20 69 66 28 20 2a 70 32 3d 3d         if( *p2==
261f0 27 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20  '\'' ){..       
26200 20 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e       p = fts5Con
26210 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c 28 70  figSkipLiteral(p
26220 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  2);..          }
26230 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20  else{..         
26240 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
26250 67 53 6b 69 70 42 61 72 65 77 6f 72 64 28 70 32  gSkipBareword(p2
26260 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
26270 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26280 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
26290 20 6d 65 6d 63 70 79 28 70 53 70 61 63 65 2c 20   memcpy(pSpace, 
262a0 70 32 2c 20 70 2d 70 32 29 3b 0d 0a 20 20 20 20  p2, p-p2);..    
262b0 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41          azArg[nA
262c0 72 67 5d 20 3d 20 70 53 70 61 63 65 3b 0d 0a 20  rg] = pSpace;.. 
262d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
262e0 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 70 53  e3Fts5Dequote(pS
262f0 70 61 63 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  pace);..        
26300 20 20 20 20 70 53 70 61 63 65 20 2b 3d 20 28 70      pSpace += (p
26310 20 2d 20 70 32 29 20 2b 20 31 3b 0d 0a 20 20 20   - p2) + 1;..   
26320 20 20 20 20 20 20 20 20 20 70 20 3d 20 66 74 73           p = fts
26330 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
26340 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 20  space(p);..     
26350 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26360 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
26370 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
26380 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
26390 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 61 72 73  e3_mprintf("pars
263a0 65 20 65 72 72 6f 72 20 69 6e 20 74 6f 6b 65 6e  e error in token
263b0 69 7a 65 20 64 69 72 65 63 74 69 76 65 22 29 3b  ize directive");
263c0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ..          rc =
263d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
263e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a          }else{..
263f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26400 71 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b  qlite3Fts5GetTok
26410 65 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20  enizer(pGlobal, 
26420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26430 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 61 7a  (const char**)az
26440 41 72 67 2c 20 6e 41 72 67 2c 20 26 70 43 6f 6e  Arg, nArg, &pCon
26450 66 69 67 2d 3e 70 54 6f 6b 2c 20 26 70 43 6f 6e  fig->pTok, &pCon
26460 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2c 0d 0a 20  fig->pTokApi,.. 
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 7a 45               pzE
26480 72 72 0d 0a 20 20 20 20 20 20 20 20 20 20 29 3b  rr..          );
26490 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
264a0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
264b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
264c0 61 7a 41 72 67 29 3b 0d 0a 20 20 20 20 73 71 6c  azArg);..    sql
264d0 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c 29 3b  ite3_free(pDel);
264e0 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ..    return rc;
264f0 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73  ..  }....  if( s
26500 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
26510 22 63 6f 6e 74 65 6e 74 22 2c 20 7a 43 6d 64 2c  "content", zCmd,
26520 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20   nCmd)==0 ){..  
26530 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65    if( pConfig->e
26540 43 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f  Content!=FTS5_CO
26550 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0d  NTENT_NORMAL ){.
26560 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  .      *pzErr = 
26570 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26580 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 74 65 6e  "multiple conten
26590 74 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73  t=... directives
265a0 22 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20  ");..      rc = 
265b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
265c0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
265d0 20 69 66 28 20 7a 41 72 67 5b 30 5d 20 29 7b 0d   if( zArg[0] ){.
265e0 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67  .        pConfig
265f0 2d 3e 65 43 6f 6e 74 65 6e 74 20 3d 20 46 54 53  ->eContent = FTS
26600 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e  5_CONTENT_EXTERN
26610 41 4c 3b 0d 0a 20 20 20 20 20 20 20 20 70 43 6f  AL;..        pCo
26620 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 20 3d  nfig->zContent =
26630 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69   sqlite3Fts5Mpri
26640 6e 74 66 28 26 72 63 2c 20 22 25 51 2e 25 51 22  ntf(&rc, "%Q.%Q"
26650 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 7a  , pConfig->zDb,z
26660 41 72 67 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c  Arg);..      }el
26670 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 70 43 6f  se{..        pCo
26680 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 20 3d  nfig->eContent =
26690 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
266a0 4e 45 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  NE;..      }..  
266b0 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
266c0 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66  rc;..  }....  if
266d0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
266e0 6d 70 28 22 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  mp("content_rowi
266f0 64 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d  d", zCmd, nCmd)=
26700 3d 30 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70  =0 ){..    if( p
26710 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74  Config->zContent
26720 52 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20  Rowid ){..      
26730 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
26740 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c 74 69 70  _mprintf("multip
26750 6c 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64  le content_rowid
26760 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73 22  =... directives"
26770 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53  );..      rc = S
26780 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
26790 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
267a0 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e  pConfig->zConten
267b0 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  tRowid = sqlite3
267c0 46 74 73 35 53 74 72 6e 64 75 70 28 26 72 63 2c  Fts5Strndup(&rc,
267d0 20 7a 41 72 67 2c 20 2d 31 29 3b 0d 0a 20 20 20   zArg, -1);..   
267e0 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 72   }..    return r
267f0 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28  c;..  }....  if(
26800 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
26810 70 28 22 63 6f 6c 75 6d 6e 73 69 7a 65 22 2c 20  p("columnsize", 
26820 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29  zCmd, nCmd)==0 )
26830 7b 0d 0a 20 20 20 20 69 66 28 20 28 7a 41 72 67  {..    if( (zArg
26840 5b 30 5d 21 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]!='0' && zArg
26850 5b 30 5d 21 3d 27 31 27 29 20 7c 7c 20 7a 41 72  [0]!='1') || zAr
26860 67 5b 31 5d 21 3d 27 5c 30 27 20 29 7b 0d 0a 20  g[1]!='\0' ){.. 
26870 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
26880 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
26890 61 6c 66 6f 72 6d 65 64 20 63 6f 6c 75 6d 6e 73  alformed columns
268a0 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76  ize=... directiv
268b0 65 22 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d  e");..      rc =
268c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
268d0 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
268e0 20 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75    pConfig->bColu
268f0 6d 6e 73 69 7a 65 20 3d 20 28 7a 41 72 67 5b 30  mnsize = (zArg[0
26900 5d 3d 3d 27 31 27 29 3b 0d 0a 20 20 20 20 7d 0d  ]=='1');..    }.
26910 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  .    return rc;.
26920 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71  .  }....  if( sq
26930 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
26940 64 65 74 61 69 6c 22 2c 20 7a 43 6d 64 2c 20 6e  detail", zCmd, n
26950 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Cmd)==0 ){..    
26960 63 6f 6e 73 74 20 46 74 73 35 45 6e 75 6d 20 61  const Fts5Enum a
26970 44 65 74 61 69 6c 5b 5d 20 3d 20 7b 0d 0a 20 20  Detail[] = {..  
26980 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 46 54      { "none", FT
26990 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 7d  S5_DETAIL_NONE }
269a0 2c 0d 0a 20 20 20 20 20 20 7b 20 22 66 75 6c 6c  ,..      { "full
269b0 22 2c 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  ", FTS5_DETAIL_F
269c0 55 4c 4c 20 7d 2c 0d 0a 20 20 20 20 20 20 7b 20  ULL },..      { 
269d0 22 63 6f 6c 75 6d 6e 73 22 2c 20 46 54 53 35 5f  "columns", FTS5_
269e0 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 7d  DETAIL_COLUMNS }
269f0 2c 0d 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20  ,..      { 0, 0 
26a00 7d 0d 0a 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20  }..    };....   
26a10 20 69 66 28 20 28 72 63 20 3d 20 66 74 73 35 43   if( (rc = fts5C
26a20 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28 61 44 65  onfigSetEnum(aDe
26a30 74 61 69 6c 2c 20 7a 41 72 67 2c 20 26 70 43 6f  tail, zArg, &pCo
26a40 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 29 29 20  nfig->eDetail)) 
26a50 29 7b 0d 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  ){..      *pzErr
26a60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
26a70 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 64 65  tf("malformed de
26a80 74 61 69 6c 3d 2e 2e 2e 20 64 69 72 65 63 74 69  tail=... directi
26a90 76 65 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  ve");..    }..  
26aa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20    return rc;..  
26ab0 7d 0d 0a 0d 0a 20 20 2a 70 7a 45 72 72 20 3d 20  }....  *pzErr = 
26ac0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26ad0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
26ae0 74 69 6f 6e 3a 20 5c 22 25 2e 2a 73 5c 22 22 2c  tion: \"%.*s\"",
26af0 20 6e 43 6d 64 2c 20 7a 43 6d 64 29 3b 0d 0a 20   nCmd, zCmd);.. 
26b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
26b10 52 52 4f 52 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  RROR;..}..../*..
26b20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 69  ** Allocate an i
26b30 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 64  nstance of the d
26b40 65 66 61 75 6c 74 20 74 6f 6b 65 6e 69 7a 65 72  efault tokenizer
26b50 20 28 22 73 69 6d 70 6c 65 22 29 20 61 74 20 0d   ("simple") at .
26b60 0a 2a 2a 20 46 74 73 35 43 6f 6e 66 69 67 2e 70  .** Fts5Config.p
26b70 54 6f 6b 65 6e 69 7a 65 72 2e 20 52 65 74 75 72  Tokenizer. Retur
26b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
26b90 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
26ba0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0d 0a 2a   SQLite error..*
26bb0 2a 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  * code if an err
26bc0 6f 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a  or occurs...*/..
26bd0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
26be0 6f 6e 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65  onfigDefaultToke
26bf0 6e 69 7a 65 72 28 46 74 73 35 47 6c 6f 62 61 6c  nizer(Fts5Global
26c00 20 2a 70 47 6c 6f 62 61 6c 2c 20 46 74 73 35 43   *pGlobal, Fts5C
26c10 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b  onfig *pConfig){
26c20 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e  ..  assert( pCon
26c30 66 69 67 2d 3e 70 54 6f 6b 3d 3d 30 20 26 26 20  fig->pTok==0 && 
26c40 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69  pConfig->pTokApi
26c50 3d 3d 30 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e  ==0 );..  return
26c60 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 54   sqlite3Fts5GetT
26c70 6f 6b 65 6e 69 7a 65 72 28 0d 0a 20 20 20 20 20  okenizer(..     
26c80 20 70 47 6c 6f 62 61 6c 2c 20 30 2c 20 30 2c 20   pGlobal, 0, 0, 
26c90 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 2c 20  &pConfig->pTok, 
26ca0 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70  &pConfig->pTokAp
26cb0 69 2c 20 30 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d  i, 0..  );..}...
26cc0 0a 2f 2a 0d 0a 2a 2a 20 47 6f 62 62 6c 65 20 75  ./*..** Gobble u
26cd0 70 20 74 68 65 20 66 69 72 73 74 20 62 61 72 65  p the first bare
26ce0 77 6f 72 64 20 6f 72 20 71 75 6f 74 65 64 20 77  word or quoted w
26cf0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ord from the inp
26d00 75 74 20 62 75 66 66 65 72 20 7a 49 6e 2e 0d 0a  ut buffer zIn...
26d10 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
26d20 74 65 72 20 74 6f 20 74 68 65 20 63 68 61 72 61  ter to the chara
26d30 63 74 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  cter immediately
26d40 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
26d50 61 73 74 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 67  ast in..** the g
26d60 6f 62 62 6c 65 64 20 77 6f 72 64 20 69 66 20 73  obbled word if s
26d70 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 20  uccessful, or a 
26d80 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 74 68  NULL pointer oth
26d90 65 72 77 69 73 65 20 28 66 61 69 6c 65 64 0d 0a  erwise (failed..
26da0 2a 2a 20 74 6f 20 66 69 6e 64 20 63 6c 6f 73 65  ** to find close
26db0 2d 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72  -quote character
26dc0 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 42 65 66 6f 72  )...**..** Befor
26dd0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  e returning, set
26de0 20 70 7a 4f 75 74 20 74 6f 20 70 6f 69 6e 74 20   pzOut to point 
26df0 74 6f 20 61 20 6e 65 77 20 62 75 66 66 65 72 20  to a new buffer 
26e00 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0d 0a 2a 2a  containing a..**
26e10 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2c   nul-terminated,
26e20 20 64 65 71 75 6f 74 65 64 20 63 6f 70 79 20 6f   dequoted copy o
26e30 66 20 74 68 65 20 67 6f 62 62 6c 65 64 20 77 6f  f the gobbled wo
26e40 72 64 2e 20 49 66 20 74 68 65 20 77 6f 72 64 20  rd. If the word 
26e50 77 61 73 0d 0a 2a 2a 20 71 75 6f 74 65 64 2c 20  was..** quoted, 
26e60 2a 70 62 51 75 6f 74 65 64 20 69 73 20 61 6c 73  *pbQuoted is als
26e70 6f 20 73 65 74 20 74 6f 20 31 20 62 65 66 6f 72  o set to 1 befor
26e80 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a  e returning...**
26e90 0d 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  ..** If *pRc is 
26ea0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
26eb0 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
26ec0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26ed0 64 2c 20 69 74 20 69 73 0d 0a 2a 2a 20 61 20 6e  d, it is..** a n
26ee0 6f 2d 6f 70 20 28 4e 55 4c 4c 20 69 73 20 72 65  o-op (NULL is re
26ef0 74 75 72 6e 65 64 29 2e 20 4f 74 68 65 72 77 69  turned). Otherwi
26f00 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63  se, if an OOM oc
26f10 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73  curs within this
26f20 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 2a  ..** function, *
26f30 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
26f40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72  LITE_NOMEM befor
26f50 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 70 52  e returning. *pR
26f60 63 20 69 73 20 2a 6e 6f 74 2a 0d 0a 2a 2a 20 73  c is *not*..** s
26f70 65 74 20 69 66 20 61 20 70 61 72 73 65 20 65 72  et if a parse er
26f80 72 6f 72 20 28 66 61 69 6c 65 64 20 74 6f 20 66  ror (failed to f
26f90 69 6e 64 20 63 6c 6f 73 65 20 71 75 6f 74 65 29  ind close quote)
26fa0 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74   occurs...*/..st
26fb0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
26fc0 2a 66 74 73 35 43 6f 6e 66 69 67 47 6f 62 62 6c  *fts5ConfigGobbl
26fd0 65 57 6f 72 64 28 0d 0a 20 20 69 6e 74 20 2a 70  eWord(..  int *p
26fe0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
26ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
27000 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
27010 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
27020 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20   *zIn,          
27030 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
27040 74 6f 20 67 6f 62 62 6c 65 20 73 74 72 69 6e 67  to gobble string
27050 2f 62 61 72 65 77 6f 72 64 20 66 72 6f 6d 20 2a  /bareword from *
27060 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 4f 75  /..  char **pzOu
27070 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
27080 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 6d 61 6c       /* OUT: mal
27090 6c 6f 63 27 64 20 62 75 66 66 65 72 20 63 6f 6e  loc'd buffer con
270a0 74 61 69 6e 69 6e 67 20 73 74 72 2f 62 77 20 2a  taining str/bw *
270b0 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 51 75 6f 74  /..  int *pbQuot
270c0 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
270d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
270e0 20 74 6f 20 74 72 75 65 20 69 66 20 64 65 71 75   to true if dequ
270f0 6f 74 69 6e 67 20 72 65 71 75 69 72 65 64 20 2a  oting required *
27100 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 63  /..){..  const c
27110 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0d 0a  har *zRet = 0;..
27120 0d 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 28 69  ..  int nIn = (i
27130 6e 74 29 73 74 72 6c 65 6e 28 7a 49 6e 29 3b 0d  nt)strlen(zIn);.
27140 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  .  char *zOut = 
27150 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
27160 49 6e 2b 31 29 3b 0d 0a 0d 0a 20 20 61 73 73 65  In+1);....  asse
27170 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  rt( *pRc==SQLITE
27180 5f 4f 4b 20 29 3b 0d 0a 20 20 2a 70 62 51 75 6f  _OK );..  *pbQuo
27190 74 65 64 20 3d 20 30 3b 0d 0a 20 20 2a 70 7a 4f  ted = 0;..  *pzO
271a0 75 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28  ut = 0;....  if(
271b0 20 7a 4f 75 74 3d 3d 30 20 29 7b 0d 0a 20 20 20   zOut==0 ){..   
271c0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
271d0 4f 4d 45 4d 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d  OMEM;..  }else{.
271e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74  .    memcpy(zOut
271f0 2c 20 7a 49 6e 2c 20 6e 49 6e 2b 31 29 3b 0d 0a  , zIn, nIn+1);..
27200 20 20 20 20 69 66 28 20 66 74 73 35 5f 69 73 6f      if( fts5_iso
27210 70 65 6e 71 75 6f 74 65 28 7a 4f 75 74 5b 30 5d  penquote(zOut[0]
27220 29 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20  ) ){..      int 
27230 69 69 20 3d 20 66 74 73 35 44 65 71 75 6f 74 65  ii = fts5Dequote
27240 28 7a 4f 75 74 29 3b 0d 0a 20 20 20 20 20 20 7a  (zOut);..      z
27250 52 65 74 20 3d 20 26 7a 49 6e 5b 69 69 5d 3b 0d  Ret = &zIn[ii];.
27260 0a 20 20 20 20 20 20 2a 70 62 51 75 6f 74 65 64  .      *pbQuoted
27270 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65   = 1;..    }else
27280 7b 0d 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  {..      zRet = 
27290 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 42 61  fts5ConfigSkipBa
272a0 72 65 77 6f 72 64 28 7a 49 6e 29 3b 0d 0a 20 20  reword(zIn);..  
272b0 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0d      if( zRet ){.
272c0 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 7a 52  .        zOut[zR
272d0 65 74 2d 7a 49 6e 5d 20 3d 20 27 5c 30 27 3b 0d  et-zIn] = '\0';.
272e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
272f0 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 7a 52  .  }....  if( zR
27300 65 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71  et==0 ){..    sq
27310 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
27320 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
27330 20 2a 70 7a 4f 75 74 20 3d 20 7a 4f 75 74 3b 0d   *pzOut = zOut;.
27340 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  .  }....  return
27350 20 7a 52 65 74 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61   zRet;..}....sta
27360 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66  tic int fts5Conf
27370 69 67 50 61 72 73 65 43 6f 6c 75 6d 6e 28 0d 0a  igParseColumn(..
27380 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 2c    Fts5Config *p,
27390 20 0d 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 2c   ..  char *zCol,
273a0 20 0d 0a 20 20 63 68 61 72 20 2a 7a 41 72 67 2c   ..  char *zArg,
273b0 20 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72   ..  char **pzEr
273c0 72 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  r..){..  int rc 
273d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
273e0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
273f0 74 72 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53  tricmp(zCol, FTS
27400 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 20 0d 0a 20  5_RANK_NAME) .. 
27410 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f    || 0==sqlite3_
27420 73 74 72 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54  stricmp(zCol, FT
27430 53 35 5f 52 4f 57 49 44 5f 4e 41 4d 45 29 20 0d  S5_ROWID_NAME) .
27440 0a 20 20 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72  .  ){..    *pzEr
27450 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
27460 6e 74 66 28 22 72 65 73 65 72 76 65 64 20 66 74  ntf("reserved ft
27470 73 35 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  s5 column name: 
27480 25 73 22 2c 20 7a 43 6f 6c 29 3b 0d 0a 20 20 20  %s", zCol);..   
27490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
274a0 4f 52 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28  OR;..  }else if(
274b0 20 7a 41 72 67 20 29 7b 0d 0a 20 20 20 20 69 66   zArg ){..    if
274c0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
274d0 69 63 6d 70 28 7a 41 72 67 2c 20 22 75 6e 69 6e  icmp(zArg, "unin
274e0 64 65 78 65 64 22 29 20 29 7b 0d 0a 20 20 20 20  dexed") ){..    
274f0 20 20 70 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64    p->abUnindexed
27500 5b 70 2d 3e 6e 43 6f 6c 5d 20 3d 20 31 3b 0d 0a  [p->nCol] = 1;..
27510 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
27520 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
27530 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 72 65  e3_mprintf("unre
27540 63 6f 67 6e 69 7a 65 64 20 63 6f 6c 75 6d 6e 20  cognized column 
27550 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 41 72  option: %s", zAr
27560 67 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20  g);..      rc = 
27570 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
27580 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70     }..  }....  p
27590 2d 3e 61 7a 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b  ->azCol[p->nCol+
275a0 2b 5d 20 3d 20 7a 43 6f 6c 3b 0d 0a 20 20 72 65  +] = zCol;..  re
275b0 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f  turn rc;..}..../
275c0 2a 0d 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  *..** Populate t
275d0 68 65 20 46 74 73 35 43 6f 6e 66 69 67 2e 7a 43  he Fts5Config.zC
275e0 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 20 73  ontentExprlist s
275f0 74 72 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  tring...*/..stat
27600 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69  ic int fts5Confi
27610 67 4d 61 6b 65 45 78 70 72 6c 69 73 74 28 46 74  gMakeExprlist(Ft
27620 73 35 43 6f 6e 66 69 67 20 2a 70 29 7b 0d 0a 20  s5Config *p){.. 
27630 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72   int i;..  int r
27640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
27650 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
27660 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0d 0a 0d   = {0, 0, 0};...
27670 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
27680 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
27690 28 26 72 63 2c 20 26 62 75 66 2c 20 22 54 2e 25  (&rc, &buf, "T.%
276a0 51 22 2c 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 52  Q", p->zContentR
276b0 6f 77 69 64 29 3b 0d 0a 20 20 69 66 28 20 70 2d  owid);..  if( p-
276c0 3e 65 43 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f  >eContent!=FTS5_
276d0 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 29 7b 0d  CONTENT_NONE ){.
276e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
276f0 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0d 0a  p->nCol; i++){..
27700 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 43 6f        if( p->eCo
27710 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54  ntent==FTS5_CONT
27720 45 4e 54 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0d  ENT_EXTERNAL ){.
27730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27740 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
27750 50 72 69 6e 74 66 28 26 72 63 2c 20 26 62 75 66  Printf(&rc, &buf
27760 2c 20 22 2c 20 54 2e 25 51 22 2c 20 70 2d 3e 61  , ", T.%Q", p->a
27770 7a 43 6f 6c 5b 69 5d 29 3b 0d 0a 20 20 20 20 20  zCol[i]);..     
27780 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
27790 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
277a0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
277b0 72 63 2c 20 26 62 75 66 2c 20 22 2c 20 54 2e 63  rc, &buf, ", T.c
277c0 25 64 22 2c 20 69 29 3b 0d 0a 20 20 20 20 20 20  %d", i);..      
277d0 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
277e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43  .  assert( p->zC
277f0 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 3d 3d  ontentExprlist==
27800 30 20 29 3b 0d 0a 20 20 70 2d 3e 7a 43 6f 6e 74  0 );..  p->zCont
27810 65 6e 74 45 78 70 72 6c 69 73 74 20 3d 20 28 63  entExprlist = (c
27820 68 61 72 2a 29 62 75 66 2e 70 3b 0d 0a 20 20 72  har*)buf.p;..  r
27830 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
27840 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  /*..** Arguments
27850 20 6e 41 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74   nArg/azArg cont
27860 61 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61  ain the string a
27870 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
27880 74 6f 20 74 68 65 20 78 43 72 65 61 74 65 0d 0a  to the xCreate..
27890 2a 2a 20 6f 72 20 78 43 6f 6e 6e 65 63 74 20 6d  ** or xConnect m
278a0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
278b0 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
278c0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
278d0 74 73 20 74 6f 20 0d 0a 2a 2a 20 61 6c 6c 6f 63  ts to ..** alloc
278e0 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ate an instance 
278f0 6f 66 20 46 74 73 35 43 6f 6e 66 69 67 20 63 6f  of Fts5Config co
27900 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73  ntaining the res
27910 75 6c 74 73 20 6f 66 20 70 61 72 73 69 6e 67 0d  ults of parsing.
27920 0a 2a 2a 20 74 68 6f 73 65 20 61 72 67 75 6d 65  .** those argume
27930 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20  nts...**..** If 
27940 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
27950 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27960 64 20 61 6e 64 20 2a 70 70 4f 75 74 20 69 73 20  d and *ppOut is 
27970 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
27980 74 68 65 0d 0a 2a 2a 20 6e 65 77 20 46 74 73 35  the..** new Fts5
27990 43 6f 6e 66 69 67 20 6f 62 6a 65 63 74 2e 20 49  Config object. I
279a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
279b0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
279c0 6f 72 20 63 6f 64 65 20 69 73 20 0d 0a 2a 2a 20  or code is ..** 
279d0 72 65 74 75 72 6e 65 64 2c 20 2a 70 70 4f 75 74  returned, *ppOut
279e0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
279f0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
27a00 73 61 67 65 20 6d 61 79 20 62 65 20 6c 65 66 74  sage may be left
27a10 20 69 6e 0d 0a 2a 2a 20 2a 70 7a 45 72 72 2e 20   in..** *pzErr. 
27a20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
27a30 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
27a40 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
27a50 61 6c 6c 79 20 66 72 65 65 20 61 6e 79 20 0d 0a  ally free any ..
27a60 2a 2a 20 73 75 63 68 20 65 72 72 6f 72 20 6d 65  ** such error me
27a70 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
27a80 74 65 33 5f 66 72 65 65 28 29 2e 0d 0a 2a 2f 0d  te3_free()...*/.
27a90 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
27aa0 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
27ab0 73 65 28 0d 0a 20 20 46 74 73 35 47 6c 6f 62 61  se(..  Fts5Globa
27ac0 6c 20 2a 70 47 6c 6f 62 61 6c 2c 0d 0a 20 20 73  l *pGlobal,..  s
27ad0 71 6c 69 74 65 33 20 2a 64 62 2c 0d 0a 20 20 69  qlite3 *db,..  i
27ae0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
27b10 6d 65 6e 74 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73  ments */..  cons
27b20 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  t char **azArg, 
27b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27b40 72 72 61 79 20 6f 66 20 6e 41 72 67 20 43 52 45  rray of nArg CRE
27b50 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
27b60 45 20 61 72 67 73 20 2a 2f 0d 0a 20 20 46 74 73  E args */..  Fts
27b70 35 43 6f 6e 66 69 67 20 2a 2a 70 70 4f 75 74 2c  5Config **ppOut,
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b90 4f 55 54 3a 20 52 65 73 75 6c 74 73 20 6f 66 20  OUT: Results of 
27ba0 70 61 72 73 65 20 2a 2f 0d 0a 20 20 63 68 61 72  parse */..  char
27bb0 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20   **pzErr        
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27bd0 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
27be0 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  e */..){..  int 
27bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27c10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20  eturn code */.. 
27c20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 52 65   Fts5Config *pRe
27c30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27c40 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 74   /* New object t
27c50 6f 20 72 65 74 75 72 6e 20 2a 2f 0d 0a 20 20 69  o return */..  i
27c60 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 6e 42 79  nt i;..  int nBy
27c70 74 65 3b 0d 0a 0d 0a 20 20 2a 70 70 4f 75 74 20  te;....  *ppOut 
27c80 3d 20 70 52 65 74 20 3d 20 28 46 74 73 35 43 6f  = pRet = (Fts5Co
27c90 6e 66 69 67 2a 29 73 71 6c 69 74 65 33 5f 6d 61  nfig*)sqlite3_ma
27ca0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
27cb0 43 6f 6e 66 69 67 29 29 3b 0d 0a 20 20 69 66 28  Config));..  if(
27cc0 20 70 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72   pRet==0 ) retur
27cd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d  n SQLITE_NOMEM;.
27ce0 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20  .  memset(pRet, 
27cf0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f  0, sizeof(Fts5Co
27d00 6e 66 69 67 29 29 3b 0d 0a 20 20 70 52 65 74 2d  nfig));..  pRet-
27d10 3e 64 62 20 3d 20 64 62 3b 0d 0a 20 20 70 52 65  >db = db;..  pRe
27d20 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 2d 31 3b  t->iCookie = -1;
27d30 0d 0a 0d 0a 20 20 6e 42 79 74 65 20 3d 20 6e 41  ....  nByte = nA
27d40 72 67 20 2a 20 28 73 69 7a 65 6f 66 28 63 68 61  rg * (sizeof(cha
27d50 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 75 38 29  r*) + sizeof(u8)
27d60 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 61 7a 43 6f  );..  pRet->azCo
27d70 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69  l = (char**)sqli
27d80 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
27d90 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0d 0a  o(&rc, nByte);..
27da0 20 20 70 52 65 74 2d 3e 61 62 55 6e 69 6e 64 65    pRet->abUninde
27db0 78 65 64 20 3d 20 28 75 38 2a 29 26 70 52 65 74  xed = (u8*)&pRet
27dc0 2d 3e 61 7a 43 6f 6c 5b 6e 41 72 67 5d 3b 0d 0a  ->azCol[nArg];..
27dd0 20 20 70 52 65 74 2d 3e 7a 44 62 20 3d 20 73 71    pRet->zDb = sq
27de0 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
27df0 28 26 72 63 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  (&rc, azArg[1], 
27e00 2d 31 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 7a 4e  -1);..  pRet->zN
27e10 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  ame = sqlite3Fts
27e20 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 61 7a  5Strndup(&rc, az
27e30 41 72 67 5b 32 5d 2c 20 2d 31 29 3b 0d 0a 20 20  Arg[2], -1);..  
27e40 70 52 65 74 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a  pRet->bColumnsiz
27e50 65 20 3d 20 31 3b 0d 0a 20 20 70 52 65 74 2d 3e  e = 1;..  pRet->
27e60 65 44 65 74 61 69 6c 20 3d 20 46 54 53 35 5f 44  eDetail = FTS5_D
27e70 45 54 41 49 4c 5f 46 55 4c 4c 3b 0d 0a 23 69 66  ETAIL_FULL;..#if
27e80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
27e90 0d 0a 20 20 70 52 65 74 2d 3e 62 50 72 65 66 69  ..  pRet->bPrefi
27ea0 78 49 6e 64 65 78 20 3d 20 31 3b 0d 0a 23 65 6e  xIndex = 1;..#en
27eb0 64 69 66 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
27ec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
27ed0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 52 65 74  te3_stricmp(pRet
27ee0 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53 35 5f 52 41  ->zName, FTS5_RA
27ef0 4e 4b 5f 4e 41 4d 45 29 3d 3d 30 20 29 7b 0d 0a  NK_NAME)==0 ){..
27f00 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
27f10 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 65  ite3_mprintf("re
27f20 73 65 72 76 65 64 20 66 74 73 35 20 74 61 62 6c  served fts5 tabl
27f30 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 70 52 65  e name: %s", pRe
27f40 74 2d 3e 7a 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  t->zName);..    
27f50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
27f60 52 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 6f 72  R;..  }....  for
27f70 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=3; rc==SQLITE
27f80 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69  _OK && i<nArg; i
27f90 2b 2b 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20  ++){..    const 
27fa0 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 61 7a  char *zOrig = az
27fb0 41 72 67 5b 69 5d 3b 0d 0a 20 20 20 20 63 6f 6e  Arg[i];..    con
27fc0 73 74 20 63 68 61 72 20 2a 7a 3b 0d 0a 20 20 20  st char *z;..   
27fd0 20 63 68 61 72 20 2a 7a 4f 6e 65 20 3d 20 30 3b   char *zOne = 0;
27fe0 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 77 6f  ..    char *zTwo
27ff0 20 3d 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 62   = 0;..    int b
28000 4f 70 74 69 6f 6e 20 3d 20 30 3b 0d 0a 20 20 20  Option = 0;..   
28010 20 69 6e 74 20 62 4d 75 73 74 42 65 43 6f 6c 20   int bMustBeCol 
28020 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 7a 20 3d 20  = 0;....    z = 
28030 66 74 73 35 43 6f 6e 66 69 67 47 6f 62 62 6c 65  fts5ConfigGobble
28040 57 6f 72 64 28 26 72 63 2c 20 7a 4f 72 69 67 2c  Word(&rc, zOrig,
28050 20 26 7a 4f 6e 65 2c 20 26 62 4d 75 73 74 42 65   &zOne, &bMustBe
28060 43 6f 6c 29 3b 0d 0a 20 20 20 20 7a 20 3d 20 66  Col);..    z = f
28070 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69  ts5ConfigSkipWhi
28080 74 65 73 70 61 63 65 28 7a 29 3b 0d 0a 20 20 20  tespace(z);..   
28090 20 69 66 28 20 7a 20 26 26 20 2a 7a 3d 3d 27 3d   if( z && *z=='=
280a0 27 20 29 7b 0d 0a 20 20 20 20 20 20 62 4f 70 74  ' ){..      bOpt
280b0 69 6f 6e 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  ion = 1;..      
280c0 7a 2b 2b 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  z++;..      if( 
280d0 62 4d 75 73 74 42 65 43 6f 6c 20 29 20 7a 20 3d  bMustBeCol ) z =
280e0 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20   0;..    }..    
280f0 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  z = fts5ConfigSk
28100 69 70 57 68 69 74 65 73 70 61 63 65 28 7a 29 3b  ipWhitespace(z);
28110 0d 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20 7a  ..    if( z && z
28120 5b 30 5d 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e  [0] ){..      in
28130 74 20 62 44 75 6d 6d 79 3b 0d 0a 20 20 20 20 20  t bDummy;..     
28140 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 47   z = fts5ConfigG
28150 6f 62 62 6c 65 57 6f 72 64 28 26 72 63 2c 20 7a  obbleWord(&rc, z
28160 2c 20 26 7a 54 77 6f 2c 20 26 62 44 75 6d 6d 79  , &zTwo, &bDummy
28170 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 7a 20  );..      if( z 
28180 26 26 20 7a 5b 30 5d 20 29 20 7a 20 3d 20 30 3b  && z[0] ) z = 0;
28190 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
281a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
281b0 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 7a   ){..      if( z
281c0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
281d0 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
281e0 5f 6d 70 72 69 6e 74 66 28 22 70 61 72 73 65 20  _mprintf("parse 
281f0 65 72 72 6f 72 20 69 6e 20 5c 22 25 73 5c 22 22  error in \"%s\""
28200 2c 20 7a 4f 72 69 67 29 3b 0d 0a 20 20 20 20 20  , zOrig);..     
28210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
28220 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 7d 65 6c  RROR;..      }el
28230 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  se{..        if(
28240 20 62 4f 70 74 69 6f 6e 20 29 7b 0d 0a 20 20 20   bOption ){..   
28250 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
28260 43 6f 6e 66 69 67 50 61 72 73 65 53 70 65 63 69  ConfigParseSpeci
28270 61 6c 28 70 47 6c 6f 62 61 6c 2c 20 70 52 65 74  al(pGlobal, pRet
28280 2c 20 7a 4f 6e 65 2c 20 7a 54 77 6f 3f 7a 54 77  , zOne, zTwo?zTw
28290 6f 3a 22 22 2c 20 70 7a 45 72 72 29 3b 0d 0a 20  o:"", pzErr);.. 
282a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20         }else{.. 
282b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
282c0 73 35 43 6f 6e 66 69 67 50 61 72 73 65 43 6f 6c  s5ConfigParseCol
282d0 75 6d 6e 28 70 52 65 74 2c 20 7a 4f 6e 65 2c 20  umn(pRet, zOne, 
282e0 7a 54 77 6f 2c 20 70 7a 45 72 72 29 3b 0d 0a 20  zTwo, pzErr);.. 
282f0 20 20 20 20 20 20 20 20 20 7a 4f 6e 65 20 3d 20           zOne = 
28300 30 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  0;..        }.. 
28310 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
28320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28330 65 28 7a 4f 6e 65 29 3b 0d 0a 20 20 20 20 73 71  e(zOne);..    sq
28340 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 77 6f 29  lite3_free(zTwo)
28350 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49  ;..  }....  /* I
28360 66 20 61 20 74 6f 6b 65 6e 69 7a 65 72 3d 20 6f  f a tokenizer= o
28370 70 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ption was succes
28380 73 66 75 6c 6c 79 20 70 61 72 73 65 64 2c 20 74  sfully parsed, t
28390 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73  he tokenizer has
283a0 0d 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62  ..  ** already b
283b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f  een allocated. O
283c0 74 68 65 72 77 69 73 65 2c 20 61 6c 6c 6f 63 61  therwise, alloca
283d0 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  te an instance o
283e0 66 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20  f the default.. 
283f0 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 20 28 75   ** tokenizer (u
28400 6e 69 63 6f 64 65 36 31 29 20 6e 6f 77 2e 20 20  nicode61) now.  
28410 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
28420 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 2d  LITE_OK && pRet-
28430 3e 70 54 6f 6b 3d 3d 30 20 29 7b 0d 0a 20 20 20  >pTok==0 ){..   
28440 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67   rc = fts5Config
28450 44 65 66 61 75 6c 74 54 6f 6b 65 6e 69 7a 65 72  DefaultTokenizer
28460 28 70 47 6c 6f 62 61 6c 2c 20 70 52 65 74 29 3b  (pGlobal, pRet);
28470 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66  ..  }....  /* If
28480 20 6e 6f 20 7a 43 6f 6e 74 65 6e 74 20 6f 70 74   no zContent opt
28490 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66 69 65  ion was specifie
284a0 64 2c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 64  d, fill in the d
284b0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 20 2a  efault values. *
284c0 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  /..  if( rc==SQL
284d0 49 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 2d 3e  ITE_OK && pRet->
284e0 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0d 0a  zContent==0 ){..
284f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28500 7a 54 61 69 6c 20 3d 20 30 3b 0d 0a 20 20 20 20  zTail = 0;..    
28510 61 73 73 65 72 74 28 20 70 52 65 74 2d 3e 65 43  assert( pRet->eC
28520 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e  ontent==FTS5_CON
28530 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 0d 0a 20 20  TENT_NORMAL ..  
28540 20 20 20 20 20 20 20 7c 7c 20 70 52 65 74 2d 3e         || pRet->
28550 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43  eContent==FTS5_C
28560 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 0d 0a 20 20  ONTENT_NONE ..  
28570 20 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 52    );..    if( pR
28580 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  et->eContent==FT
28590 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
285a0 4c 20 29 7b 0d 0a 20 20 20 20 20 20 7a 54 61 69  L ){..      zTai
285b0 6c 20 3d 20 22 63 6f 6e 74 65 6e 74 22 3b 0d 0a  l = "content";..
285c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
285d0 65 74 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20  et->bColumnsize 
285e0 29 7b 0d 0a 20 20 20 20 20 20 7a 54 61 69 6c 20  ){..      zTail 
285f0 3d 20 22 64 6f 63 73 69 7a 65 22 3b 0d 0a 20 20  = "docsize";..  
28600 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 7a    }....    if( z
28610 54 61 69 6c 20 29 7b 0d 0a 20 20 20 20 20 20 70  Tail ){..      p
28620 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 20 3d 20  Ret->zContent = 
28630 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
28640 74 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20 26  tf(..          &
28650 72 63 2c 20 22 25 51 2e 27 25 71 5f 25 73 27 22  rc, "%Q.'%q_%s'"
28660 2c 20 70 52 65 74 2d 3e 7a 44 62 2c 20 70 52 65  , pRet->zDb, pRe
28670 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 69 6c 0d  t->zName, zTail.
28680 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 7d  .      );..    }
28690 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72  ..  }....  if( r
286a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
286b0 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f  pRet->zContentRo
286c0 77 69 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 70  wid==0 ){..    p
286d0 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77  Ret->zContentRow
286e0 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  id = sqlite3Fts5
286f0 53 74 72 6e 64 75 70 28 26 72 63 2c 20 22 72 6f  Strndup(&rc, "ro
28700 77 69 64 22 2c 20 2d 31 29 3b 0d 0a 20 20 7d 0d  wid", -1);..  }.
28710 0a 0d 0a 20 20 2f 2a 20 46 6f 72 6d 75 6c 61 74  ...  /* Formulat
28720 65 20 74 68 65 20 7a 43 6f 6e 74 65 6e 74 45 78  e the zContentEx
28730 70 72 6c 69 73 74 20 74 65 78 74 20 2a 2f 0d 0a  prlist text */..
28740 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28750 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d  _OK ){..    rc =
28760 20 66 74 73 35 43 6f 6e 66 69 67 4d 61 6b 65 45   fts5ConfigMakeE
28770 78 70 72 6c 69 73 74 28 70 52 65 74 29 3b 0d 0a  xprlist(pRet);..
28780 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 21    }....  if( rc!
28790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
287a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f     sqlite3Fts5Co
287b0 6e 66 69 67 46 72 65 65 28 70 52 65 74 29 3b 0d  nfigFree(pRet);.
287c0 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
287d0 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20  ..  }..  return 
287e0 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rc;..}..../*..**
287f0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 66 69 67   Free the config
28800 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 70  uration object p
28810 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
28820 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d  y argument...*/.
28830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
28840 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 46 72  ite3Fts5ConfigFr
28850 65 65 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ee(Fts5Config *p
28860 43 6f 6e 66 69 67 29 7b 0d 0a 20 20 69 66 28 20  Config){..  if( 
28870 70 43 6f 6e 66 69 67 20 29 7b 0d 0a 20 20 20 20  pConfig ){..    
28880 69 6e 74 20 69 3b 0d 0a 20 20 20 20 69 66 28 20  int i;..    if( 
28890 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b  pConfig->pTok ){
288a0 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ..      pConfig-
288b0 3e 70 54 6f 6b 41 70 69 2d 3e 78 44 65 6c 65 74  >pTokApi->xDelet
288c0 65 28 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 29  e(pConfig->pTok)
288d0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71  ;..    }..    sq
288e0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
288f0 69 67 2d 3e 7a 44 62 29 3b 0d 0a 20 20 20 20 73  ig->zDb);..    s
28900 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
28910 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0d 0a 20 20  fig->zName);..  
28920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
28930 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  nfig->nCol; i++)
28940 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  {..      sqlite3
28950 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61  _free(pConfig->a
28960 7a 43 6f 6c 5b 69 5d 29 3b 0d 0a 20 20 20 20 7d  zCol[i]);..    }
28970 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
28980 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f  ee(pConfig->azCo
28990 6c 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  l);..    sqlite3
289a0 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61  _free(pConfig->a
289b0 50 72 65 66 69 78 29 3b 0d 0a 20 20 20 20 73 71  Prefix);..    sq
289c0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
289d0 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20  ig->zRank);..   
289e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
289f0 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73  onfig->zRankArgs
28a00 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
28a10 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 43  free(pConfig->zC
28a20 6f 6e 74 65 6e 74 29 3b 0d 0a 20 20 20 20 73 71  ontent);..    sq
28a30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
28a40 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69  ig->zContentRowi
28a50 64 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  d);..    sqlite3
28a60 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a  _free(pConfig->z
28a70 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 29  ContentExprlist)
28a80 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ;..    sqlite3_f
28a90 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0d 0a 20  ree(pConfig);.. 
28aa0 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20   }..}..../*..** 
28ab0 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63  Call sqlite3_dec
28ac0 6c 61 72 65 5f 76 74 61 62 28 29 20 62 61 73 65  lare_vtab() base
28ad0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
28ae0 73 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  s of the configu
28af0 72 61 74 69 6f 6e 0d 0a 2a 2a 20 6f 62 6a 65 63  ration..** objec
28b00 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
28b10 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 52  only argument. R
28b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28b30 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
28b40 72 0d 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  r..** an SQLite 
28b50 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
28b60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0d 0a   error occurs...
28b70 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
28b80 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
28b90 44 65 63 6c 61 72 65 56 74 61 62 28 46 74 73 35  DeclareVtab(Fts5
28ba0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29  Config *pConfig)
28bb0 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 69  {..  int i;..  i
28bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28bd0 4b 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  K;..  char *zSql
28be0 3b 0d 0a 0d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  ;....  zSql = sq
28bf0 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
28c00 28 26 72 63 2c 20 22 43 52 45 41 54 45 20 54 41  (&rc, "CREATE TA
28c10 42 4c 45 20 78 28 22 29 3b 0d 0a 20 20 66 6f 72  BLE x(");..  for
28c20 28 69 3d 30 3b 20 7a 53 71 6c 20 26 26 20 69 3c  (i=0; zSql && i<
28c30 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69  pConfig->nCol; i
28c40 2b 2b 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20  ++){..    const 
28c50 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 28 69 3d  char *zSep = (i=
28c60 3d 30 3f 22 22 3a 22 2c 20 22 29 3b 0d 0a 20 20  =0?"":", ");..  
28c70 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
28c80 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
28c90 20 22 25 7a 25 73 25 51 22 2c 20 7a 53 71 6c 2c   "%z%s%Q", zSql,
28ca0 20 7a 53 65 70 2c 20 70 43 6f 6e 66 69 67 2d 3e   zSep, pConfig->
28cb0 61 7a 43 6f 6c 5b 69 5d 29 3b 0d 0a 20 20 7d 0d  azCol[i]);..  }.
28cc0 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
28cd0 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63  3Fts5Mprintf(&rc
28ce0 2c 20 22 25 7a 2c 20 25 51 20 48 49 44 44 45 4e  , "%z, %Q HIDDEN
28cf0 2c 20 25 73 20 48 49 44 44 45 4e 29 22 2c 20 0d  , %s HIDDEN)", .
28d00 0a 20 20 20 20 20 20 7a 53 71 6c 2c 20 70 43 6f  .      zSql, pCo
28d10 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53  nfig->zName, FTS
28d20 35 5f 52 41 4e 4b 5f 4e 41 4d 45 0d 0a 20 20 29  5_RANK_NAME..  )
28d30 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 7a  ;....  assert( z
28d40 53 71 6c 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  Sql || rc==SQLIT
28d50 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 69 66  E_NOMEM );..  if
28d60 28 20 7a 53 71 6c 20 29 7b 0d 0a 20 20 20 20 72  ( zSql ){..    r
28d70 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
28d80 61 72 65 5f 76 74 61 62 28 70 43 6f 6e 66 69 67  are_vtab(pConfig
28d90 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b 0d 0a 20 20  ->db, zSql);..  
28da0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28db0 53 71 6c 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a  Sql);..  }..  ..
28dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
28dd0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 6f 6b 65 6e 69  .../*..** Tokeni
28de0 7a 65 20 74 68 65 20 74 65 78 74 20 70 61 73 73  ze the text pass
28df0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
28e00 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
28e10 6d 65 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54  ments...**..** T
28e20 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  he callback is i
28e30 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
28e40 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
28e50 65 20 69 6e 70 75 74 20 74 65 78 74 2e 20 54 68  e input text. Th
28e60 65 0d 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  e..** arguments 
28e70 70 61 73 73 65 64 20 74 6f 20 69 74 20 61 72 65  passed to it are
28e80 2c 20 69 6e 20 6f 72 64 65 72 3a 0d 0a 2a 2a 0d  , in order:..**.
28e90 0a 2a 2a 20 20 20 20 20 76 6f 69 64 20 2a 70 43  .**     void *pC
28ea0 74 78 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43  tx          // C
28eb0 6f 70 79 20 6f 66 20 34 74 68 20 61 72 67 75 6d  opy of 4th argum
28ec0 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 46 74  ent to sqlite3Ft
28ed0 73 35 54 6f 6b 65 6e 69 7a 65 28 29 0d 0a 2a 2a  s5Tokenize()..**
28ee0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
28ef0 2a 70 54 6f 6b 65 6e 20 20 2f 2f 20 50 6f 69 6e  *pToken  // Poin
28f00 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
28f10 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 0d 0a  ntaining token..
28f20 2a 2a 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  **     int nToke
28f30 6e 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53 69  n          // Si
28f40 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62  ze of token in b
28f50 79 74 65 73 0d 0a 2a 2a 20 20 20 20 20 69 6e 74  ytes..**     int
28f60 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20   iStart         
28f70 20 2f 2f 20 42 79 74 65 20 6f 66 66 73 65 74 20   // Byte offset 
28f80 6f 66 20 73 74 61 72 74 20 6f 66 20 74 6f 6b 65  of start of toke
28f90 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20 74  n within input t
28fa0 65 78 74 0d 0a 2a 2a 20 20 20 20 20 69 6e 74 20  ext..**     int 
28fb0 69 45 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  iEnd            
28fc0 2f 2f 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  // Byte offset o
28fd0 66 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77  f end of token w
28fe0 69 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74  ithin input text
28ff0 0d 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69 50 6f  ..**     int iPo
29000 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  s            // 
29010 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
29020 6e 20 69 6e 20 69 6e 70 75 74 20 28 66 69 72 73  n in input (firs
29030 74 20 74 6f 6b 65 6e 20 69 73 20 30 29 0d 0a 2a  t token is 0)..*
29040 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  *..** If the cal
29050 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61 20  lback returns a 
29060 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 74  non-zero value t
29070 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  he tokenization 
29080 69 73 20 61 62 61 6e 64 6f 6e 65 64 0d 0a 2a 2a  is abandoned..**
29090 20 61 6e 64 20 6e 6f 20 66 75 72 74 68 65 72 20   and no further 
290a0 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 69 73  callbacks are is
290b0 73 75 65 64 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54  sued. ..**..** T
290c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
290d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
290e0 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
290f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
29100 63 6f 64 65 0d 0a 2a 2a 20 69 66 20 61 6e 20 65  code..** if an e
29110 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
29120 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e  the tokenization
29130 20 77 61 73 20 61 62 61 6e 64 6f 6e 65 64 20 65   was abandoned e
29140 61 72 6c 79 20 62 65 63 61 75 73 65 0d 0a 2a 2a  arly because..**
29150 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   the callback re
29160 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 44 4f  turned SQLITE_DO
29170 4e 45 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  NE, this is not 
29180 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 74 68 69  an error and thi
29190 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 73  s function..** s
291a0 74 69 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  till returns SQL
291b0 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74  ITE_OK. Or, if t
291c0 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  he tokenization 
291d0 77 61 73 20 61 62 61 6e 64 6f 6e 65 64 20 65 61  was abandoned ea
291e0 72 6c 79 0d 0a 2a 2a 20 62 65 63 61 75 73 65 20  rly..** because 
291f0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
29200 75 72 6e 65 64 20 61 6e 6f 74 68 65 72 20 6e 6f  urned another no
29210 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74  n-zero value, it
29220 20 69 73 20 61 73 73 75 6d 65 64 0d 0a 2a 2a 20   is assumed..** 
29230 74 6f 20 62 65 20 61 6e 20 53 51 4c 69 74 65 20  to be an SQLite 
29240 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
29250 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
29260 61 6c 6c 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  aller...*/..stat
29270 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
29280 73 35 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20 46  s5Tokenize(..  F
29290 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
292a0 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ig,            /
292b0 2a 20 46 54 53 35 20 43 6f 6e 66 69 67 75 72 61  * FTS5 Configura
292c0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a  tion object */..
292d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 2f 2a 20 46 54 53 35 5f 54 4f 4b 45 4e 49    /* FTS5_TOKENI
29300 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20  ZE_* flags */.. 
29310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
29320 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20  xt, int nText,  
29330 20 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65   /* Text to toke
29340 6e 69 7a 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20  nize */..  void 
29350 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
29360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29370 6e 74 65 78 74 20 70 61 73 73 65 64 20 74 6f 20  ntext passed to 
29380 78 54 6f 6b 65 6e 28 29 20 2a 2f 0d 0a 20 20 69  xToken() */..  i
29390 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69  nt (*xToken)(voi
293a0 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  d*, int, const c
293b0 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  har*, int, int, 
293c0 69 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62  int)    /* Callb
293d0 61 63 6b 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 66  ack */..){..  if
293e0 28 20 70 54 65 78 74 3d 3d 30 20 29 20 72 65 74  ( pText==0 ) ret
293f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  urn SQLITE_OK;..
29400 20 20 72 65 74 75 72 6e 20 70 43 6f 6e 66 69 67    return pConfig
29410 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78 54 6f 6b 65  ->pTokApi->xToke
29420 6e 69 7a 65 28 0d 0a 20 20 20 20 20 20 70 43 6f  nize(..      pCo
29430 6e 66 69 67 2d 3e 70 54 6f 6b 2c 20 70 43 74 78  nfig->pTok, pCtx
29440 2c 20 66 6c 61 67 73 2c 20 70 54 65 78 74 2c 20  , flags, pText, 
29450 6e 54 65 78 74 2c 20 78 54 6f 6b 65 6e 0d 0a 20  nText, xToken.. 
29460 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a   );..}..../*..**
29470 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70 6f   Argument pIn po
29480 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
29490 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 77  t character in w
294a0 68 61 74 20 69 73 20 65 78 70 65 63 74 65 64 20  hat is expected 
294b0 74 6f 20 62 65 0d 0a 2a 2a 20 61 20 63 6f 6d 6d  to be..** a comm
294c0 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a-separated list
294d0 20 6f 66 20 53 51 4c 20 6c 69 74 65 72 61 6c 73   of SQL literals
294e0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27   followed by a '
294f0 29 27 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a  )' character...*
29500 2a 20 49 66 20 69 74 20 61 63 74 75 61 6c 6c 79  * If it actually
29510 20 69 73 20 74 68 69 73 2c 20 72 65 74 75 72 6e   is this, return
29520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29530 65 20 27 29 27 2e 20 4f 74 68 65 72 77 69 73 65  e ')'. Otherwise
29540 2c 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 4e 55 4c  , return..** NUL
29550 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 61 20  L to indicate a 
29560 70 61 72 73 65 20 65 72 72 6f 72 2e 0d 0a 2a 2f  parse error...*/
29570 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
29580 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53  har *fts5ConfigS
29590 6b 69 70 41 72 67 73 28 63 6f 6e 73 74 20 63 68  kipArgs(const ch
295a0 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63 6f 6e  ar *pIn){..  con
295b0 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49 6e  st char *p = pIn
295c0 3b 0d 0a 20 20 0d 0a 20 20 77 68 69 6c 65 28 20  ;..  ..  while( 
295d0 31 20 29 7b 0d 0a 20 20 20 20 70 20 3d 20 66 74  1 ){..    p = ft
295e0 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
295f0 65 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20  espace(p);..    
29600 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
29610 69 70 4c 69 74 65 72 61 6c 28 70 29 3b 0d 0a 20  ipLiteral(p);.. 
29620 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
29630 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28  gSkipWhitespace(
29640 70 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 3d 3d  p);..    if( p==
29650 30 20 7c 7c 20 2a 70 3d 3d 27 29 27 20 29 20 62  0 || *p==')' ) b
29660 72 65 61 6b 3b 0d 0a 20 20 20 20 69 66 28 20 2a  reak;..    if( *
29670 70 21 3d 27 2c 27 20 29 7b 0d 0a 20 20 20 20 20  p!=',' ){..     
29680 20 70 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 62   p = 0;..      b
29690 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  reak;..    }..  
296a0 20 20 70 2b 2b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20    p++;..  }.... 
296b0 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d   return p;..}...
296c0 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ./*..** Paramete
296d0 72 20 7a 49 6e 20 63 6f 6e 74 61 69 6e 73 20 61  r zIn contains a
296e0 20 72 61 6e 6b 28 29 20 66 75 6e 63 74 69 6f 6e   rank() function
296f0 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2e 20   specification. 
29700 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 0d 0a  The format of ..
29710 2a 2a 20 74 68 69 73 20 69 73 3a 0d 0a 2a 2a 0d  ** this is:..**.
29720 0a 2a 2a 20 20 20 2b 20 42 61 72 65 77 6f 72 64  .**   + Bareword
29730 20 28 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 29   (function name)
29740 0d 0a 2a 2a 20 20 20 2b 20 4f 70 65 6e 20 70 61  ..**   + Open pa
29750 72 65 6e 74 68 65 73 69 73 20 2d 20 22 28 22 0d  renthesis - "(".
29760 0a 2a 2a 20 20 20 2b 20 5a 65 72 6f 20 6f 72 20  .**   + Zero or 
29770 6d 6f 72 65 20 53 51 4c 20 6c 69 74 65 72 61 6c  more SQL literal
29780 73 20 69 6e 20 61 20 63 6f 6d 6d 61 20 73 65 70  s in a comma sep
29790 61 72 61 74 65 64 20 6c 69 73 74 0d 0a 2a 2a 20  arated list..** 
297a0 20 20 2b 20 43 6c 6f 73 65 20 70 61 72 65 6e 74    + Close parent
297b0 68 65 73 69 73 20 2d 20 22 29 22 0d 0a 2a 2f 0d  hesis - ")"..*/.
297c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
297d0 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
297e0 73 65 52 61 6e 6b 28 0d 0a 20 20 63 6f 6e 73 74  seRank(..  const
297f0 20 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20   char *zIn,     
29800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29810 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 20  put string */.. 
29820 20 63 68 61 72 20 2a 2a 70 7a 52 61 6e 6b 2c 20   char **pzRank, 
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29840 20 2f 2a 20 4f 55 54 3a 20 52 61 6e 6b 20 66 75   /* OUT: Rank fu
29850 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0d 0a  nction name */..
29860 20 20 63 68 61 72 20 2a 2a 70 7a 52 61 6e 6b 41    char **pzRankA
29870 72 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  rgs             
29880 20 20 2f 2a 20 4f 55 54 3a 20 52 61 6e 6b 20 66    /* OUT: Rank f
29890 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
298a0 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73  s */..){..  cons
298b0 74 20 63 68 61 72 20 2a 70 20 3d 20 7a 49 6e 3b  t char *p = zIn;
298c0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
298d0 70 52 61 6e 6b 3b 0d 0a 20 20 63 68 61 72 20 2a  pRank;..  char *
298e0 7a 52 61 6e 6b 20 3d 20 30 3b 0d 0a 20 20 63 68  zRank = 0;..  ch
298f0 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d 20  ar *zRankArgs = 
29900 30 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  0;..  int rc = S
29910 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 2a  QLITE_OK;....  *
29920 70 7a 52 61 6e 6b 20 3d 20 30 3b 0d 0a 20 20 2a  pzRank = 0;..  *
29930 70 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0d  pzRankArgs = 0;.
29940 0a 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ...  if( p==0 ){
29950 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ..    rc = SQLIT
29960 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 7d 65 6c 73  E_ERROR;..  }els
29970 65 7b 0d 0a 20 20 20 20 70 20 3d 20 66 74 73 35  e{..    p = fts5
29980 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
29990 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 70 52  pace(p);..    pR
299a0 61 6e 6b 20 3d 20 70 3b 0d 0a 20 20 20 20 70 20  ank = p;..    p 
299b0 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70  = fts5ConfigSkip
299c0 42 61 72 65 77 6f 72 64 28 70 29 3b 0d 0a 0d 0a  Bareword(p);....
299d0 20 20 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20      if( p ){..  
299e0 20 20 20 20 7a 52 61 6e 6b 20 3d 20 73 71 6c 69      zRank = sqli
299f0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
29a00 6f 28 26 72 63 2c 20 31 20 2b 20 70 20 2d 20 70  o(&rc, 1 + p - p
29a10 52 61 6e 6b 29 3b 0d 0a 20 20 20 20 20 20 69 66  Rank);..      if
29a20 28 20 7a 52 61 6e 6b 20 29 20 6d 65 6d 63 70 79  ( zRank ) memcpy
29a30 28 7a 52 61 6e 6b 2c 20 70 52 61 6e 6b 2c 20 70  (zRank, pRank, p
29a40 2d 70 52 61 6e 6b 29 3b 0d 0a 20 20 20 20 7d 65  -pRank);..    }e
29a50 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d  lse{..      rc =
29a60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
29a70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28      }....    if(
29a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29a90 7b 0d 0a 20 20 20 20 20 20 70 20 3d 20 66 74 73  {..      p = fts
29aa0 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
29ab0 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 20  space(p);..     
29ac0 20 69 66 28 20 2a 70 21 3d 27 28 27 20 29 20 72   if( *p!='(' ) r
29ad0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29ae0 3b 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20  ;..      p++;.. 
29af0 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
29b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
29b10 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
29b20 20 2a 70 41 72 67 73 3b 20 0d 0a 20 20 20 20 20   *pArgs; ..     
29b30 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
29b40 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
29b50 3b 0d 0a 20 20 20 20 20 20 70 41 72 67 73 20 3d  ;..      pArgs =
29b60 20 70 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 2a   p;..      if( *
29b70 70 21 3d 27 29 27 20 29 7b 0d 0a 20 20 20 20 20  p!=')' ){..     
29b80 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
29b90 67 53 6b 69 70 41 72 67 73 28 70 29 3b 0d 0a 20  gSkipArgs(p);.. 
29ba0 20 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20         if( p==0 
29bb0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63  ){..          rc
29bc0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
29bd0 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..        }else{
29be0 0d 0a 20 20 20 20 20 20 20 20 20 20 7a 52 61 6e  ..          zRan
29bf0 6b 41 72 67 73 20 3d 20 73 71 6c 69 74 65 33 46  kArgs = sqlite3F
29c00 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
29c10 63 2c 20 31 20 2b 20 70 20 2d 20 70 41 72 67 73  c, 1 + p - pArgs
29c20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
29c30 28 20 7a 52 61 6e 6b 41 72 67 73 20 29 20 6d 65  ( zRankArgs ) me
29c40 6d 63 70 79 28 7a 52 61 6e 6b 41 72 67 73 2c 20  mcpy(zRankArgs, 
29c50 70 41 72 67 73 2c 20 70 2d 70 41 72 67 73 29 3b  pArgs, p-pArgs);
29c60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
29c70 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
29c80 0d 0a 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ....  if( rc!=SQ
29c90 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
29ca0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 61  sqlite3_free(zRa
29cb0 6e 6b 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74  nk);..    assert
29cc0 28 20 7a 52 61 6e 6b 41 72 67 73 3d 3d 30 20 29  ( zRankArgs==0 )
29cd0 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
29ce0 20 2a 70 7a 52 61 6e 6b 20 3d 20 7a 52 61 6e 6b   *pzRank = zRank
29cf0 3b 0d 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 41 72  ;..    *pzRankAr
29d00 67 73 20 3d 20 7a 52 61 6e 6b 41 72 67 73 3b 0d  gs = zRankArgs;.
29d10 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
29d20 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  c;..}....static 
29d30 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
29d40 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28 0d 0a  onfigSetValue(..
29d50 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
29d60 6f 6e 66 69 67 2c 20 0d 0a 20 20 63 6f 6e 73 74  onfig, ..  const
29d70 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 0d 0a 20   char *zKey, .. 
29d80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
29d90 70 56 61 6c 2c 0d 0a 20 20 69 6e 74 20 2a 70 62  pVal,..  int *pb
29da0 42 61 64 6b 65 79 0d 0a 29 7b 0d 0a 20 20 69 6e  Badkey..){..  in
29db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29dc0 3b 0d 0a 0d 0a 20 20 69 66 28 20 30 3d 3d 73 71  ;....  if( 0==sq
29dd0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b  lite3_stricmp(zK
29de0 65 79 2c 20 22 70 67 73 7a 22 29 20 29 7b 0d 0a  ey, "pgsz") ){..
29df0 20 20 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30      int pgsz = 0
29e00 3b 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ;..    if( SQLIT
29e10 45 5f 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74  E_INTEGER==sqlit
29e20 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63  e3_value_numeric
29e30 5f 74 79 70 65 28 70 56 61 6c 29 20 29 7b 0d 0a  _type(pVal) ){..
29e40 20 20 20 20 20 20 70 67 73 7a 20 3d 20 73 71 6c        pgsz = sql
29e50 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
29e60 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
29e70 20 20 69 66 28 20 70 67 73 7a 3c 3d 30 20 7c 7c    if( pgsz<=0 ||
29e80 20 70 67 73 7a 3e 46 54 53 35 5f 4d 41 58 5f 50   pgsz>FTS5_MAX_P
29e90 41 47 45 5f 53 49 5a 45 20 29 7b 0d 0a 20 20 20  AGE_SIZE ){..   
29ea0 20 20 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31     *pbBadkey = 1
29eb0 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
29ec0 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 67       pConfig->pg
29ed0 73 7a 20 3d 20 70 67 73 7a 3b 0d 0a 20 20 20 20  sz = pgsz;..    
29ee0 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73 65  }..  }....  else
29ef0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
29f00 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 68  stricmp(zKey, "h
29f10 61 73 68 73 69 7a 65 22 29 20 29 7b 0d 0a 20 20  ashsize") ){..  
29f20 20 20 69 6e 74 20 6e 48 61 73 68 53 69 7a 65 20    int nHashSize 
29f30 3d 20 2d 31 3b 0d 0a 20 20 20 20 69 66 28 20 53  = -1;..    if( S
29f40 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73  QLITE_INTEGER==s
29f50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
29f60 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20  eric_type(pVal) 
29f70 29 7b 0d 0a 20 20 20 20 20 20 6e 48 61 73 68 53  ){..      nHashS
29f80 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ize = sqlite3_va
29f90 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a  lue_int(pVal);..
29fa0 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
29fb0 48 61 73 68 53 69 7a 65 3c 3d 30 20 29 7b 0d 0a  HashSize<=0 ){..
29fc0 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65 79 20        *pbBadkey 
29fd0 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1;..    }else{
29fe0 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ..      pConfig-
29ff0 3e 6e 48 61 73 68 53 69 7a 65 20 3d 20 6e 48 61  >nHashSize = nHa
2a000 73 68 53 69 7a 65 3b 0d 0a 20 20 20 20 7d 0d 0a  shSize;..    }..
2a010 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73 65 20 69 66    }....  else if
2a020 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
2a030 69 63 6d 70 28 7a 4b 65 79 2c 20 22 61 75 74 6f  icmp(zKey, "auto
2a040 6d 65 72 67 65 22 29 20 29 7b 0d 0a 20 20 20 20  merge") ){..    
2a050 69 6e 74 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d  int nAutomerge =
2a060 20 2d 31 3b 0d 0a 20 20 20 20 69 66 28 20 53 51   -1;..    if( SQ
2a070 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73 71  LITE_INTEGER==sq
2a080 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65  lite3_value_nume
2a090 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20 29  ric_type(pVal) )
2a0a0 7b 0d 0a 20 20 20 20 20 20 6e 41 75 74 6f 6d 65  {..      nAutome
2a0b0 72 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rge = sqlite3_va
2a0c0 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a  lue_int(pVal);..
2a0d0 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
2a0e0 41 75 74 6f 6d 65 72 67 65 3c 30 20 7c 7c 20 6e  Automerge<0 || n
2a0f0 41 75 74 6f 6d 65 72 67 65 3e 36 34 20 29 7b 0d  Automerge>64 ){.
2a100 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65 79  .      *pbBadkey
2a110 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65   = 1;..    }else
2a120 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 75  {..      if( nAu
2a130 74 6f 6d 65 72 67 65 3d 3d 31 20 29 20 6e 41 75  tomerge==1 ) nAu
2a140 74 6f 6d 65 72 67 65 20 3d 20 46 54 53 35 5f 44  tomerge = FTS5_D
2a150 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45  EFAULT_AUTOMERGE
2a160 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ;..      pConfig
2a170 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 6e  ->nAutomerge = n
2a180 41 75 74 6f 6d 65 72 67 65 3b 0d 0a 20 20 20 20  Automerge;..    
2a190 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73 65  }..  }....  else
2a1a0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
2a1b0 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 75  stricmp(zKey, "u
2a1c0 73 65 72 6d 65 72 67 65 22 29 20 29 7b 0d 0a 20  sermerge") ){.. 
2a1d0 20 20 20 69 6e 74 20 6e 55 73 65 72 6d 65 72 67     int nUsermerg
2a1e0 65 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 69 66 28  e = -1;..    if(
2a1f0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d   SQLITE_INTEGER=
2a200 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e  =sqlite3_value_n
2a210 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c  umeric_type(pVal
2a220 29 20 29 7b 0d 0a 20 20 20 20 20 20 6e 55 73 65  ) ){..      nUse
2a230 72 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33  rmerge = sqlite3
2a240 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
2a250 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
2a260 28 20 6e 55 73 65 72 6d 65 72 67 65 3c 32 20 7c  ( nUsermerge<2 |
2a270 7c 20 6e 55 73 65 72 6d 65 72 67 65 3e 31 36 20  | nUsermerge>16 
2a280 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64  ){..      *pbBad
2a290 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  key = 1;..    }e
2a2a0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  lse{..      pCon
2a2b0 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 20  fig->nUsermerge 
2a2c0 3d 20 6e 55 73 65 72 6d 65 72 67 65 3b 0d 0a 20  = nUsermerge;.. 
2a2d0 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 65     }..  }....  e
2a2e0 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  lse if( 0==sqlit
2a2f0 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c  e3_stricmp(zKey,
2a300 20 22 63 72 69 73 69 73 6d 65 72 67 65 22 29 20   "crisismerge") 
2a310 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 43 72 69  ){..    int nCri
2a320 73 69 73 4d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a  sisMerge = -1;..
2a330 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49      if( SQLITE_I
2a340 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f  NTEGER==sqlite3_
2a350 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2a360 70 65 28 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20  pe(pVal) ){..   
2a370 20 20 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20     nCrisisMerge 
2a380 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2a390 69 6e 74 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20  int(pVal);..    
2a3a0 7d 0d 0a 20 20 20 20 69 66 28 20 6e 43 72 69 73  }..    if( nCris
2a3b0 69 73 4d 65 72 67 65 3c 30 20 29 7b 0d 0a 20 20  isMerge<0 ){..  
2a3c0 20 20 20 20 2a 70 62 42 61 64 6b 65 79 20 3d 20      *pbBadkey = 
2a3d0 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  1;..    }else{..
2a3e0 20 20 20 20 20 20 69 66 28 20 6e 43 72 69 73 69        if( nCrisi
2a3f0 73 4d 65 72 67 65 3c 3d 31 20 29 20 6e 43 72 69  sMerge<=1 ) nCri
2a400 73 69 73 4d 65 72 67 65 20 3d 20 46 54 53 35 5f  sisMerge = FTS5_
2a410 44 45 46 41 55 4c 54 5f 43 52 49 53 49 53 4d 45  DEFAULT_CRISISME
2a420 52 47 45 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  RGE;..      pCon
2a430 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  fig->nCrisisMerg
2a440 65 20 3d 20 6e 43 72 69 73 69 73 4d 65 72 67 65  e = nCrisisMerge
2a450 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2a460 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2a470 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2a480 4b 65 79 2c 20 22 72 61 6e 6b 22 29 20 29 7b 0d  Key, "rank") ){.
2a490 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2a4a0 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zIn = (const ch
2a4b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2a4c0 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0d 0a 20  e_text(pVal);.. 
2a4d0 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 0d     char *zRank;.
2a4e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b  .    char *zRank
2a4f0 41 72 67 73 3b 0d 0a 20 20 20 20 72 63 20 3d 20  Args;..    rc = 
2a500 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
2a510 67 50 61 72 73 65 52 61 6e 6b 28 7a 49 6e 2c 20  gParseRank(zIn, 
2a520 26 7a 52 61 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72  &zRank, &zRankAr
2a530 67 73 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63  gs);..    if( rc
2a540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
2a550 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a560 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e  ee(pConfig->zRan
2a570 6b 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74  k);..      sqlit
2a580 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d  e3_free(pConfig-
2a590 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0d 0a 20 20  >zRankArgs);..  
2a5a0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 52 61      pConfig->zRa
2a5b0 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0d 0a 20 20 20  nk = zRank;..   
2a5c0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e     pConfig->zRan
2a5d0 6b 41 72 67 73 20 3d 20 7a 52 61 6e 6b 41 72 67  kArgs = zRankArg
2a5e0 73 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  s;..    }else if
2a5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
2a600 4f 52 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20  OR ){..      rc 
2a610 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
2a620 20 20 20 20 2a 70 62 42 61 64 6b 65 79 20 3d 20      *pbBadkey = 
2a630 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c  1;..    }..  }el
2a640 73 65 7b 0d 0a 20 20 20 20 2a 70 62 42 61 64 6b  se{..    *pbBadk
2a650 65 79 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20  ey = 1;..  }..  
2a660 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d  return rc;..}...
2a670 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ./*..** Load the
2a680 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2a690 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20   %_config table 
2a6a0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f  into memory...*/
2a6b0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
2a6c0 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
2a6d0 61 64 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ad(Fts5Config *p
2a6e0 43 6f 6e 66 69 67 2c 20 69 6e 74 20 69 43 6f 6f  Config, int iCoo
2a6f0 6b 69 65 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 63  kie){..  const c
2a700 68 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d 20 22  har *zSelect = "
2a710 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d  SELECT k, v FROM
2a720 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67 27 22   %Q.'%q_config'"
2a730 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ;..  char *zSql;
2a740 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ..  sqlite3_stmt
2a750 20 2a 70 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20   *p = 0;..  int 
2a760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
2a770 0a 20 20 69 6e 74 20 69 56 65 72 73 69 6f 6e 20  .  int iVersion 
2a780 3d 20 30 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 65 74  = 0;....  /* Set
2a790 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
2a7a0 2a 2f 0d 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 70  */..  pConfig->p
2a7b0 67 73 7a 20 3d 20 46 54 53 35 5f 44 45 46 41 55  gsz = FTS5_DEFAU
2a7c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0d 0a 20  LT_PAGE_SIZE;.. 
2a7d0 20 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d   pConfig->nAutom
2a7e0 65 72 67 65 20 3d 20 46 54 53 35 5f 44 45 46 41  erge = FTS5_DEFA
2a7f0 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45 3b 0d 0a  ULT_AUTOMERGE;..
2a800 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72    pConfig->nUser
2a810 6d 65 72 67 65 20 3d 20 46 54 53 35 5f 44 45 46  merge = FTS5_DEF
2a820 41 55 4c 54 5f 55 53 45 52 4d 45 52 47 45 3b 0d  AULT_USERMERGE;.
2a830 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  .  pConfig->nCri
2a840 73 69 73 4d 65 72 67 65 20 3d 20 46 54 53 35 5f  sisMerge = FTS5_
2a850 44 45 46 41 55 4c 54 5f 43 52 49 53 49 53 4d 45  DEFAULT_CRISISME
2a860 52 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d  RGE;..  pConfig-
2a870 3e 6e 48 61 73 68 53 69 7a 65 20 3d 20 46 54 53  >nHashSize = FTS
2a880 35 5f 44 45 46 41 55 4c 54 5f 48 41 53 48 53 49  5_DEFAULT_HASHSI
2a890 5a 45 3b 0d 0a 0d 0a 20 20 7a 53 71 6c 20 3d 20  ZE;....  zSql = 
2a8a0 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
2a8b0 74 66 28 26 72 63 2c 20 7a 53 65 6c 65 63 74 2c  tf(&rc, zSelect,
2a8c0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
2a8d0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0d  Config->zName);.
2a8e0 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0d 0a  .  if( zSql ){..
2a8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a900 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
2a910 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
2a920 31 2c 20 26 70 2c 20 30 29 3b 0d 0a 20 20 20 20  1, &p, 0);..    
2a930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2a940 6c 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 73  l);..  }....  as
2a950 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2a960 5f 4f 4b 20 7c 7c 20 70 3d 3d 30 20 29 3b 0d 0a  _OK || p==0 );..
2a970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a980 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 77 68 69 6c  _OK ){..    whil
2a990 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
2a9a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 29 20 29  qlite3_step(p) )
2a9b0 7b 0d 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {..      const c
2a9c0 68 61 72 20 2a 7a 4b 20 3d 20 28 63 6f 6e 73 74  har *zK = (const
2a9d0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2a9e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 2c 20 30 29  olumn_text(p, 0)
2a9f0 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
2aa00 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73  _value *pVal = s
2aa10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
2aa20 6c 75 65 28 70 2c 20 31 29 3b 0d 0a 20 20 20 20  lue(p, 1);..    
2aa30 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
2aa40 5f 73 74 72 69 63 6d 70 28 7a 4b 2c 20 22 76 65  _stricmp(zK, "ve
2aa50 72 73 69 6f 6e 22 29 20 29 7b 0d 0a 20 20 20 20  rsion") ){..    
2aa60 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d 20 73      iVersion = s
2aa70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2aa80 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20 20 20 7d  (pVal);..      }
2aa90 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 69  else{..        i
2aaa0 6e 74 20 62 44 75 6d 6d 79 20 3d 20 30 3b 0d 0a  nt bDummy = 0;..
2aab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
2aac0 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75  ts5ConfigSetValu
2aad0 65 28 70 43 6f 6e 66 69 67 2c 20 7a 4b 2c 20 70  e(pConfig, zK, p
2aae0 56 61 6c 2c 20 26 62 44 75 6d 6d 79 29 3b 0d 0a  Val, &bDummy);..
2aaf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2ab00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ab10 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b 0d 0a 20  _finalize(p);.. 
2ab20 20 7d 0d 0a 20 20 0d 0a 20 20 69 66 28 20 72 63   }..  ..  if( rc
2ab30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2ab40 56 65 72 73 69 6f 6e 21 3d 46 54 53 35 5f 43 55  Version!=FTS5_CU
2ab50 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 20 29 7b  RRENT_VERSION ){
2ab60 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ..    rc = SQLIT
2ab70 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 69 66  E_ERROR;..    if
2ab80 28 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72  ( pConfig->pzErr
2ab90 6d 73 67 20 29 7b 0d 0a 20 20 20 20 20 20 61 73  msg ){..      as
2aba0 73 65 72 74 28 20 30 3d 3d 2a 70 43 6f 6e 66 69  sert( 0==*pConfi
2abb0 67 2d 3e 70 7a 45 72 72 6d 73 67 20 29 3b 0d 0a  g->pzErrmsg );..
2abc0 20 20 20 20 20 20 2a 70 43 6f 6e 66 69 67 2d 3e        *pConfig->
2abd0 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  pzErrmsg = sqlit
2abe0 65 33 5f 6d 70 72 69 6e 74 66 28 0d 0a 20 20 20  e3_mprintf(..   
2abf0 20 20 20 20 20 20 20 22 69 6e 76 61 6c 69 64 20         "invalid 
2ac00 66 74 73 35 20 66 69 6c 65 20 66 6f 72 6d 61 74  fts5 file format
2ac10 20 28 66 6f 75 6e 64 20 25 64 2c 20 65 78 70 65   (found %d, expe
2ac20 63 74 65 64 20 25 64 29 20 2d 20 72 75 6e 20 27  cted %d) - run '
2ac30 72 65 62 75 69 6c 64 27 22 2c 0d 0a 20 20 20 20  rebuild'",..    
2ac40 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 2c 20        iVersion, 
2ac50 46 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52  FTS5_CURRENT_VER
2ac60 53 49 4f 4e 0d 0a 20 20 20 20 20 20 29 3b 0d 0a  SION..      );..
2ac70 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2ac80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ac90 4b 20 29 7b 0d 0a 20 20 20 20 70 43 6f 6e 66 69  K ){..    pConfi
2aca0 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 69 43 6f  g->iCookie = iCo
2acb0 6f 6b 69 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65  okie;..  }..  re
2acc0 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 23  turn rc;..}....#
2acd0 6c 69 6e 65 20 31 20 22 66 74 73 35 5f 65 78 70  line 1 "fts5_exp
2ace0 72 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31  r.c"../*..** 201
2acf0 34 20 4d 61 79 20 33 31 0d 0a 2a 2a 0d 0a 2a 2a  4 May 31..**..**
2ad00 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
2ad10 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
2ad20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
2ad30 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
2ad40 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f  f..** a legal no
2ad50 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
2ad60 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a  blessing:..**..*
2ad70 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  *    May you do 
2ad80 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
2ad90 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  l...**    May yo
2ada0 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65  u find forgivene
2adb0 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20  ss for yourself 
2adc0 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65  and forgive othe
2add0 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79  rs...**    May y
2ade0 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c  ou share freely,
2adf0 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f   never taking mo
2ae00 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65  re than you give
2ae10 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...**..*********
2ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae60 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 0d  *****..**..*/...
2ae70 0a 0d 0a 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65  ...../* #include
2ae80 20 22 66 74 73 35 49 6e 74 2e 68 22 20 2a 2f 0d   "fts5Int.h" */.
2ae90 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74  ./* #include "ft
2aea0 73 35 70 61 72 73 65 2e 68 22 20 2a 2f 0d 0a 0d  s5parse.h" */...
2aeb0 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 74 6f 6b 65  ./*..** All toke
2aec0 6e 20 74 79 70 65 73 20 69 6e 20 74 68 65 20 67  n types in the g
2aed0 65 6e 65 72 61 74 65 64 20 66 74 73 35 70 61 72  enerated fts5par
2aee0 73 65 2e 68 20 66 69 6c 65 20 61 72 65 20 67 72  se.h file are gr
2aef0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 0d 0a 2a  eater than 0...*
2af00 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  /..#define FTS5_
2af10 45 4f 46 20 30 0d 0a 0d 0a 23 64 65 66 69 6e 65  EOF 0....#define
2af20 20 46 54 53 35 5f 4c 41 52 47 45 53 54 5f 49 4e   FTS5_LARGEST_IN
2af30 54 36 34 20 20 28 30 78 66 66 66 66 66 66 66 66  T64  (0xffffffff
2af40 7c 28 28 28 69 36 34 29 30 78 37 66 66 66 66 66  |(((i64)0x7fffff
2af50 66 66 29 3c 3c 33 32 29 29 0d 0a 0d 0a 74 79 70  ff)<<32))....typ
2af60 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2af70 45 78 70 72 54 65 72 6d 20 46 74 73 35 45 78 70  ExprTerm Fts5Exp
2af80 72 54 65 72 6d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rTerm;..../*..**
2af90 20 46 75 6e 63 74 69 6f 6e 73 20 67 65 6e 65 72   Functions gener
2afa0 61 74 65 64 20 62 79 20 6c 65 6d 6f 6e 20 66 72  ated by lemon fr
2afb0 6f 6d 20 66 74 73 35 70 61 72 73 65 2e 79 2e 0d  om fts5parse.y..
2afc0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
2afd0 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
2afe0 73 65 72 41 6c 6c 6f 63 28 76 6f 69 64 20 2a 28  serAlloc(void *(
2aff0 2a 6d 61 6c 6c 6f 63 50 72 6f 63 29 28 75 36 34  *mallocProc)(u64
2b000 29 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  ));..static void
2b010 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
2b020 65 72 46 72 65 65 28 76 6f 69 64 2a 2c 20 76 6f  erFree(void*, vo
2b030 69 64 20 28 2a 66 72 65 65 50 72 6f 63 29 28 76  id (*freeProc)(v
2b040 6f 69 64 2a 29 29 3b 0d 0a 73 74 61 74 69 63 20  oid*));..static 
2b050 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
2b060 50 61 72 73 65 72 28 76 6f 69 64 2a 2c 20 69 6e  Parser(void*, in
2b070 74 2c 20 46 74 73 35 54 6f 6b 65 6e 2c 20 46 74  t, Fts5Token, Ft
2b080 73 35 50 61 72 73 65 2a 29 3b 0d 0a 23 69 66 6e  s5Parse*);..#ifn
2b090 64 65 66 20 4e 44 45 42 55 47 0d 0a 23 69 6e 63  def NDEBUG..#inc
2b0a0 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0d 0a  lude <stdio.h>..
2b0b0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b0c0 74 65 33 46 74 73 35 50 61 72 73 65 72 54 72 61  te3Fts5ParserTra
2b0d0 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 2a 29  ce(FILE*, char*)
2b0e0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 73 74 61 74 69  ;..#endif..stati
2b0f0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
2b100 35 50 61 72 73 65 72 46 61 6c 6c 62 61 63 6b 28  5ParserFallback(
2b110 69 6e 74 29 3b 0d 0a 0d 0a 0d 0a 73 74 72 75 63  int);......struc
2b120 74 20 46 74 73 35 45 78 70 72 20 7b 0d 0a 20 20  t Fts5Expr {..  
2b130 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65  Fts5Index *pInde
2b140 78 3b 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  x;..  Fts5Config
2b150 20 2a 70 43 6f 6e 66 69 67 3b 0d 0a 20 20 46 74   *pConfig;..  Ft
2b160 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f  s5ExprNode *pRoo
2b170 74 3b 0d 0a 20 20 69 6e 74 20 62 44 65 73 63 3b  t;..  int bDesc;
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
2b1a0 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72   in descending r
2b1b0 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0d 0a 20  owid order */.. 
2b1c0 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20   int nPhrase;   
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 68   /* Number of ph
2b1f0 72 61 73 65 73 20 69 6e 20 65 78 70 72 65 73 73  rases in express
2b200 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78  ion */..  Fts5Ex
2b210 70 72 50 68 72 61 73 65 20 2a 2a 61 70 45 78 70  prPhrase **apExp
2b220 72 50 68 72 61 73 65 3b 20 20 2f 2a 20 50 6f 69  rPhrase;  /* Poi
2b230 6e 74 65 72 73 20 74 6f 20 70 68 72 61 73 65 20  nters to phrase 
2b240 6f 62 6a 65 63 74 73 20 2a 2f 0d 0a 7d 3b 0d 0a  objects */..};..
2b250 0d 0a 2f 2a 0d 0a 2a 2a 20 65 54 79 70 65 3a 0d  ../*..** eType:.
2b260 0a 2a 2a 20 20 20 45 78 70 72 65 73 73 69 6f 6e  .**   Expression
2b270 20 6e 6f 64 65 20 74 79 70 65 2e 20 41 6c 77 61   node type. Alwa
2b280 79 73 20 6f 6e 65 20 6f 66 3a 0d 0a 2a 2a 0d 0a  ys one of:..**..
2b290 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f 41 4e  **       FTS5_AN
2b2a0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
2b2b0 20 20 28 6e 43 68 69 6c 64 2c 20 61 70 43 68 69    (nChild, apChi
2b2c0 6c 64 20 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20  ld valid)..**   
2b2d0 20 20 20 20 46 54 53 35 5f 4f 52 20 20 20 20 20      FTS5_OR     
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 43               (nC
2b2f0 68 69 6c 64 2c 20 61 70 43 68 69 6c 64 20 76 61  hild, apChild va
2b300 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20 20 20 46  lid)..**       F
2b310 54 53 35 5f 4e 4f 54 20 20 20 20 20 20 20 20 20  TS5_NOT         
2b320 20 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64 2c          (nChild,
2b330 20 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29 0d   apChild valid).
2b340 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f 53  .**       FTS5_S
2b350 54 52 49 4e 47 20 20 20 20 20 20 20 20 20 20 20  TRING           
2b360 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69 64 29     (pNear valid)
2b370 0d 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f  ..**       FTS5_
2b380 54 45 52 4d 20 20 20 20 20 20 20 20 20 20 20 20  TERM            
2b390 20 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69 64      (pNear valid
2b3a0 29 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74  )..*/..struct Ft
2b3b0 73 35 45 78 70 72 4e 6f 64 65 20 7b 0d 0a 20 20  s5ExprNode {..  
2b3c0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 2f 2a 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0d  /* Node type */.
2b3f0 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b410 20 20 20 2f 2a 20 54 72 75 65 20 61 74 20 45 4f     /* True at EO
2b420 46 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 4e 6f 6d  F */..  int bNom
2b430 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2b440 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2b450 69 66 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20  if entry is not 
2b460 61 20 6d 61 74 63 68 20 2a 2f 0d 0a 0d 0a 20 20  a match */....  
2b470 2f 2a 20 4e 65 78 74 20 6d 65 74 68 6f 64 20 66  /* Next method f
2b480 6f 72 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a 2f  or this node. */
2b490 0d 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78 74 29  ..  int (*xNext)
2b4a0 28 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35  (Fts5Expr*, Fts5
2b4b0 45 78 70 72 4e 6f 64 65 2a 2c 20 69 6e 74 2c 20  ExprNode*, int, 
2b4c0 69 36 34 29 3b 0d 0a 0d 0a 20 20 69 36 34 20 69  i64);....  i64 i
2b4d0 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2b4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2b4f0 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0d 0a  rrent rowid */..
2b500 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
2b510 74 20 2a 70 4e 65 61 72 3b 20 20 20 20 20 20 20  t *pNear;       
2b520 20 20 2f 2a 20 46 6f 72 20 46 54 53 35 5f 53 54    /* For FTS5_ST
2b530 52 49 4e 47 20 2d 20 63 6c 75 73 74 65 72 20 6f  RING - cluster o
2b540 66 20 70 68 72 61 73 65 73 20 2a 2f 0d 0a 0d 0a  f phrases */....
2b550 20 20 2f 2a 20 43 68 69 6c 64 20 6e 6f 64 65 73    /* Child nodes
2b560 2e 20 46 6f 72 20 61 20 4e 4f 54 20 6e 6f 64 65  . For a NOT node
2b570 2c 20 74 68 69 73 20 61 72 72 61 79 20 61 6c 77  , this array alw
2b580 61 79 73 20 63 6f 6e 74 61 69 6e 73 20 32 20 65  ays contains 2 e
2b590 6e 74 72 69 65 73 2e 20 46 6f 72 20 0d 0a 20 20  ntries. For ..  
2b5a0 2a 2a 20 41 4e 44 20 6f 72 20 4f 52 20 6e 6f 64  ** AND or OR nod
2b5b0 65 73 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  es, it contains 
2b5c0 32 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65  2 or more entrie
2b5d0 73 2e 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43  s.  */..  int nC
2b5e0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2b5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b600 62 65 72 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64  ber of child nod
2b610 65 73 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  es */..  Fts5Exp
2b620 72 4e 6f 64 65 20 2a 61 70 43 68 69 6c 64 5b 31  rNode *apChild[1
2b630 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ];       /* Arra
2b640 79 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 73  y of child nodes
2b650 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23 64 65 66 69   */..};....#defi
2b660 6e 65 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72  ne Fts5NodeIsStr
2b670 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 65 54 79  ing(p) ((p)->eTy
2b680 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 7c 7c  pe==FTS5_TERM ||
2b690 20 28 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54 53   (p)->eType==FTS
2b6a0 35 5f 53 54 52 49 4e 47 29 0d 0a 0d 0a 2f 2a 0d  5_STRING)..../*.
2b6b0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
2b6c0 4e 65 78 74 20 6d 65 74 68 6f 64 20 6f 66 20 61  Next method of a
2b6d0 6e 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 6f  n Fts5ExprNode o
2b6e0 62 6a 65 63 74 2e 20 54 68 69 73 20 6d 61 63 72  bject. This macr
2b6f0 6f 20 73 68 6f 75 6c 64 20 62 65 0d 0a 2a 2a 20  o should be..** 
2b700 75 73 65 64 20 61 73 20 69 66 20 69 74 20 68 61  used as if it ha
2b710 73 20 74 68 65 20 73 61 6d 65 20 73 69 67 6e 61  s the same signa
2b720 74 75 72 65 20 61 73 20 74 68 65 20 78 4e 65 78  ture as the xNex
2b730 74 28 29 20 6d 65 74 68 6f 64 73 20 74 68 65 6d  t() methods them
2b740 73 65 6c 76 65 73 2e 0d 0a 2a 2f 0d 0a 23 64 65  selves...*/..#de
2b750 66 69 6e 65 20 66 74 73 35 45 78 70 72 4e 6f 64  fine fts5ExprNod
2b760 65 4e 65 78 74 28 61 2c 62 2c 63 2c 64 29 20 28  eNext(a,b,c,d) (
2b770 62 29 2d 3e 78 4e 65 78 74 28 28 61 29 2c 20 28  b)->xNext((a), (
2b780 62 29 2c 20 28 63 29 2c 20 28 64 29 29 0d 0a 0d  b), (c), (d))...
2b790 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ./*..** An insta
2b7a0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2b7b0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  wing structure r
2b7c0 65 70 72 65 73 65 6e 74 73 20 61 20 73 69 6e 67  epresents a sing
2b7d0 6c 65 20 73 65 61 72 63 68 20 74 65 72 6d 0d 0a  le search term..
2b7e0 2a 2a 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69  ** or term prefi
2b7f0 78 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 46  x...*/..struct F
2b800 74 73 35 45 78 70 72 54 65 72 6d 20 7b 0d 0a 20  ts5ExprTerm {.. 
2b810 20 75 38 20 62 50 72 65 66 69 78 3b 20 20 20 20   u8 bPrefix;    
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b830 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70   /* True for a p
2b840 72 65 66 69 78 20 74 65 72 6d 20 2a 2f 0d 0a 20  refix term */.. 
2b850 20 75 38 20 62 46 69 72 73 74 3b 20 20 20 20 20   u8 bFirst;     
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b870 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 6b 65   /* True if toke
2b880 6e 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  n must be first 
2b890 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20  in column */..  
2b8a0 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 2f 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* nul-terminate
2b8d0 64 20 74 65 72 6d 20 2a 2f 0d 0a 20 20 46 74 73  d term */..  Fts
2b8e0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2b8f0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2b900 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 69  Iterator for thi
2b910 73 20 74 65 72 6d 20 2a 2f 0d 0a 20 20 46 74 73  s term */..  Fts
2b920 35 45 78 70 72 54 65 72 6d 20 2a 70 53 79 6e 6f  5ExprTerm *pSyno
2b930 6e 79 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nym;         /* 
2b940 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
2b950 20 69 6e 20 6c 69 73 74 20 6f 66 20 73 79 6e 6f   in list of syno
2b960 6e 79 6d 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f  nyms */..};..../
2b970 2a 0d 0a 2a 2a 20 41 20 70 68 72 61 73 65 2e 20  *..** A phrase. 
2b980 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  One or more term
2b990 73 20 74 68 61 74 20 6d 75 73 74 20 61 70 70 65  s that must appe
2b9a0 61 72 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ar in a contiguo
2b9b0 75 73 20 73 65 71 75 65 6e 63 65 0d 0a 2a 2a 20  us sequence..** 
2b9c0 77 69 74 68 69 6e 20 61 20 64 6f 63 75 6d 65 6e  within a documen
2b9d0 74 20 66 6f 72 20 69 74 20 74 6f 20 6d 61 74 63  t for it to matc
2b9e0 68 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 46  h...*/..struct F
2b9f0 74 73 35 45 78 70 72 50 68 72 61 73 65 20 7b 0d  ts5ExprPhrase {.
2ba00 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
2ba10 2a 70 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *pNode;         
2ba20 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
2ba30 47 20 6e 6f 64 65 20 74 68 69 73 20 70 68 72 61  G node this phra
2ba40 73 65 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f  se is part of */
2ba50 0d 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  ..  Fts5Buffer p
2ba60 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oslist;         
2ba70 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
2ba80 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0d  osition list */.
2ba90 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bab0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2bac0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 65 72 6d  entries in aTerm
2bad0 5b 5d 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  [] */..  Fts5Exp
2bae0 72 54 65 72 6d 20 61 54 65 72 6d 5b 31 5d 3b 20  rTerm aTerm[1]; 
2baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
2bb00 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
2bb10 68 69 73 20 70 68 72 61 73 65 20 2a 2f 0d 0a 7d  his phrase */..}
2bb20 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 6e 65 20  ;..../*..** One 
2bb30 6f 72 20 6d 6f 72 65 20 70 68 72 61 73 65 73 20  or more phrases 
2bb40 74 68 61 74 20 6d 75 73 74 20 61 70 70 65 61 72  that must appear
2bb50 20 77 69 74 68 69 6e 20 61 20 63 65 72 74 61 69   within a certai
2bb60 6e 20 74 6f 6b 65 6e 20 64 69 73 74 61 6e 63 65  n token distance
2bb70 20 6f 66 0d 0a 2a 2a 20 65 61 63 68 20 6f 74 68   of..** each oth
2bb80 65 72 20 77 69 74 68 69 6e 20 65 61 63 68 20 6d  er within each m
2bb90 61 74 63 68 69 6e 67 20 64 6f 63 75 6d 65 6e 74  atching document
2bba0 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74  ...*/..struct Ft
2bbb0 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 7b 0d  s5ExprNearset {.
2bbc0 0a 20 20 69 6e 74 20 6e 4e 65 61 72 3b 20 20 20  .  int nNear;   
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbe0 20 20 20 2f 2a 20 4e 45 41 52 20 70 61 72 61 6d     /* NEAR param
2bbf0 65 74 65 72 20 2a 2f 0d 0a 20 20 46 74 73 35 43  eter */..  Fts5C
2bc00 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
2bc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2bc20 6c 75 6d 6e 73 20 74 6f 20 73 65 61 72 63 68 20  lumns to search 
2bc30 28 4e 55 4c 4c 20 2d 3e 20 61 6c 6c 20 63 6f 6c  (NULL -> all col
2bc40 75 6d 6e 73 29 20 2a 2f 0d 0a 20 20 69 6e 74 20  umns) */..  int 
2bc50 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20  nPhrase;        
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2bc70 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2bc80 20 69 6e 20 61 50 68 72 61 73 65 5b 5d 20 61 72   in aPhrase[] ar
2bc90 72 61 79 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78  ray */..  Fts5Ex
2bca0 70 72 50 68 72 61 73 65 20 2a 61 70 50 68 72 61  prPhrase *apPhra
2bcb0 73 65 5b 31 5d 3b 20 20 20 20 2f 2a 20 41 72 72  se[1];    /* Arr
2bcc0 61 79 20 6f 66 20 70 68 72 61 73 65 20 70 6f 69  ay of phrase poi
2bcd0 6e 74 65 72 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a  nters */..};....
2bce0 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 73 65 20 63  ../*..** Parse c
2bcf0 6f 6e 74 65 78 74 2e 0d 0a 2a 2f 0d 0a 73 74 72  ontext...*/..str
2bd00 75 63 74 20 46 74 73 35 50 61 72 73 65 20 7b 0d  uct Fts5Parse {.
2bd10 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2bd20 43 6f 6e 66 69 67 3b 0d 0a 20 20 63 68 61 72 20  Config;..  char 
2bd30 2a 7a 45 72 72 3b 0d 0a 20 20 69 6e 74 20 72 63  *zErr;..  int rc
2bd40 3b 0d 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65  ;..  int nPhrase
2bd50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2bd70 61 70 50 68 72 61 73 65 20 61 72 72 61 79 20 2a  apPhrase array *
2bd80 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  /..  Fts5ExprPhr
2bd90 61 73 65 20 2a 2a 61 70 50 68 72 61 73 65 3b 20  ase **apPhrase; 
2bda0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2bdb0 20 61 6c 6c 20 70 68 72 61 73 65 73 20 2a 2f 0d   all phrases */.
2bdc0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
2bdd0 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
2bde0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
2bdf0 61 20 73 75 63 63 65 73 73 66 75 6c 20 70 61 72  a successful par
2be00 73 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 73 74 61  se */..};....sta
2be10 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2be20 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46  Fts5ParseError(F
2be30 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
2be40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2be50 6d 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 61 5f  mt, ...){..  va_
2be60 6c 69 73 74 20 61 70 3b 0d 0a 20 20 76 61 5f 73  list ap;..  va_s
2be70 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0d  tart(ap, zFmt);.
2be80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  .  if( pParse->r
2be90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
2bea0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72  .    pParse->zEr
2beb0 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  r = sqlite3_vmpr
2bec0 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0d  intf(zFmt, ap);.
2bed0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
2bee0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
2bef0 0a 20 20 7d 0d 0a 20 20 76 61 5f 65 6e 64 28 61  .  }..  va_end(a
2bf00 70 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63  p);..}....static
2bf10 20 69 6e 74 20 66 74 73 35 45 78 70 72 49 73 73   int fts5ExprIss
2bf20 70 61 63 65 28 63 68 61 72 20 74 29 7b 0d 0a 20  pace(char t){.. 
2bf30 20 72 65 74 75 72 6e 20 74 3d 3d 27 20 27 20 7c   return t==' ' |
2bf40 7c 20 74 3d 3d 27 5c 74 27 20 7c 7c 20 74 3d 3d  | t=='\t' || t==
2bf50 27 5c 6e 27 20 7c 7c 20 74 3d 3d 27 5c 72 27 3b  '\n' || t=='\r';
2bf60 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65  ..}..../*..** Re
2bf70 61 64 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b  ad the first tok
2bf80 65 6e 20 66 72 6f 6d 20 74 68 65 20 6e 75 6c 2d  en from the nul-
2bf90 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2bfa0 67 20 61 74 20 2a 70 7a 2e 0d 0a 2a 2f 0d 0a 73  g at *pz...*/..s
2bfb0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
2bfc0 70 72 47 65 74 54 6f 6b 65 6e 28 0d 0a 20 20 46  prGetToken(..  F
2bfd0 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
2bfe0 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  , ..  const char
2bff0 20 2a 2a 70 7a 2c 20 20 20 20 20 20 20 20 20 20   **pz,          
2c000 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2c010 20 50 6f 69 6e 74 65 72 20 69 6e 74 6f 20 62 75   Pointer into bu
2c020 66 66 65 72 20 2a 2f 0d 0a 20 20 46 74 73 35 54  ffer */..  Fts5T
2c030 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 0d 0a 29 7b  oken *pToken..){
2c040 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
2c050 7a 20 3d 20 2a 70 7a 3b 0d 0a 20 20 69 6e 74 20  z = *pz;..  int 
2c060 74 6f 6b 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 6b 69  tok;....  /* Ski
2c070 70 20 70 61 73 74 20 61 6e 79 20 77 68 69 74 65  p past any white
2c080 73 70 61 63 65 20 2a 2f 0d 0a 20 20 77 68 69 6c  space */..  whil
2c090 65 28 20 66 74 73 35 45 78 70 72 49 73 73 70 61  e( fts5ExprIsspa
2c0a0 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0d 0a 0d  ce(*z) ) z++;...
2c0b0 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 20 3d 20 7a  .  pToken->p = z
2c0c0 3b 0d 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d  ;..  pToken->n =
2c0d0 20 31 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 2a   1;..  switch( *
2c0e0 7a 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 27  z ){..    case '
2c0f0 28 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f  (':  tok = FTS5_
2c100 4c 50 3b 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20  LP;    break;.. 
2c110 20 20 20 63 61 73 65 20 27 29 27 3a 20 20 74 6f     case ')':  to
2c120 6b 20 3d 20 46 54 53 35 5f 52 50 3b 20 20 20 20  k = FTS5_RP;    
2c130 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65  break;..    case
2c140 20 27 7b 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53   '{':  tok = FTS
2c150 35 5f 4c 43 50 3b 20 20 20 62 72 65 61 6b 3b 0d  5_LCP;   break;.
2c160 0a 20 20 20 20 63 61 73 65 20 27 7d 27 3a 20 20  .    case '}':  
2c170 74 6f 6b 20 3d 20 46 54 53 35 5f 52 43 50 3b 20  tok = FTS5_RCP; 
2c180 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61    break;..    ca
2c190 73 65 20 27 3a 27 3a 20 20 74 6f 6b 20 3d 20 46  se ':':  tok = F
2c1a0 54 53 35 5f 43 4f 4c 4f 4e 3b 20 62 72 65 61 6b  TS5_COLON; break
2c1b0 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2c 27 3a  ;..    case ',':
2c1c0 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 43 4f 4d    tok = FTS5_COM
2c1d0 4d 41 3b 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  MA; break;..    
2c1e0 63 61 73 65 20 27 2b 27 3a 20 20 74 6f 6b 20 3d  case '+':  tok =
2c1f0 20 46 54 53 35 5f 50 4c 55 53 3b 20 20 62 72 65   FTS5_PLUS;  bre
2c200 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2a  ak;..    case '*
2c210 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 53  ':  tok = FTS5_S
2c220 54 41 52 3b 20 20 62 72 65 61 6b 3b 0d 0a 20 20  TAR;  break;..  
2c230 20 20 63 61 73 65 20 27 2d 27 3a 20 20 74 6f 6b    case '-':  tok
2c240 20 3d 20 46 54 53 35 5f 4d 49 4e 55 53 3b 20 62   = FTS5_MINUS; b
2c250 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
2c260 27 5e 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '^':  tok = FTS5
2c270 5f 43 41 52 45 54 3b 20 62 72 65 61 6b 3b 0d 0a  _CARET; break;..
2c280 20 20 20 20 63 61 73 65 20 27 5c 30 27 3a 20 74      case '\0': t
2c290 6f 6b 20 3d 20 46 54 53 35 5f 45 4f 46 3b 20 20  ok = FTS5_EOF;  
2c2a0 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 63   break;....    c
2c2b0 61 73 65 20 27 22 27 3a 20 7b 0d 0a 20 20 20 20  ase '"': {..    
2c2c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
2c2d0 3b 0d 0a 20 20 20 20 20 20 74 6f 6b 20 3d 20 46  ;..      tok = F
2c2e0 54 53 35 5f 53 54 52 49 4e 47 3b 0d 0a 0d 0a 20  TS5_STRING;.... 
2c2f0 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b 31       for(z2=&z[1
2c300 5d 3b 20 31 3b 20 7a 32 2b 2b 29 7b 0d 0a 20 20  ]; 1; z2++){..  
2c310 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d 3d        if( z2[0]=
2c320 3d 27 22 27 20 29 7b 0d 0a 20 20 20 20 20 20 20  ='"' ){..       
2c330 20 20 20 7a 32 2b 2b 3b 0d 0a 20 20 20 20 20 20     z2++;..      
2c340 20 20 20 20 69 66 28 20 7a 32 5b 30 5d 21 3d 27      if( z2[0]!='
2c350 22 27 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20  "' ) break;..   
2c360 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2c370 69 66 28 20 7a 32 5b 30 5d 3d 3d 27 5c 30 27 20  if( z2[0]=='\0' 
2c380 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71  ){..          sq
2c390 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45 72  lite3Fts5ParseEr
2c3a0 72 6f 72 28 70 50 61 72 73 65 2c 20 22 75 6e 74  ror(pParse, "unt
2c3b0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
2c3c0 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ");..          r
2c3d0 65 74 75 72 6e 20 46 54 53 35 5f 45 4f 46 3b 0d  eturn FTS5_EOF;.
2c3e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2c3f0 20 20 7d 0d 0a 20 20 20 20 20 20 70 54 6f 6b 65    }..      pToke
2c400 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b  n->n = (z2 - z);
2c410 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a  ..      break;..
2c420 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 65 66      }....    def
2c430 61 75 6c 74 3a 20 7b 0d 0a 20 20 20 20 20 20 63  ault: {..      c
2c440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0d 0a  onst char *z2;..
2c450 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2c460 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64 28  3Fts5IsBareword(
2c470 7a 5b 30 5d 29 3d 3d 30 20 29 7b 0d 0a 20 20 20  z[0])==0 ){..   
2c480 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2c490 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
2c4a0 65 2c 20 22 66 74 73 35 3a 20 73 79 6e 74 61 78  e, "fts5: syntax
2c4b0 20 65 72 72 6f 72 20 6e 65 61 72 20 5c 22 25 2e   error near \"%.
2c4c0 31 73 5c 22 22 2c 20 7a 29 3b 0d 0a 20 20 20 20  1s\"", z);..    
2c4d0 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 35 5f      return FTS5_
2c4e0 45 4f 46 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  EOF;..      }.. 
2c4f0 20 20 20 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f       tok = FTS5_
2c500 53 54 52 49 4e 47 3b 0d 0a 20 20 20 20 20 20 66  STRING;..      f
2c510 6f 72 28 7a 32 3d 26 7a 5b 31 5d 3b 20 73 71 6c  or(z2=&z[1]; sql
2c520 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77 6f  ite3Fts5IsBarewo
2c530 72 64 28 2a 7a 32 29 3b 20 7a 32 2b 2b 29 3b 0d  rd(*z2); z2++);.
2c540 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e  .      pToken->n
2c550 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0d 0a 20 20   = (z2 - z);..  
2c560 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
2c570 6e 3d 3d 32 20 26 26 20 6d 65 6d 63 6d 70 28 70  n==2 && memcmp(p
2c580 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4f 52 22 2c 20  Token->p, "OR", 
2c590 32 29 3d 3d 30 20 29 20 20 74 6f 6b 20 3d 20 46  2)==0 )  tok = F
2c5a0 54 53 35 5f 4f 52 3b 0d 0a 20 20 20 20 20 20 69  TS5_OR;..      i
2c5b0 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 33 20  f( pToken->n==3 
2c5c0 26 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  && memcmp(pToken
2c5d0 2d 3e 70 2c 20 22 4e 4f 54 22 2c 20 33 29 3d 3d  ->p, "NOT", 3)==
2c5e0 30 20 29 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4e  0 ) tok = FTS5_N
2c5f0 4f 54 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70  OT;..      if( p
2c600 54 6f 6b 65 6e 2d 3e 6e 3d 3d 33 20 26 26 20 6d  Token->n==3 && m
2c610 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c  emcmp(pToken->p,
2c620 20 22 41 4e 44 22 2c 20 33 29 3d 3d 30 20 29 20   "AND", 3)==0 ) 
2c630 74 6f 6b 20 3d 20 46 54 53 35 5f 41 4e 44 3b 0d  tok = FTS5_AND;.
2c640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20  .      break;.. 
2c650 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a     }..  }....  *
2c660 70 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d 3e 70 5b  pz = &pToken->p[
2c670 70 54 6f 6b 65 6e 2d 3e 6e 5d 3b 0d 0a 20 20 72  pToken->n];..  r
2c680 65 74 75 72 6e 20 74 6f 6b 3b 0d 0a 7d 0d 0a 0d  eturn tok;..}...
2c690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
2c6a0 73 35 50 61 72 73 65 41 6c 6c 6f 63 28 75 36 34  s5ParseAlloc(u64
2c6b0 20 74 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69   t){ return sqli
2c6c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 28 69 6e 74 29  te3_malloc((int)
2c6d0 74 29 3b 20 7d 0d 0a 73 74 61 74 69 63 20 76 6f  t); }..static vo
2c6e0 69 64 20 66 74 73 35 50 61 72 73 65 46 72 65 65  id fts5ParseFree
2c6f0 28 76 6f 69 64 20 2a 70 29 7b 20 73 71 6c 69 74  (void *p){ sqlit
2c700 65 33 5f 66 72 65 65 28 70 29 3b 20 7d 0d 0a 0d  e3_free(p); }...
2c710 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
2c720 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0d  te3Fts5ExprNew(.
2c730 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2c740 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
2c750 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69     /* FTS5 Confi
2c760 67 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69  guration */..  i
2c770 6e 74 20 69 43 6f 6c 2c 0d 0a 20 20 63 6f 6e 73  nt iCol,..  cons
2c780 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20  t char *zExpr,  
2c790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2c7a0 78 70 72 65 73 73 69 6f 6e 20 74 65 78 74 20 2a  xpression text *
2c7b0 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 2a  /..  Fts5Expr **
2c7c0 70 70 4e 65 77 2c 20 0d 0a 20 20 63 68 61 72 20  ppNew, ..  char 
2c7d0 2a 2a 70 7a 45 72 72 0d 0a 29 7b 0d 0a 20 20 46  **pzErr..){..  F
2c7e0 74 73 35 50 61 72 73 65 20 73 50 61 72 73 65 3b  ts5Parse sParse;
2c7f0 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 74 6f  ..  Fts5Token to
2c800 6b 65 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 68  ken;..  const ch
2c810 61 72 20 2a 7a 20 3d 20 7a 45 78 70 72 3b 0d 0a  ar *z = zExpr;..
2c820 20 20 69 6e 74 20 74 3b 20 20 20 20 20 20 20 20    int t;        
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 2f 2a 20 4e 65 78 74 20 74 6f 6b 65 6e 20    /* Next token 
2c850 74 79 70 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20  type */..  void 
2c860 2a 70 45 6e 67 69 6e 65 3b 0d 0a 20 20 46 74 73  *pEngine;..  Fts
2c870 35 45 78 70 72 20 2a 70 4e 65 77 3b 0d 0a 0d 0a  5Expr *pNew;....
2c880 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0d 0a 20    *ppNew = 0;.. 
2c890 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0d 0a 20 20   *pzErr = 0;..  
2c8a0 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20  memset(&sParse, 
2c8b0 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65  0, sizeof(sParse
2c8c0 29 29 3b 0d 0a 20 20 70 45 6e 67 69 6e 65 20 3d  ));..  pEngine =
2c8d0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
2c8e0 65 72 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73  erAlloc(fts5Pars
2c8f0 65 41 6c 6c 6f 63 29 3b 0d 0a 20 20 69 66 28 20  eAlloc);..  if( 
2c900 70 45 6e 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65  pEngine==0 ){ re
2c910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c920 4d 3b 20 7d 0d 0a 20 20 73 50 61 72 73 65 2e 70  M; }..  sParse.p
2c930 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
2c940 3b 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20 20  ;....  do {..   
2c950 20 74 20 3d 20 66 74 73 35 45 78 70 72 47 65 74   t = fts5ExprGet
2c960 54 6f 6b 65 6e 28 26 73 50 61 72 73 65 2c 20 26  Token(&sParse, &
2c970 7a 2c 20 26 74 6f 6b 65 6e 29 3b 0d 0a 20 20 20  z, &token);..   
2c980 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
2c990 65 72 28 70 45 6e 67 69 6e 65 2c 20 74 2c 20 74  er(pEngine, t, t
2c9a0 6f 6b 65 6e 2c 20 26 73 50 61 72 73 65 29 3b 0d  oken, &sParse);.
2c9b0 0a 20 20 7d 77 68 69 6c 65 28 20 73 50 61 72 73  .  }while( sPars
2c9c0 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  e.rc==SQLITE_OK 
2c9d0 26 26 20 74 21 3d 46 54 53 35 5f 45 4f 46 20 29  && t!=FTS5_EOF )
2c9e0 3b 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  ;..  sqlite3Fts5
2c9f0 50 61 72 73 65 72 46 72 65 65 28 70 45 6e 67 69  ParserFree(pEngi
2ca00 6e 65 2c 20 66 74 73 35 50 61 72 73 65 46 72 65  ne, fts5ParseFre
2ca10 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74  e);....  /* If t
2ca20 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 4d 41  he LHS of the MA
2ca30 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 77  TCH expression w
2ca40 61 73 20 61 20 75 73 65 72 20 63 6f 6c 75 6d 6e  as a user column
2ca50 2c 20 61 70 70 6c 79 20 74 68 65 0d 0a 20 20 2a  , apply the..  *
2ca60 2a 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c 75 6d  * implicit colum
2ca70 6e 2d 66 69 6c 74 65 72 2e 20 20 2a 2f 0d 0a 20  n-filter.  */.. 
2ca80 20 69 66 28 20 69 43 6f 6c 3c 70 43 6f 6e 66 69   if( iCol<pConfi
2ca90 67 2d 3e 6e 43 6f 6c 20 26 26 20 73 50 61 72 73  g->nCol && sPars
2caa0 65 2e 70 45 78 70 72 20 26 26 20 73 50 61 72 73  e.pExpr && sPars
2cab0 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  e.rc==SQLITE_OK 
2cac0 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  ){..    int n = 
2cad0 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65  sizeof(Fts5Colse
2cae0 74 29 3b 0d 0a 20 20 20 20 46 74 73 35 43 6f 6c  t);..    Fts5Col
2caf0 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 28  set *pColset = (
2cb00 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69  Fts5Colset*)sqli
2cb10 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
2cb20 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20 6e 29  o(&sParse.rc, n)
2cb30 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ;..    if( pCols
2cb40 65 74 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 6f  et ){..      pCo
2cb50 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31 3b 0d  lset->nCol = 1;.
2cb60 0a 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e  .      pColset->
2cb70 61 69 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f 6c 3b  aiCol[0] = iCol;
2cb80 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
2cb90 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65  ts5ParseSetColse
2cba0 74 28 26 73 50 61 72 73 65 2c 20 73 50 61 72 73  t(&sParse, sPars
2cbb0 65 2e 70 45 78 70 72 2c 20 70 43 6f 6c 73 65 74  e.pExpr, pColset
2cbc0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
2cbd0 0d 0a 20 20 61 73 73 65 72 74 28 20 73 50 61 72  ..  assert( sPar
2cbe0 73 65 2e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  se.rc!=SQLITE_OK
2cbf0 20 7c 7c 20 73 50 61 72 73 65 2e 7a 45 72 72 3d   || sParse.zErr=
2cc00 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 73 50 61  =0 );..  if( sPa
2cc10 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rse.rc==SQLITE_O
2cc20 4b 20 29 7b 0d 0a 20 20 20 20 2a 70 70 4e 65 77  K ){..    *ppNew
2cc30 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   = pNew = sqlite
2cc40 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2cc50 46 74 73 35 45 78 70 72 29 29 3b 0d 0a 20 20 20  Fts5Expr));..   
2cc60 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0d   if( pNew==0 ){.
2cc70 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 72 63  .      sParse.rc
2cc80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2cc90 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
2cca0 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
2ccb0 28 73 50 61 72 73 65 2e 70 45 78 70 72 29 3b 0d  (sParse.pExpr);.
2ccc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
2ccd0 20 20 20 69 66 28 20 21 73 50 61 72 73 65 2e 70     if( !sParse.p
2cce0 45 78 70 72 20 29 7b 0d 0a 20 20 20 20 20 20 20  Expr ){..       
2ccf0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74 65   const int nByte
2cd00 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78   = sizeof(Fts5Ex
2cd10 70 72 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20  prNode);..      
2cd20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20    pNew->pRoot = 
2cd30 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73  (Fts5ExprNode*)s
2cd40 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
2cd50 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c  Zero(&sParse.rc,
2cd60 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20   nByte);..      
2cd70 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f    if( pNew->pRoo
2cd80 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t ){..          
2cd90 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f  pNew->pRoot->bEo
2cda0 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20  f = 1;..        
2cdb0 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  }..      }else{.
2cdc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2cdd0 52 6f 6f 74 20 3d 20 73 50 61 72 73 65 2e 70 45  Root = sParse.pE
2cde0 78 70 72 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  xpr;..      }.. 
2cdf0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65       pNew->pInde
2ce00 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 70 4e  x = 0;..      pN
2ce10 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43  ew->pConfig = pC
2ce20 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20 70 4e  onfig;..      pN
2ce30 65 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  ew->apExprPhrase
2ce40 20 3d 20 73 50 61 72 73 65 2e 61 70 50 68 72 61   = sParse.apPhra
2ce50 73 65 3b 0d 0a 20 20 20 20 20 20 70 4e 65 77 2d  se;..      pNew-
2ce60 3e 6e 50 68 72 61 73 65 20 3d 20 73 50 61 72 73  >nPhrase = sPars
2ce70 65 2e 6e 50 68 72 61 73 65 3b 0d 0a 20 20 20 20  e.nPhrase;..    
2ce80 20 20 73 50 61 72 73 65 2e 61 70 50 68 72 61 73    sParse.apPhras
2ce90 65 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20  e = 0;..    }.. 
2cea0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71 6c   }else{..    sql
2ceb0 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
2cec0 65 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78  eFree(sParse.pEx
2ced0 70 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 73  pr);..  }....  s
2cee0 71 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72  qlite3_free(sPar
2cef0 73 65 2e 61 70 50 68 72 61 73 65 29 3b 0d 0a 20  se.apPhrase);.. 
2cf00 20 2a 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65   *pzErr = sParse
2cf10 2e 7a 45 72 72 3b 0d 0a 20 20 72 65 74 75 72 6e  .zErr;..  return
2cf20 20 73 50 61 72 73 65 2e 72 63 3b 0d 0a 7d 0d 0a   sParse.rc;..}..
2cf30 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68  ../*..** Free th
2cf40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
2cf50 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
2cf60 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
2cf70 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ment...*/..stati
2cf80 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
2cf90 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
2cfa0 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29  Fts5ExprNode *p)
2cfb0 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20  {..  if( p ){.. 
2cfc0 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66     int i;..    f
2cfd0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
2cfe0 69 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  ild; i++){..    
2cff0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
2d000 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e 61 70  seNodeFree(p->ap
2d010 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20 20 20  Child[i]);..    
2d020 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
2d030 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
2d040 65 65 28 70 2d 3e 70 4e 65 61 72 29 3b 0d 0a 20  ee(p->pNear);.. 
2d050 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d060 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f  p);..  }..}..../
2d070 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 65  *..** Free the e
2d080 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  xpression object
2d090 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
2d0a0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a  nly argument...*
2d0b0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
2d0c0 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72  qlite3Fts5ExprFr
2d0d0 65 65 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b  ee(Fts5Expr *p){
2d0e0 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20  ..  if( p ){..  
2d0f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
2d100 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 52  seNodeFree(p->pR
2d110 6f 6f 74 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74  oot);..    sqlit
2d120 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 45 78 70  e3_free(p->apExp
2d130 72 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 73  rPhrase);..    s
2d140 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d  qlite3_free(p);.
2d150 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  .  }..}..../*..*
2d160 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65 72 6d  * Argument pTerm
2d170 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e 6f 6e   must be a synon
2d180 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52 65 74  ym iterator. Ret
2d190 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2d1a0 72 6f 77 69 64 0d 0a 2a 2a 20 74 68 61 74 20 69  rowid..** that i
2d1b0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0d 0a 2a 2f  t points to...*/
2d1c0 0d 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
2d1d0 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
2d1e0 64 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a  d(Fts5ExprTerm *
2d1f0 70 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63  pTerm, int bDesc
2d200 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0d 0a  , int *pbEof){..
2d210 20 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0d    i64 iRet = 0;.
2d220 0a 20 20 69 6e 74 20 62 52 65 74 56 61 6c 69 64  .  int bRetValid
2d230 20 3d 20 30 3b 0d 0a 20 20 46 74 73 35 45 78 70   = 0;..  Fts5Exp
2d240 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20 20 61  rTerm *p;....  a
2d250 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 53  ssert( pTerm->pS
2d260 79 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20 61 73 73  ynonym );..  ass
2d270 65 72 74 28 20 62 44 65 73 63 3d 3d 30 20 7c 7c  ert( bDesc==0 ||
2d280 20 62 44 65 73 63 3d 3d 31 20 29 3b 0d 0a 20 20   bDesc==1 );..  
2d290 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20  for(p=pTerm; p; 
2d2a0 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d  p=p->pSynonym){.
2d2b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
2d2c0 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
2d2d0 2d 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20 20 20  ->pIter) ){..   
2d2e0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2d2f0 70 2d 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  p->pIter->iRowid
2d300 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  ;..      if( bRe
2d310 74 56 61 6c 69 64 3d 3d 30 20 7c 7c 20 28 62 44  tValid==0 || (bD
2d320 65 73 63 21 3d 28 69 52 6f 77 69 64 3c 69 52 65  esc!=(iRowid<iRe
2d330 74 29 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  t)) ){..        
2d340 69 52 65 74 20 3d 20 69 52 6f 77 69 64 3b 0d 0a  iRet = iRowid;..
2d350 20 20 20 20 20 20 20 20 62 52 65 74 56 61 6c 69          bRetVali
2d360 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d  d = 1;..      }.
2d370 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
2d380 20 69 66 28 20 70 62 45 6f 66 20 26 26 20 62 52   if( pbEof && bR
2d390 65 74 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62  etValid==0 ) *pb
2d3a0 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 72 65 74 75  Eof = 1;..  retu
2d3b0 72 6e 20 69 52 65 74 3b 0d 0a 7d 0d 0a 0d 0a 2f  rn iRet;..}..../
2d3c0 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  *..** Argument p
2d3d0 54 65 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73  Term must be a s
2d3e0 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e  ynonym iterator.
2d3f0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
2d400 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d   fts5ExprSynonym
2d410 4c 69 73 74 28 0d 0a 20 20 46 74 73 35 45 78 70  List(..  Fts5Exp
2d420 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 0d 0a  rTerm *pTerm, ..
2d430 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0d 0a 20    i64 iRowid,.. 
2d440 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2d450 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
2d460 20 2f 2a 20 55 73 65 20 74 68 69 73 20 62 75 66   /* Use this buf
2d470 66 65 72 20 66 6f 72 20 73 70 61 63 65 20 69 66  fer for space if
2d480 20 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20   required */..  
2d490 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20 2a 70 6e  u8 **pa, int *pn
2d4a0 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 50 6f 73 6c  ..){..  Fts5Posl
2d4b0 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74 69  istReader aStati
2d4c0 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50 6f 73  c[4];..  Fts5Pos
2d4d0 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65  listReader *aIte
2d4e0 72 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20 20  r = aStatic;..  
2d4f0 69 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0d 0a  int nIter = 0;..
2d500 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34    int nAlloc = 4
2d510 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ;..  int rc = SQ
2d520 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46 74 73 35  LITE_OK;..  Fts5
2d530 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a  ExprTerm *p;....
2d540 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
2d550 3e 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20  >pSynonym );..  
2d560 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20  for(p=pTerm; p; 
2d570 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d  p=p->pSynonym){.
2d580 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74  .    Fts5IndexIt
2d590 65 72 20 2a 70 49 74 65 72 20 3d 20 70 2d 3e 70  er *pIter = p->p
2d5a0 49 74 65 72 3b 0d 0a 20 20 20 20 69 66 28 20 73  Iter;..    if( s
2d5b0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
2d5c0 66 28 70 49 74 65 72 29 3d 3d 30 20 26 26 20 70  f(pIter)==0 && p
2d5d0 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69 52  Iter->iRowid==iR
2d5e0 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 69  owid ){..      i
2d5f0 66 28 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 3d  f( pIter->nData=
2d600 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a  =0 ) continue;..
2d610 20 20 20 20 20 20 69 66 28 20 6e 49 74 65 72 3d        if( nIter=
2d620 3d 6e 41 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20  =nAlloc ){..    
2d630 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2d640 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69  sizeof(Fts5Posli
2d650 73 74 52 65 61 64 65 72 29 20 2a 20 6e 41 6c 6c  stReader) * nAll
2d660 6f 63 20 2a 20 32 3b 0d 0a 20 20 20 20 20 20 20  oc * 2;..       
2d670 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2d680 65 72 20 2a 61 4e 65 77 20 3d 20 28 46 74 73 35  er *aNew = (Fts5
2d690 50 6f 73 6c 69 73 74 52 65 61 64 65 72 2a 29 73  PoslistReader*)s
2d6a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
2d6b0 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69  yte);..        i
2d6c0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0d 0a 20  f( aNew==0 ){.. 
2d6d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2d6e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
2d6f0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 6f         goto syno
2d700 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3b  nym_poslist_out;
2d710 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
2d720 20 20 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77       memcpy(aNew
2d730 2c 20 61 49 74 65 72 2c 20 73 69 7a 65 6f 66 28  , aIter, sizeof(
2d740 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2d750 72 29 20 2a 20 6e 49 74 65 72 29 3b 0d 0a 20 20  r) * nIter);..  
2d760 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
2d770 41 6c 6c 6f 63 2a 32 3b 0d 0a 20 20 20 20 20 20  Alloc*2;..      
2d780 20 20 69 66 28 20 61 49 74 65 72 21 3d 61 53 74    if( aIter!=aSt
2d790 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66  atic ) sqlite3_f
2d7a0 72 65 65 28 61 49 74 65 72 29 3b 0d 0a 20 20 20  ree(aIter);..   
2d7b0 20 20 20 20 20 61 49 74 65 72 20 3d 20 61 4e 65       aIter = aNe
2d7c0 77 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  w;..      }..   
2d7d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
2d7e0 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
2d7f0 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49  pIter->pData, pI
2d800 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 61 49 74  ter->nData, &aIt
2d810 65 72 5b 6e 49 74 65 72 5d 29 3b 0d 0a 20 20 20  er[nIter]);..   
2d820 20 20 20 61 73 73 65 72 74 28 20 61 49 74 65 72     assert( aIter
2d830 5b 6e 49 74 65 72 5d 2e 62 45 6f 66 3d 3d 30 20  [nIter].bEof==0 
2d840 29 3b 0d 0a 20 20 20 20 20 20 6e 49 74 65 72 2b  );..      nIter+
2d850 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  +;..    }..  }..
2d860 0d 0a 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31  ..  if( nIter==1
2d870 20 29 7b 0d 0a 20 20 20 20 2a 70 61 20 3d 20 28   ){..    *pa = (
2d880 75 38 2a 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0d  u8*)aIter[0].a;.
2d890 0a 20 20 20 20 2a 70 6e 20 3d 20 61 49 74 65 72  .    *pn = aIter
2d8a0 5b 30 5d 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b  [0].n;..  }else{
2d8b0 0d 0a 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73  ..    Fts5Poslis
2d8c0 74 57 72 69 74 65 72 20 77 72 69 74 65 72 20 3d  tWriter writer =
2d8d0 20 7b 30 7d 3b 0d 0a 20 20 20 20 69 36 34 20 69   {0};..    i64 i
2d8e0 50 72 65 76 20 3d 20 2d 31 3b 0d 0a 20 20 20 20  Prev = -1;..    
2d8f0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
2d900 42 75 66 29 3b 0d 0a 20 20 20 20 77 68 69 6c 65  Buf);..    while
2d910 28 20 31 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e  ( 1 ){..      in
2d920 74 20 69 3b 0d 0a 20 20 20 20 20 20 69 36 34 20  t i;..      i64 
2d930 69 4d 69 6e 20 3d 20 46 54 53 35 5f 4c 41 52 47  iMin = FTS5_LARG
2d940 45 53 54 5f 49 4e 54 36 34 3b 0d 0a 20 20 20 20  EST_INT64;..    
2d950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74    for(i=0; i<nIt
2d960 65 72 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20  er; i++){..     
2d970 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e     if( aIter[i].
2d980 62 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  bEof==0 ){..    
2d990 20 20 20 20 20 20 69 66 28 20 61 49 74 65 72 5b        if( aIter[
2d9a0 69 5d 2e 69 50 6f 73 3d 3d 69 50 72 65 76 20 29  i].iPos==iPrev )
2d9b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
2d9c0 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  f( sqlite3Fts5Po
2d9d0 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
2d9e0 26 61 49 74 65 72 5b 69 5d 29 20 29 20 63 6f 6e  &aIter[i]) ) con
2d9f0 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
2da00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
2da10 66 28 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73  f( aIter[i].iPos
2da20 3c 69 4d 69 6e 20 29 7b 0d 0a 20 20 20 20 20 20  <iMin ){..      
2da30 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74        iMin = aIt
2da40 65 72 5b 69 5d 2e 69 50 6f 73 3b 0d 0a 20 20 20  er[i].iPos;..   
2da50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2da60 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2da70 20 20 20 20 69 66 28 20 69 4d 69 6e 3d 3d 46 54      if( iMin==FT
2da80 53 35 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  S5_LARGEST_INT64
2da90 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
2daa0 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  K ) break;..    
2dab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2dac0 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
2dad0 70 70 65 6e 64 28 70 42 75 66 2c 20 26 77 72 69  ppend(pBuf, &wri
2dae0 74 65 72 2c 20 69 4d 69 6e 29 3b 0d 0a 20 20 20  ter, iMin);..   
2daf0 20 20 20 69 50 72 65 76 20 3d 20 69 4d 69 6e 3b     iPrev = iMin;
2db00 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28  ..    }..    if(
2db10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2db20 7b 0d 0a 20 20 20 20 20 20 2a 70 61 20 3d 20 70  {..      *pa = p
2db30 42 75 66 2d 3e 70 3b 0d 0a 20 20 20 20 20 20 2a  Buf->p;..      *
2db40 70 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0d 0a 20  pn = pBuf->n;.. 
2db50 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 73 79     }..  }.... sy
2db60 6e 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75  nonym_poslist_ou
2db70 74 3a 0d 0a 20 20 69 66 28 20 61 49 74 65 72 21  t:..  if( aIter!
2db80 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  =aStatic ) sqlit
2db90 65 33 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0d  e3_free(aIter);.
2dba0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
2dbb0 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c  ....../*..** All
2dbc0 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d   individual term
2dbd0 20 69 74 65 72 61 74 6f 72 73 20 69 6e 20 70 50   iterators in pP
2dbe0 68 72 61 73 65 20 61 72 65 20 67 75 61 72 61 6e  hrase are guaran
2dbf0 74 65 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64  teed to be valid
2dc00 20 61 6e 64 0d 0a 2a 2a 20 70 6f 69 6e 74 69 6e   and..** pointin
2dc10 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f  g to the same ro
2dc20 77 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  wid when this fu
2dc30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2dc40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2dc50 0d 0a 2a 2a 20 63 68 65 63 6b 73 20 69 66 20 74  ..** checks if t
2dc60 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
2dc70 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6d 61 74   really is a mat
2dc80 63 68 2c 20 61 6e 64 20 69 66 20 73 6f 20 70 6f  ch, and if so po
2dc90 70 75 6c 61 74 65 73 0d 0a 2a 2a 20 74 68 65 20  pulates..** the 
2dca0 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2dcb0 20 62 75 66 66 65 72 20 61 63 63 6f 72 64 69 6e   buffer accordin
2dcc0 67 6c 79 2e 20 4f 75 74 70 75 74 20 70 61 72 61  gly. Output para
2dcd0 6d 65 74 65 72 20 2a 70 62 4d 61 74 63 68 0d 0a  meter *pbMatch..
2dce0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ** is set to tru
2dcf0 65 20 69 66 20 74 68 69 73 20 69 73 20 72 65 61  e if this is rea
2dd00 6c 6c 79 20 61 20 6d 61 74 63 68 2c 20 6f 72 20  lly a match, or 
2dd10 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2dd20 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f  ..**..** SQLITE_
2dd30 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2dd40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2dd50 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
2dd60 65 72 72 6f 72 20 63 6f 64 65 20 0d 0a 2a 2a 20  error code ..** 
2dd70 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73  otherwise. It is
2dd80 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
2dd90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
2dda0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2ddb0 69 64 20 69 73 20 0d 0a 2a 2a 20 6e 6f 74 20 61  id is ..** not a
2ddc0 20 6d 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73 74 61   match...*/..sta
2ddd0 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2dde0 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 0d 0a  PhraseIsMatch(..
2ddf0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
2de00 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pNode,          
2de10 20 20 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73    /* Node pPhras
2de20 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d  e belongs to */.
2de30 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
2de40 65 20 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20  e *pPhrase,     
2de50 20 20 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a     /* Phrase obj
2de60 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ect to initializ
2de70 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 4d  e */..  int *pbM
2de80 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
2de90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2dea0 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 72  Set to true if r
2deb0 65 61 6c 6c 79 20 61 20 6d 61 74 63 68 20 2a 2f  eally a match */
2dec0 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 50 6f 73 6c  ..){..  Fts5Posl
2ded0 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
2dee0 20 3d 20 7b 30 7d 3b 0d 0a 20 20 46 74 73 35 50   = {0};..  Fts5P
2def0 6f 73 6c 69 73 74 52 65 61 64 65 72 20 61 53 74  oslistReader aSt
2df00 61 74 69 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35  atic[4];..  Fts5
2df10 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61  PoslistReader *a
2df20 49 74 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0d  Iter = aStatic;.
2df30 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74  .  int i;..  int
2df40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2df50 0d 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d  ..  int bFirst =
2df60 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
2df70 30 5d 2e 62 46 69 72 73 74 3b 0d 0a 20 20 0d 0a  0].bFirst;..  ..
2df80 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
2df90 28 26 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69  (&pPhrase->posli
2dfa0 73 74 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20  st);....  /* If 
2dfb0 74 68 65 20 61 53 74 61 74 69 63 5b 5d 20 61 72  the aStatic[] ar
2dfc0 72 61 79 20 69 73 20 6e 6f 74 20 6c 61 72 67 65  ray is not large
2dfd0 20 65 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74   enough, allocat
2dfe0 65 20 61 20 6c 61 72 67 65 20 61 72 72 61 79 0d  e a large array.
2dff0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  .  ** using sqli
2e000 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  te3_malloc(). Th
2e010 69 73 20 61 70 70 72 6f 61 63 68 20 63 6f 75 6c  is approach coul
2e020 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 75 70  d be improved up
2e030 6f 6e 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 50  on. */..  if( pP
2e040 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72  hrase->nTerm>Arr
2e050 61 79 53 69 7a 65 28 61 53 74 61 74 69 63 29 20  aySize(aStatic) 
2e060 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ){..    int nByt
2e070 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  e = sizeof(Fts5P
2e080 6f 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20  oslistReader) * 
2e090 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 0d  pPhrase->nTerm;.
2e0a0 0a 20 20 20 20 61 49 74 65 72 20 3d 20 28 46 74  .    aIter = (Ft
2e0b0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 2a  s5PoslistReader*
2e0c0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2e0d0 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 69 66 28  nByte);..    if(
2e0e0 20 21 61 49 74 65 72 20 29 20 72 65 74 75 72 6e   !aIter ) return
2e0f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a   SQLITE_NOMEM;..
2e100 20 20 7d 0d 0a 20 20 6d 65 6d 73 65 74 28 61 49    }..  memset(aI
2e110 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
2e120 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2e130 29 20 2a 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  ) * pPhrase->nTe
2e140 72 6d 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69  rm);....  /* Ini
2e150 74 69 61 6c 69 7a 65 20 61 20 74 65 72 6d 20 69  tialize a term i
2e160 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  terator for each
2e170 20 74 65 72 6d 20 69 6e 20 74 68 65 20 70 68 72   term in the phr
2e180 61 73 65 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d  ase */..  for(i=
2e190 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; i<pPhrase->nT
2e1a0 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  erm; i++){..    
2e1b0 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
2e1c0 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
2e1d0 61 54 65 72 6d 5b 69 5d 3b 0d 0a 20 20 20 20 69  aTerm[i];..    i
2e1e0 6e 74 20 6e 20 3d 20 30 3b 0d 0a 20 20 20 20 69  nt n = 0;..    i
2e1f0 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0d 0a 20  nt bFlag = 0;.. 
2e200 20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0d 0a 20     u8 *a = 0;.. 
2e210 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53     if( pTerm->pS
2e220 79 6e 6f 6e 79 6d 20 29 7b 0d 0a 20 20 20 20 20  ynonym ){..     
2e230 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
2e240 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0d 0a 20 20  = {0, 0, 0};..  
2e250 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
2e260 72 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 70 54 65  rSynonymList(pTe
2e270 72 6d 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  rm, pNode->iRowi
2e280 64 2c 20 26 62 75 66 2c 20 26 61 2c 20 26 6e 29  d, &buf, &a, &n)
2e290 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  ;..      if( rc 
2e2a0 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){..        sqli
2e2b0 74 65 33 5f 66 72 65 65 28 61 29 3b 0d 0a 20 20  te3_free(a);..  
2e2c0 20 20 20 20 20 20 67 6f 74 6f 20 69 73 6d 61 74        goto ismat
2e2d0 63 68 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 7d  ch_out;..      }
2e2e0 0d 0a 20 20 20 20 20 20 69 66 28 20 61 3d 3d 62  ..      if( a==b
2e2f0 75 66 2e 70 20 29 20 62 46 6c 61 67 20 3d 20 31  uf.p ) bFlag = 1
2e300 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
2e310 20 20 20 20 20 61 20 3d 20 28 75 38 2a 29 70 54       a = (u8*)pT
2e320 65 72 6d 2d 3e 70 49 74 65 72 2d 3e 70 44 61 74  erm->pIter->pDat
2e330 61 3b 0d 0a 20 20 20 20 20 20 6e 20 3d 20 70 54  a;..      n = pT
2e340 65 72 6d 2d 3e 70 49 74 65 72 2d 3e 6e 44 61 74  erm->pIter->nDat
2e350 61 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73  a;..    }..    s
2e360 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2e370 74 52 65 61 64 65 72 49 6e 69 74 28 61 2c 20 6e  tReaderInit(a, n
2e380 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b 0d 0a 20  , &aIter[i]);.. 
2e390 20 20 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c 61     aIter[i].bFla
2e3a0 67 20 3d 20 28 75 38 29 62 46 6c 61 67 3b 0d 0a  g = (u8)bFlag;..
2e3b0 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
2e3c0 2e 62 45 6f 66 20 29 20 67 6f 74 6f 20 69 73 6d  .bEof ) goto ism
2e3d0 61 74 63 68 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a  atch_out;..  }..
2e3e0 0d 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0d  ..  while( 1 ){.
2e3f0 0a 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b  .    int bMatch;
2e400 0d 0a 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d  ..    i64 iPos =
2e410 20 61 49 74 65 72 5b 30 5d 2e 69 50 6f 73 3b 0d   aIter[0].iPos;.
2e420 0a 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20  .    do {..     
2e430 20 62 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20 20   bMatch = 1;..  
2e440 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2e450 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69  Phrase->nTerm; i
2e460 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74  ++){..        Ft
2e470 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2e480 2a 70 50 6f 73 20 3d 20 26 61 49 74 65 72 5b 69  *pPos = &aIter[i
2e490 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 36 34 20  ];..        i64 
2e4a0 69 41 64 6a 20 3d 20 69 50 6f 73 20 2b 20 69 3b  iAdj = iPos + i;
2e4b0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
2e4c0 6f 73 2d 3e 69 50 6f 73 21 3d 69 41 64 6a 20 29  os->iPos!=iAdj )
2e4d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61  {..          bMa
2e4e0 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  tch = 0;..      
2e4f0 20 20 20 20 77 68 69 6c 65 28 20 70 50 6f 73 2d      while( pPos-
2e500 3e 69 50 6f 73 3c 69 41 64 6a 20 29 7b 0d 0a 20  >iPos<iAdj ){.. 
2e510 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2e520 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2e530 74 52 65 61 64 65 72 4e 65 78 74 28 70 50 6f 73  tReaderNext(pPos
2e540 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68  ) ) goto ismatch
2e550 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  _out;..         
2e560 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   }..          if
2e570 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41 64  ( pPos->iPos>iAd
2e580 6a 20 29 20 69 50 6f 73 20 3d 20 70 50 6f 73 2d  j ) iPos = pPos-
2e590 3e 69 50 6f 73 2d 69 3b 0d 0a 20 20 20 20 20 20  >iPos-i;..      
2e5a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2e5b0 20 20 7d 77 68 69 6c 65 28 20 62 4d 61 74 63 68    }while( bMatch
2e5c0 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a  ==0 );....    /*
2e5d0 20 41 70 70 65 6e 64 20 70 6f 73 69 74 69 6f 6e   Append position
2e5e0 20 69 50 6f 73 20 74 6f 20 74 68 65 20 6f 75 74   iPos to the out
2e5f0 70 75 74 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20  put */..    if( 
2e600 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 46 54 53  bFirst==0 || FTS
2e610 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f  5_POS2OFFSET(iPo
2e620 73 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  s)==0 ){..      
2e630 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2e640 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
2e650 65 6e 64 28 26 70 50 68 72 61 73 65 2d 3e 70 6f  end(&pPhrase->po
2e660 73 6c 69 73 74 2c 20 26 77 72 69 74 65 72 2c 20  slist, &writer, 
2e670 69 50 6f 73 29 3b 0d 0a 20 20 20 20 20 20 69 66  iPos);..      if
2e680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e690 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
2e6a0 75 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ut;..    }....  
2e6b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68    for(i=0; i<pPh
2e6c0 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  rase->nTerm; i++
2e6d0 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 73 71  ){..      if( sq
2e6e0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2e6f0 52 65 61 64 65 72 4e 65 78 74 28 26 61 49 74 65  ReaderNext(&aIte
2e700 72 5b 69 5d 29 20 29 20 67 6f 74 6f 20 69 73 6d  r[i]) ) goto ism
2e710 61 74 63 68 5f 6f 75 74 3b 0d 0a 20 20 20 20 7d  atch_out;..    }
2e720 0d 0a 20 20 7d 0d 0a 0d 0a 20 69 73 6d 61 74 63  ..  }.... ismatc
2e730 68 5f 6f 75 74 3a 0d 0a 20 20 2a 70 62 4d 61 74  h_out:..  *pbMat
2e740 63 68 20 3d 20 28 70 50 68 72 61 73 65 2d 3e 70  ch = (pPhrase->p
2e750 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0d 0a 20 20  oslist.n>0);..  
2e760 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61  for(i=0; i<pPhra
2e770 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  se->nTerm; i++){
2e780 0d 0a 20 20 20 20 69 66 28 20 61 49 74 65 72 5b  ..    if( aIter[
2e790 69 5d 2e 62 46 6c 61 67 20 29 20 73 71 6c 69 74  i].bFlag ) sqlit
2e7a0 65 33 5f 66 72 65 65 28 28 75 38 2a 29 61 49 74  e3_free((u8*)aIt
2e7b0 65 72 5b 69 5d 2e 61 29 3b 0d 0a 20 20 7d 0d 0a  er[i].a);..  }..
2e7c0 20 20 69 66 28 20 61 49 74 65 72 21 3d 61 53 74    if( aIter!=aSt
2e7d0 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66  atic ) sqlite3_f
2e7e0 72 65 65 28 61 49 74 65 72 29 3b 0d 0a 20 20 72  ree(aIter);..  r
2e7f0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
2e800 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2e810 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
2e820 65 72 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64  er Fts5Lookahead
2e830 52 65 61 64 65 72 3b 0d 0a 73 74 72 75 63 74 20  Reader;..struct 
2e840 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
2e850 64 65 72 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 75  der {..  const u
2e860 38 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  8 *a;           
2e870 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
2e880 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f  er containing po
2e890 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0d 0a  sition list */..
2e8a0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
2e8d0 66 65 72 20 61 5b 5d 20 69 6e 20 62 79 74 65 73  fer a[] in bytes
2e8e0 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20   */..  int i;   
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e900 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2e910 74 20 6f 66 66 73 65 74 20 69 6e 20 70 6f 73 69  t offset in posi
2e920 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0d 0a 20 20  tion list */..  
2e930 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20 20 20  i64 iPos;       
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e950 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f 73 69 74  /* Current posit
2e960 69 6f 6e 20 2a 2f 0d 0a 20 20 69 36 34 20 69 4c  ion */..  i64 iL
2e970 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
2e980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e990 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0d 0a 7d  t position */..}
2e9a0 3b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 46 54 53  ;....#define FTS
2e9b0 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 20  5_LOOKAHEAD_EOF 
2e9c0 28 28 28 69 36 34 29 31 29 20 3c 3c 20 36 32 29  (((i64)1) << 62)
2e9d0 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ....static int f
2e9e0 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
2e9f0 65 72 4e 65 78 74 28 46 74 73 35 4c 6f 6f 6b 61  erNext(Fts5Looka
2ea00 68 65 61 64 52 65 61 64 65 72 20 2a 70 29 7b 0d  headReader *p){.
2ea10 0a 20 20 70 2d 3e 69 50 6f 73 20 3d 20 70 2d 3e  .  p->iPos = p->
2ea20 69 4c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 20 20 69  iLookahead;..  i
2ea30 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  f( sqlite3Fts5Po
2ea40 73 6c 69 73 74 4e 65 78 74 36 34 28 70 2d 3e 61  slistNext64(p->a
2ea50 2c 20 70 2d 3e 6e 2c 20 26 70 2d 3e 69 2c 20 26  , p->n, &p->i, &
2ea60 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 29 20 29  p->iLookahead) )
2ea70 7b 0d 0a 20 20 20 20 70 2d 3e 69 4c 6f 6f 6b 61  {..    p->iLooka
2ea80 68 65 61 64 20 3d 20 46 54 53 35 5f 4c 4f 4f 4b  head = FTS5_LOOK
2ea90 41 48 45 41 44 5f 45 4f 46 3b 0d 0a 20 20 7d 0d  AHEAD_EOF;..  }.
2eaa0 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 69 50  .  return (p->iP
2eab0 6f 73 3d 3d 46 54 53 35 5f 4c 4f 4f 4b 41 48 45  os==FTS5_LOOKAHE
2eac0 41 44 5f 45 4f 46 29 3b 0d 0a 7d 0d 0a 0d 0a 73  AD_EOF);..}....s
2ead0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 6f  tatic int fts5Lo
2eae0 6f 6b 61 68 65 61 64 52 65 61 64 65 72 49 6e 69  okaheadReaderIni
2eaf0 74 28 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t(..  const u8 *
2eb00 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  a, int n,       
2eb10 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2eb20 74 6f 20 72 65 61 64 20 70 6f 73 69 74 69 6f 6e  to read position
2eb30 20 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0d 0a 20   list from */.. 
2eb40 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   Fts5LookaheadRe
2eb50 61 64 65 72 20 2a 70 20 20 20 20 20 20 20 20 20  ader *p         
2eb60 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a   /* Iterator obj
2eb70 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ect to initializ
2eb80 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 6d 65 6d 73  e */..){..  mems
2eb90 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
2eba0 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
2ebb0 64 65 72 29 29 3b 0d 0a 20 20 70 2d 3e 61 20 3d  der));..  p->a =
2ebc0 20 61 3b 0d 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b   a;..  p->n = n;
2ebd0 0d 0a 20 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  ..  fts5Lookahea
2ebe0 64 52 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0d  dReaderNext(p);.
2ebf0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 4c 6f  .  return fts5Lo
2ec00 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78  okaheadReaderNex
2ec10 74 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a 74 79 70 65  t(p);..}....type
2ec20 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4e  def struct Fts5N
2ec30 65 61 72 54 72 69 6d 6d 65 72 20 46 74 73 35 4e  earTrimmer Fts5N
2ec40 65 61 72 54 72 69 6d 6d 65 72 3b 0d 0a 73 74 72  earTrimmer;..str
2ec50 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69 6d  uct Fts5NearTrim
2ec60 6d 65 72 20 7b 0d 0a 20 20 46 74 73 35 4c 6f 6f  mer {..  Fts5Loo
2ec70 6b 61 68 65 61 64 52 65 61 64 65 72 20 72 65 61  kaheadReader rea
2ec80 64 65 72 3b 20 20 20 20 20 2f 2a 20 49 6e 70 75  der;     /* Inpu
2ec90 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0d 0a 20  t iterator */.. 
2eca0 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
2ecb0 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20  er writer;      
2ecc0 20 2f 2a 20 57 72 69 74 65 72 20 63 6f 6e 74 65   /* Writer conte
2ecd0 78 74 20 2a 2f 0d 0a 20 20 46 74 73 35 42 75 66  xt */..  Fts5Buf
2ece0 66 65 72 20 2a 70 4f 75 74 3b 20 20 20 20 20 20  fer *pOut;      
2ecf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2ed00 75 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0d 0a 7d  ut poslist */..}
2ed10 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20  ;..../*..** The 
2ed20 6e 65 61 72 2d 73 65 74 20 6f 62 6a 65 63 74 20  near-set object 
2ed30 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2ed40 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  rst argument con
2ed50 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 0d  tains more than.
2ed60 0a 2a 2a 20 6f 6e 65 20 70 68 72 61 73 65 2e 20  .** one phrase. 
2ed70 41 6c 6c 20 70 68 72 61 73 65 73 20 63 75 72 72  All phrases curr
2ed80 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 74  ently point to t
2ed90 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 54 68 65  he same row. The
2eda0 0d 0a 2a 2a 20 46 74 73 35 45 78 70 72 50 68 72  ..** Fts5ExprPhr
2edb0 61 73 65 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ase.poslist buff
2edc0 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
2edd0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
2ede0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a  his function..**
2edf0 20 74 65 73 74 73 20 69 66 20 74 68 65 20 63 75   tests if the cu
2ee00 72 72 65 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69  rrent row contai
2ee10 6e 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ns instances of 
2ee20 65 61 63 68 20 70 68 72 61 73 65 20 73 75 66 66  each phrase suff
2ee30 69 63 69 65 6e 74 6c 79 0d 0a 2a 2a 20 63 6c 6f  iciently..** clo
2ee40 73 65 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6d  se together to m
2ee50 65 65 74 20 74 68 65 20 4e 45 41 52 20 63 6f 6e  eet the NEAR con
2ee60 73 74 72 61 69 6e 74 2e 20 4e 6f 6e 2d 7a 65 72  straint. Non-zer
2ee70 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
2ee80 20 69 74 0d 0a 2a 2a 20 64 6f 65 73 2c 20 6f 72   it..** does, or
2ee90 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e   zero otherwise.
2eea0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 69 6e 2f 6f  ..**..** If in/o
2eeb0 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
2eec0 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 6f 74  Rc) is set to ot
2eed0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2eee0 4f 4b 20 77 68 65 6e 20 74 68 69 73 0d 0a 2a 2a  OK when this..**
2eef0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ef00 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2ef10 6f 70 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  op. Or, if an er
2ef20 72 6f 72 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ror (e.g. SQLITE
2ef30 5f 4e 4f 4d 45 4d 29 0d 0a 2a 2a 20 6f 63 63 75  _NOMEM)..** occu
2ef40 72 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  rs within this f
2ef50 75 6e 63 74 69 6f 6e 20 28 2a 70 52 63 29 20 69  unction (*pRc) i
2ef60 73 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67 6c  s set accordingl
2ef70 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
2ef80 6e 67 2e 0d 0a 2a 2a 20 54 68 65 20 72 65 74 75  ng...** The retu
2ef90 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64 65  rn value is unde
2efa0 66 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 68  fined in both th
2efb0 65 73 65 20 63 61 73 65 73 2e 0d 0a 2a 2a 20 0d  ese cases...** .
2efc0 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
2efd0 6f 63 63 75 72 73 20 61 6e 64 20 6e 6f 6e 2d 7a  occurs and non-z
2efe0 65 72 6f 20 28 61 20 6d 61 74 63 68 29 20 69 73  ero (a match) is
2eff0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 70   returned, the p
2f000 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0d 0a 2a 2a  osition-list..**
2f010 20 6f 66 20 65 61 63 68 20 70 68 72 61 73 65 20   of each phrase 
2f020 6f 62 6a 65 63 74 20 69 73 20 65 64 69 74 65 64  object is edited
2f030 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c 79   to contain only
2f040 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20 74   those entries t
2f050 68 61 74 0d 0a 2a 2a 20 6d 65 65 74 20 74 68 65  hat..** meet the
2f060 20 63 6f 6e 73 74 72 61 69 6e 74 20 62 65 66 6f   constraint befo
2f070 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a  re returning...*
2f080 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
2f090 73 35 45 78 70 72 4e 65 61 72 49 73 4d 61 74 63  s5ExprNearIsMatc
2f0a0 68 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  h(int *pRc, Fts5
2f0b0 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
2f0c0 61 72 29 7b 0d 0a 20 20 46 74 73 35 4e 65 61 72  ar){..  Fts5Near
2f0d0 54 72 69 6d 6d 65 72 20 61 53 74 61 74 69 63 5b  Trimmer aStatic[
2f0e0 34 5d 3b 0d 0a 20 20 46 74 73 35 4e 65 61 72 54  4];..  Fts5NearT
2f0f0 72 69 6d 6d 65 72 20 2a 61 20 3d 20 61 53 74 61  rimmer *a = aSta
2f100 74 69 63 3b 0d 0a 20 20 46 74 73 35 45 78 70 72  tic;..  Fts5Expr
2f110 50 68 72 61 73 65 20 2a 2a 61 70 50 68 72 61 73  Phrase **apPhras
2f120 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  e = pNear->apPhr
2f130 61 73 65 3b 0d 0a 0d 0a 20 20 69 6e 74 20 69 3b  ase;....  int i;
2f140 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  ..  int rc = *pR
2f150 63 3b 0d 0a 20 20 69 6e 74 20 62 4d 61 74 63 68  c;..  int bMatch
2f160 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70  ;....  assert( p
2f170 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20  Near->nPhrase>1 
2f180 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68  );....  /* If th
2f190 65 20 61 53 74 61 74 69 63 5b 5d 20 61 72 72 61  e aStatic[] arra
2f1a0 79 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65  y is not large e
2f1b0 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20  nough, allocate 
2f1c0 61 20 6c 61 72 67 65 20 61 72 72 61 79 0d 0a 20  a large array.. 
2f1d0 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65   ** using sqlite
2f1e0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73  3_malloc(). This
2f1f0 20 61 70 70 72 6f 61 63 68 20 63 6f 75 6c 64 20   approach could 
2f200 62 65 20 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e  be improved upon
2f210 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 4e 65 61  . */..  if( pNea
2f220 72 2d 3e 6e 50 68 72 61 73 65 3e 41 72 72 61 79  r->nPhrase>Array
2f230 53 69 7a 65 28 61 53 74 61 74 69 63 29 20 29 7b  Size(aStatic) ){
2f240 0d 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ..    int nByte 
2f250 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 4e 65 61  = sizeof(Fts5Nea
2f260 72 54 72 69 6d 6d 65 72 29 20 2a 20 70 4e 65 61  rTrimmer) * pNea
2f270 72 2d 3e 6e 50 68 72 61 73 65 3b 0d 0a 20 20 20  r->nPhrase;..   
2f280 20 61 20 3d 20 28 46 74 73 35 4e 65 61 72 54 72   a = (Fts5NearTr
2f290 69 6d 6d 65 72 2a 29 73 71 6c 69 74 65 33 46 74  immer*)sqlite3Ft
2f2a0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
2f2b0 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d 65 6c  , nByte);..  }el
2f2c0 73 65 7b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28  se{..    memset(
2f2d0 61 53 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65  aStatic, 0, size
2f2e0 6f 66 28 61 53 74 61 74 69 63 29 29 3b 0d 0a 20  of(aStatic));.. 
2f2f0 20 7d 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
2f300 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
2f310 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20 20 20 20  *pRc = rc;..    
2f320 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a  return 0;..  }..
2f330 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2f340 65 20 61 20 6c 6f 6f 6b 61 68 65 61 64 20 69 74  e a lookahead it
2f350 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
2f360 70 68 72 61 73 65 2e 20 41 66 74 65 72 20 70 61  phrase. After pa
2f370 73 73 69 6e 67 20 74 68 65 0d 0a 20 20 2a 2a 20  ssing the..  ** 
2f380 62 75 66 66 65 72 20 61 6e 64 20 62 75 66 66 65  buffer and buffe
2f390 72 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6c 6f  r size to the lo
2f3a0 6f 6b 61 73 69 64 65 2d 72 65 61 64 65 72 20 69  okaside-reader i
2f3b0 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c 20 7a 65  nit function, ze
2f3c0 72 6f 0d 0a 20 20 2a 2a 20 74 68 65 20 70 68 72  ro..  ** the phr
2f3d0 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75 66 66  ase poslist buff
2f3e0 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f 73 6c  er. The new posl
2f3f0 69 73 74 20 66 6f 72 20 74 68 65 20 70 68 72 61  ist for the phra
2f400 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a  se (containing..
2f410 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65 6e    ** the same en
2f420 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72 69  tries as the ori
2f430 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65 20  ginal with some 
2f440 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64 20  entries removed 
2f450 6f 6e 20 61 63 63 6f 75 6e 74 20 0d 0a 20 20 2a  on account ..  *
2f460 2a 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63 6f  * of the NEAR co
2f470 6e 73 74 72 61 69 6e 74 29 20 69 73 20 77 72 69  nstraint) is wri
2f480 74 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f 72  tten over the or
2f490 69 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20 69  iginal even as i
2f4a0 74 20 69 73 0d 0a 20 20 2a 2a 20 62 65 69 6e 67  t is..  ** being
2f4b0 20 72 65 61 64 2e 20 54 68 69 73 20 69 73 20 73   read. This is s
2f4c0 61 66 65 20 61 73 20 74 68 65 20 65 6e 74 72 69  afe as the entri
2f4d0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
2f4e0 6f 73 6c 69 73 74 20 61 72 65 20 61 0d 0a 20 20  oslist are a..  
2f4f0 2a 2a 20 73 75 62 73 65 74 20 6f 66 20 74 68 65  ** subset of the
2f500 20 6f 6c 64 2c 20 73 6f 20 69 74 20 69 73 20 6e   old, so it is n
2f510 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2f520 64 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 72  data yet to be r
2f530 65 61 64 20 74 6f 0d 0a 20 20 2a 2a 20 62 65 20  ead to..  ** be 
2f540 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
2f550 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
2f560 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
2f570 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 42 75  ++){..    Fts5Bu
2f580 66 66 65 72 20 2a 70 50 6f 73 6c 69 73 74 20 3d  ffer *pPoslist =
2f590 20 26 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e 70   &apPhrase[i]->p
2f5a0 6f 73 6c 69 73 74 3b 0d 0a 20 20 20 20 66 74 73  oslist;..    fts
2f5b0 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
2f5c0 49 6e 69 74 28 70 50 6f 73 6c 69 73 74 2d 3e 70  Init(pPoslist->p
2f5d0 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 6e 2c 20 26  , pPoslist->n, &
2f5e0 61 5b 69 5d 2e 72 65 61 64 65 72 29 3b 0d 0a 20  a[i].reader);.. 
2f5f0 20 20 20 70 50 6f 73 6c 69 73 74 2d 3e 6e 20 3d     pPoslist->n =
2f600 20 30 3b 0d 0a 20 20 20 20 61 5b 69 5d 2e 70 4f   0;..    a[i].pO
2f610 75 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0d 0a  ut = pPoslist;..
2f620 20 20 7d 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20    }....  while( 
2f630 31 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 41  1 ){..    int iA
2f640 64 76 3b 0d 0a 20 20 20 20 69 36 34 20 69 4d 69  dv;..    i64 iMi
2f650 6e 3b 0d 0a 20 20 20 20 69 36 34 20 69 4d 61 78  n;..    i64 iMax
2f660 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 69 73  ;....    /* This
2f670 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20   block advances 
2f680 74 68 65 20 70 68 72 61 73 65 20 69 74 65 72 61  the phrase itera
2f690 74 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79 20  tors until they 
2f6a0 70 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20 6f  point to a set o
2f6b0 66 0d 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65  f..    ** entrie
2f6c0 73 20 74 68 61 74 20 74 6f 67 65 74 68 65 72 20  s that together 
2f6d0 63 6f 6d 70 72 69 73 65 20 61 20 6d 61 74 63 68  comprise a match
2f6e0 2e 20 20 2a 2f 0d 0a 20 20 20 20 69 4d 61 78 20  .  */..    iMax 
2f6f0 3d 20 61 5b 30 5d 2e 72 65 61 64 65 72 2e 69 50  = a[0].reader.iP
2f700 6f 73 3b 0d 0a 20 20 20 20 64 6f 20 7b 0d 0a 20  os;..    do {.. 
2f710 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b       bMatch = 1;
2f720 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
2f730 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
2f740 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  e; i++){..      
2f750 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52    Fts5LookaheadR
2f760 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26 61  eader *pPos = &a
2f770 5b 69 5d 2e 72 65 61 64 65 72 3b 0d 0a 20 20 20  [i].reader;..   
2f780 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 4d 61 78       iMin = iMax
2f790 20 2d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   - pNear->apPhra
2f7a0 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d 20 2d 20 70  se[i]->nTerm - p
2f7b0 4e 65 61 72 2d 3e 6e 4e 65 61 72 3b 0d 0a 20 20  Near->nNear;..  
2f7c0 20 20 20 20 20 20 69 66 28 20 70 50 6f 73 2d 3e        if( pPos->
2f7d0 69 50 6f 73 3c 69 4d 69 6e 20 7c 7c 20 70 50 6f  iPos<iMin || pPo
2f7e0 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 7b 0d  s->iPos>iMax ){.
2f7f0 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
2f800 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  h = 0;..        
2f810 20 20 77 68 69 6c 65 28 20 70 50 6f 73 2d 3e 69    while( pPos->i
2f820 50 6f 73 3c 69 4d 69 6e 20 29 7b 0d 0a 20 20 20  Pos<iMin ){..   
2f830 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
2f840 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
2f850 4e 65 78 74 28 70 50 6f 73 29 20 29 20 67 6f 74  Next(pPos) ) got
2f860 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a  o ismatch_out;..
2f870 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2f880 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73 2d         if( pPos-
2f890 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20 69 4d 61  >iPos>iMax ) iMa
2f8a0 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 3b 0d  x = pPos->iPos;.
2f8b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2f8c0 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28    }..    }while(
2f8d0 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d   bMatch==0 );...
2f8e0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
2f8f0 6e 74 72 79 20 74 6f 20 65 61 63 68 20 6f 75 74  ntry to each out
2f900 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  put position lis
2f910 74 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 69 3d  t */..    for(i=
2f920 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  0; i<pNear->nPhr
2f930 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  ase; i++){..    
2f940 20 20 69 36 34 20 69 50 6f 73 20 3d 20 61 5b 69    i64 iPos = a[i
2f950 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73 3b 0d 0a  ].reader.iPos;..
2f960 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
2f970 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
2f980 20 3d 20 26 61 5b 69 5d 2e 77 72 69 74 65 72 3b   = &a[i].writer;
2f990 0d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  ..      if( a[i]
2f9a0 2e 70 4f 75 74 2d 3e 6e 3d 3d 30 20 7c 7c 20 69  .pOut->n==0 || i
2f9b0 50 6f 73 21 3d 70 57 72 69 74 65 72 2d 3e 69 50  Pos!=pWriter->iP
2f9c0 72 65 76 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  rev ){..        
2f9d0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
2f9e0 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 61  stWriterAppend(a
2f9f0 5b 69 5d 2e 70 4f 75 74 2c 20 70 57 72 69 74 65  [i].pOut, pWrite
2fa00 72 2c 20 69 50 6f 73 29 3b 0d 0a 20 20 20 20 20  r, iPos);..     
2fa10 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
2fa20 20 69 41 64 76 20 3d 20 30 3b 0d 0a 20 20 20 20   iAdv = 0;..    
2fa30 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e 72 65 61 64  iMin = a[0].read
2fa40 65 72 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0d 0a  er.iLookahead;..
2fa50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fa60 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
2fa70 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  ++){..      if( 
2fa80 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f 6f  a[i].reader.iLoo
2fa90 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20 29 7b  kahead < iMin ){
2faa0 0d 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d  ..        iMin =
2fab0 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
2fac0 6f 6b 61 68 65 61 64 3b 0d 0a 20 20 20 20 20 20  okahead;..      
2fad0 20 20 69 41 64 76 20 3d 20 69 3b 0d 0a 20 20 20    iAdv = i;..   
2fae0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20     }..    }..   
2faf0 20 69 66 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65   if( fts5Lookahe
2fb00 61 64 52 65 61 64 65 72 4e 65 78 74 28 26 61 5b  adReaderNext(&a[
2fb10 69 41 64 76 5d 2e 72 65 61 64 65 72 29 20 29 20  iAdv].reader) ) 
2fb20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
2fb30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 73 6d 61  ;..  }....  isma
2fb40 74 63 68 5f 6f 75 74 3a 20 7b 0d 0a 20 20 20 20  tch_out: {..    
2fb50 69 6e 74 20 62 52 65 74 20 3d 20 61 5b 30 5d 2e  int bRet = a[0].
2fb60 70 4f 75 74 2d 3e 6e 3e 30 3b 0d 0a 20 20 20 20  pOut->n>0;..    
2fb70 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20 20 20 20  *pRc = rc;..    
2fb80 69 66 28 20 61 21 3d 61 53 74 61 74 69 63 20 29  if( a!=aStatic )
2fb90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
2fba0 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 62 52  ;..    return bR
2fbb0 65 74 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f  et;..  }..}..../
2fbc0 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  *..** Advance it
2fbd0 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e 74  erator pIter unt
2fbe0 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
2fbf0 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f  a value equal to
2fc00 20 6f 72 20 6c 61 73 74 65 72 0d 0a 2a 2a 20 74   or laster..** t
2fc10 68 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20  han the initial 
2fc20 76 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73 74  value of *piLast
2fc30 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
2fc40 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
2fc50 6e 74 73 0d 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  nts..** to a val
2fc60 75 65 20 6c 61 73 74 65 72 20 74 68 61 6e 20 2a  ue laster than *
2fc70 70 69 4c 61 73 74 2c 20 75 70 64 61 74 65 20 2a  piLast, update *
2fc80 70 69 4c 61 73 74 20 74 6f 20 74 68 65 20 6e 65  piLast to the ne
2fc90 77 20 6c 61 73 74 65 73 74 20 76 61 6c 75 65 2e  w lastest value.
2fca0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20  ..**..** If the 
2fcb0 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
2fcc0 20 45 4f 46 2c 20 73 65 74 20 2a 70 62 45 6f 66   EOF, set *pbEof
2fcd0 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72 65 20   to true before 
2fce0 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 0d 0a 2a  returning. If..*
2fcf0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
2fd00 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61  s, set *pRc to a
2fd10 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  n error code. If
2fd20 20 65 69 74 68 65 72 20 2a 70 62 45 6f 66 20 6f   either *pbEof o
2fd30 72 20 2a 70 52 63 0d 0a 2a 2a 20 61 72 65 20 73  r *pRc..** are s
2fd40 65 74 2c 20 72 65 74 75 72 6e 20 61 20 6e 6f 6e  et, return a non
2fd50 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 20 4f 74 68  -zero value. Oth
2fd60 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a  erwise, return z
2fd70 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ero...*/..static
2fd80 20 69 6e 74 20 66 74 73 35 45 78 70 72 41 64 76   int fts5ExprAdv
2fd90 61 6e 63 65 74 6f 28 0d 0a 20 20 46 74 73 35 49  anceto(..  Fts5I
2fda0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
2fdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2fdc0 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
2fdd0 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 44 65 73  e */..  int bDes
2fde0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2fdf0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fe00 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 22  if iterator is "
2fe10 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0d 0a  rowid DESC" */..
2fe20 20 20 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20    i64 *piLast,  
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe40 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73    /* IN/OUT: Las
2fe50 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20  test rowid seen 
2fe60 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20 69 6e 74  so far */..  int
2fe70 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe90 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
2fea0 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 45 6f 66  */..  int *pbEof
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fec0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2fed0 74 20 74 6f 20 74 72 75 65 20 69 66 20 45 4f 46  t to true if EOF
2fee0 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 36 34 20 69   */..){..  i64 i
2fef0 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b 0d  Last = *piLast;.
2ff00 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0d 0a  .  i64 iRowid;..
2ff10 0d 0a 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74  ..  iRowid = pIt
2ff20 65 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 69  er->iRowid;..  i
2ff30 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20  f( (bDesc==0 && 
2ff40 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c  iLast>iRowid) ||
2ff50 20 28 62 44 65 73 63 20 26 26 20 69 4c 61 73 74   (bDesc && iLast
2ff60 3c 69 52 6f 77 69 64 29 20 29 7b 0d 0a 20 20 20  <iRowid) ){..   
2ff70 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2ff80 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
2ff90 6d 28 70 49 74 65 72 2c 20 69 4c 61 73 74 29 3b  m(pIter, iLast);
2ffa0 0d 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ..    if( rc || 
2ffb0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
2ffc0 6f 66 28 70 49 74 65 72 29 20 29 7b 0d 0a 20 20  of(pIter) ){..  
2ffd0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a      *pRc = rc;..
2ffe0 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 31        *pbEof = 1
2fff0 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
30000 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  1;..    }..    i
30010 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69  Rowid = pIter->i
30020 52 6f 77 69 64 3b 0d 0a 20 20 20 20 61 73 73 65  Rowid;..    asse
30030 72 74 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26  rt( (bDesc==0 &&
30040 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 29 20   iRowid>=iLast) 
30050 7c 7c 20 28 62 44 65 73 63 3d 3d 31 20 26 26 20  || (bDesc==1 && 
30060 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 29 20 29  iRowid<=iLast) )
30070 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 69 4c 61 73  ;..  }..  *piLas
30080 74 20 3d 20 69 52 6f 77 69 64 3b 0d 0a 0d 0a 20  t = iRowid;.... 
30090 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d   return 0;..}...
300a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
300b0 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e  ExprSynonymAdvan
300c0 63 65 74 6f 28 0d 0a 20 20 46 74 73 35 45 78 70  ceto(..  Fts5Exp
300d0 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  rTerm *pTerm,   
300e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
300f0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   iterator to adv
30100 61 6e 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62  ance */..  int b
30110 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
30120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30130 75 65 20 69 66 20 69 74 65 72 61 74 6f 72 20 69  ue if iterator i
30140 73 20 22 72 6f 77 69 64 20 44 45 53 43 22 20 2a  s "rowid DESC" *
30150 2f 0d 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74  /..  i64 *piLast
30160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30170 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
30180 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65  Lastest rowid se
30190 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20  en so far */..  
301a0 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
301b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301c0 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  /* OUT: Error co
301d0 64 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74  de */..){..  int
301e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
301f0 0d 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ..  i64 iLast = 
30200 2a 70 69 4c 61 73 74 3b 0d 0a 20 20 46 74 73 35  *piLast;..  Fts5
30210 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 20 20  ExprTerm *p;..  
30220 69 6e 74 20 62 45 6f 66 20 3d 20 30 3b 0d 0a 0d  int bEof = 0;...
30230 0a 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20  .  for(p=pTerm; 
30240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30250 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
30260 6d 29 7b 0d 0a 20 20 20 20 69 66 28 20 73 71 6c  m){..    if( sql
30270 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
30280 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29 7b 0d  p->pIter)==0 ){.
30290 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
302a0 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69 52  d = p->pIter->iR
302b0 6f 77 69 64 3b 0d 0a 20 20 20 20 20 20 69 66 28  owid;..      if(
302c0 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c   (bDesc==0 && iL
302d0 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28  ast>iRowid) || (
302e0 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69  bDesc && iLast<i
302f0 52 6f 77 69 64 29 20 29 7b 0d 0a 20 20 20 20 20  Rowid) ){..     
30300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
30310 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
30320 70 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74 29  p->pIter, iLast)
30330 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
30340 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20  }..  }....  if( 
30350 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30360 0d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ..    *pRc = rc;
30370 0d 0a 20 20 20 20 62 45 6f 66 20 3d 20 31 3b 0d  ..    bEof = 1;.
30380 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a  .  }else{..    *
30390 70 69 4c 61 73 74 20 3d 20 66 74 73 35 45 78 70  piLast = fts5Exp
303a0 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54  rSynonymRowid(pT
303b0 65 72 6d 2c 20 62 44 65 73 63 2c 20 26 62 45 6f  erm, bDesc, &bEo
303c0 66 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  f);..  }..  retu
303d0 72 6e 20 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 0d  rn bEof;..}.....
303e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
303f0 45 78 70 72 4e 65 61 72 54 65 73 74 28 0d 0a 20  ExprNearTest(.. 
30400 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20 20 46 74   int *pRc,..  Ft
30410 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
30420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30430 20 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   Expression that
30440 20 70 4e 65 61 72 20 69 73 20 61 20 70 61 72 74   pNear is a part
30450 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78   of */..  Fts5Ex
30460 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20  prNode *pNode   
30470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30480 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28 46 54   "NEAR" node (FT
30490 53 35 5f 53 54 52 49 4e 47 29 20 2a 2f 0d 0a 29  S5_STRING) */..)
304a0 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  {..  Fts5ExprNea
304b0 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e  rset *pNear = pN
304c0 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d 0a 20 20 69  ode->pNear;..  i
304d0 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0d 0a 0d  nt rc = *pRc;...
304e0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 43  .  if( pExpr->pC
304f0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
30500 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
30510 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70   ){..    Fts5Exp
30520 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0d 0a 20  rTerm *pTerm;.. 
30530 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
30540 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
30550 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 3b  ar->apPhrase[0];
30560 0d 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70  ..    pPhrase->p
30570 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0d 0a 20  oslist.n = 0;.. 
30580 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 26 70 50     for(pTerm=&pP
30590 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 3b  hrase->aTerm[0];
305a0 20 70 54 65 72 6d 3b 20 70 54 65 72 6d 3d 70 54   pTerm; pTerm=pT
305b0 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d  erm->pSynonym){.
305c0 0a 20 20 20 20 20 20 46 74 73 35 49 6e 64 65 78  .      Fts5Index
305d0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70 54  Iter *pIter = pT
305e0 65 72 6d 2d 3e 70 49 74 65 72 3b 0d 0a 20 20 20  erm->pIter;..   
305f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
30600 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29  s5IterEof(pIter)
30610 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
30620 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  if( pIter->iRowi
30630 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  d==pNode->iRowid
30640 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61 74 61   && pIter->nData
30650 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  >0 ){..         
30660 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73   pPhrase->poslis
30670 74 2e 6e 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  t.n = 1;..      
30680 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
30690 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
306a0 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
306b0 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20  .n;..  }else{.. 
306c0 20 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 20     int i;....   
306d0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 65   /* Check that e
306e0 61 63 68 20 70 68 72 61 73 65 20 69 6e 20 74 68  ach phrase in th
306f0 65 20 6e 65 61 72 73 65 74 20 6d 61 74 63 68 65  e nearset matche
30700 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
30710 77 2e 0d 0a 20 20 20 20 2a 2a 20 50 6f 70 75 6c  w...    ** Popul
30720 61 74 65 20 74 68 65 20 70 50 68 72 61 73 65 2d  ate the pPhrase-
30730 3e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 73  >poslist buffers
30740 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
30750 65 2e 20 49 66 20 61 6e 79 0d 0a 20 20 20 20 2a  e. If any..    *
30760 2a 20 70 68 72 61 73 65 20 69 73 20 6e 6f 74 20  * phrase is not 
30770 61 20 6d 61 74 63 68 2c 20 62 72 65 61 6b 20 6f  a match, break o
30780 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65  ut of the loop e
30790 61 72 6c 79 2e 20 20 2a 2f 0d 0a 20 20 20 20 66  arly.  */..    f
307a0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
307b0 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4e 65 61 72  TE_OK && i<pNear
307c0 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
307d0 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  ..      Fts5Expr
307e0 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
307f0 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  = pNear->apPhras
30800 65 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 69 66 28  e[i];..      if(
30810 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e   pPhrase->nTerm>
30820 31 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 61 54  1 || pPhrase->aT
30830 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20  erm[0].pSynonym 
30840 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 61  ..       || pNea
30850 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c 20 70 50  r->pColset || pP
30860 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e  hrase->aTerm[0].
30870 62 46 69 72 73 74 0d 0a 20 20 20 20 20 20 29 7b  bFirst..      ){
30880 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d  ..        int bM
30890 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20  atch = 0;..     
308a0 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
308b0 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e  PhraseIsMatch(pN
308c0 6f 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62  ode, pPhrase, &b
308d0 4d 61 74 63 68 29 3b 0d 0a 20 20 20 20 20 20 20  Match);..       
308e0 20 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29   if( bMatch==0 )
308f0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d   break;..      }
30900 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 46  else{..        F
30910 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
30920 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61  ter = pPhrase->a
30930 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d 0a  Term[0].pIter;..
30940 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
30950 65 72 53 65 74 28 26 72 63 2c 20 26 70 50 68 72  erSet(&rc, &pPhr
30960 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 70 49  ase->poslist, pI
30970 74 65 72 2d 3e 6e 44 61 74 61 2c 20 70 49 74 65  ter->nData, pIte
30980 72 2d 3e 70 44 61 74 61 29 3b 0d 0a 20 20 20 20  r->pData);..    
30990 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
309a0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20 20    *pRc = rc;..  
309b0 20 20 69 66 28 20 69 3d 3d 70 4e 65 61 72 2d 3e    if( i==pNear->
309c0 6e 50 68 72 61 73 65 20 26 26 20 28 69 3d 3d 31  nPhrase && (i==1
309d0 20 7c 7c 20 66 74 73 35 45 78 70 72 4e 65 61 72   || fts5ExprNear
309e0 49 73 4d 61 74 63 68 28 70 52 63 2c 20 70 4e 65  IsMatch(pRc, pNe
309f0 61 72 29 29 20 29 7b 0d 0a 20 20 20 20 20 20 72  ar)) ){..      r
30a00 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d  eturn 1;..    }.
30a10 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a  .    return 0;..
30a20 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a    }..}....../*..
30a30 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c  ** Initialize al
30a40 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73  l term iterators
30a50 20 69 6e 20 74 68 65 20 70 4e 65 61 72 20 6f 62   in the pNear ob
30a60 6a 65 63 74 2e 20 49 66 20 61 6e 79 20 74 65 72  ject. If any ter
30a70 6d 20 69 73 20 66 6f 75 6e 64 0d 0a 2a 2a 20 74  m is found..** t
30a80 6f 20 6d 61 74 63 68 20 6e 6f 20 64 6f 63 75 6d  o match no docum
30a90 65 6e 74 73 20 61 74 20 61 6c 6c 2c 20 72 65 74  ents at all, ret
30aa0 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  urn immediately 
30ab0 77 69 74 68 6f 75 74 20 69 6e 69 74 69 61 6c 69  without initiali
30ac0 7a 69 6e 67 20 61 6e 79 0d 0a 2a 2a 20 66 75 72  zing any..** fur
30ad0 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0d  ther iterators..
30ae0 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 65 72  .**..** If an er
30af0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
30b00 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
30b10 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
30b20 73 65 2c 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 53  se, return..** S
30b30 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 69 73 20  QLITE_OK. It is 
30b40 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
30b50 6e 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 20  n error if some 
30b60 74 65 72 6d 20 6d 61 74 63 68 65 73 20 7a 65 72  term matches zer
30b70 6f 0d 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 73 2e  o..** documents.
30b80 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
30b90 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e 69   fts5ExprNearIni
30ba0 74 41 6c 6c 28 0d 0a 20 20 46 74 73 35 45 78 70  tAll(..  Fts5Exp
30bb0 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 46 74 73  r *pExpr,..  Fts
30bc0 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
30bd0 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70 72  ..){..  Fts5Expr
30be0 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d  Nearset *pNear =
30bf0 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d 0a   pNode->pNear;..
30c00 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 61 73    int i;....  as
30c10 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e 6f  sert( pNode->bNo
30c20 6d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 20 20 66  match==0 );..  f
30c30 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d  or(i=0; i<pNear-
30c40 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d  >nPhrase; i++){.
30c50 0a 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72  .    Fts5ExprPhr
30c60 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
30c70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
30c80 5d 3b 0d 0a 20 20 20 20 69 66 28 20 70 50 68 72  ];..    if( pPhr
30c90 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b  ase->nTerm==0 ){
30ca0 0d 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62  ..      pNode->b
30cb0 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  Eof = 1;..      
30cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30cd0 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
30ce0 20 20 20 20 20 69 6e 74 20 6a 3b 0d 0a 20 20 20       int j;..   
30cf0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
30d00 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  hrase->nTerm; j+
30d10 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74 73  +){..        Fts
30d20 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
30d30 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65   = &pPhrase->aTe
30d40 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20 20 20 20 20  rm[j];..        
30d50 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b  Fts5ExprTerm *p;
30d60 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 48  ..        int bH
30d70 69 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20  it = 0;....     
30d80 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20     for(p=pTerm; 
30d90 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d  p; p=p->pSynonym
30da0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ){..          in
30db0 74 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 20  t rc;..         
30dc0 20 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29 7b   if( p->pIter ){
30dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
30de0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
30df0 73 65 28 70 2d 3e 70 49 74 65 72 29 3b 0d 0a 20  se(p->pIter);.. 
30e00 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49             p->pI
30e10 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  ter = 0;..      
30e20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
30e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
30e40 35 49 6e 64 65 78 51 75 65 72 79 28 0d 0a 20 20  5IndexQuery(..  
30e50 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
30e60 72 2d 3e 70 49 6e 64 65 78 2c 20 70 2d 3e 7a 54  r->pIndex, p->zT
30e70 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
30e80 28 70 2d 3e 7a 54 65 72 6d 29 2c 0d 0a 20 20 20  (p->zTerm),..   
30e90 20 20 20 20 20 20 20 20 20 20 20 28 70 54 65 72             (pTer
30ea0 6d 2d 3e 62 50 72 65 66 69 78 20 3f 20 46 54 53  m->bPrefix ? FTS
30eb0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
30ec0 46 49 58 20 3a 20 30 29 20 7c 0d 0a 20 20 20 20  FIX : 0) |..    
30ed0 20 20 20 20 20 20 20 20 20 20 28 70 45 78 70 72            (pExpr
30ee0 2d 3e 62 44 65 73 63 20 3f 20 46 54 53 35 49 4e  ->bDesc ? FTS5IN
30ef0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 3a  DEX_QUERY_DESC :
30f00 20 30 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20   0),..          
30f10 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73      pNear->pCols
30f20 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  et,..           
30f30 20 20 20 26 70 2d 3e 70 49 74 65 72 0d 0a 20 20     &p->pIter..  
30f40 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20          );..    
30f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
30f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3d 3d 28  c==SQLITE_OK)==(
30f70 70 2d 3e 70 49 74 65 72 21 3d 30 29 20 29 3b 0d  p->pIter!=0) );.
30f80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
30fa0 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20  eturn rc;..     
30fb0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
30fc0 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
30fd0 2d 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20 20 20  ->pIter) ){..   
30fe0 20 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20           bHit = 
30ff0 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  1;..          }.
31000 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
31010 20 20 20 20 20 20 69 66 28 20 62 48 69 74 3d 3d        if( bHit==
31020 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  0 ){..          
31030 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
31040 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
31050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20  rn SQLITE_OK;.. 
31060 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
31070 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
31080 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
31090 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51   0;..  return SQ
310a0 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f  LITE_OK;..}..../
310b0 2a 0d 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  *..** If pExpr i
310c0 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74 6f  s an ASC iterato
310d0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
310e0 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65   returns a value
310f0 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 73 61   with the..** sa
31100 6d 65 20 73 69 67 6e 20 61 73 3a 0d 0a 2a 2a 0d  me sign as:..**.
31110 0a 2a 2a 20 20 20 28 69 4c 68 73 20 2d 20 69 52  .**   (iLhs - iR
31120 68 73 29 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65  hs)..**..** Othe
31130 72 77 69 73 65 2c 20 69 66 20 74 68 69 73 20 69  rwise, if this i
31140 73 20 61 20 44 45 53 43 20 69 74 65 72 61 74 6f  s a DESC iterato
31150 72 2c 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  r, the opposite 
31160 69 73 20 72 65 74 75 72 6e 65 64 3a 0d 0a 2a 2a  is returned:..**
31170 0d 0a 2a 2a 20 20 20 28 69 52 68 73 20 2d 20 69  ..**   (iRhs - i
31180 4c 68 73 29 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  Lhs)..*/..static
31190 20 69 6e 74 20 66 74 73 35 52 6f 77 69 64 43 6d   int fts5RowidCm
311a0 70 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  p(..  Fts5Expr *
311b0 70 45 78 70 72 2c 0d 0a 20 20 69 36 34 20 69 4c  pExpr,..  i64 iL
311c0 68 73 2c 0d 0a 20 20 69 36 34 20 69 52 68 73 0d  hs,..  i64 iRhs.
311d0 0a 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70  .){..  assert( p
311e0 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 7c  Expr->bDesc==0 |
311f0 7c 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d  | pExpr->bDesc==
31200 31 20 29 3b 0d 0a 20 20 69 66 28 20 70 45 78 70  1 );..  if( pExp
31210 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b 0d 0a  r->bDesc==0 ){..
31220 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52 68      if( iLhs<iRh
31230 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a  s ) return -1;..
31240 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68 73      return (iLhs
31250 20 3e 20 69 52 68 73 29 3b 0d 0a 20 20 7d 65 6c   > iRhs);..  }el
31260 73 65 7b 0d 0a 20 20 20 20 69 66 28 20 69 4c 68  se{..    if( iLh
31270 73 3e 69 52 68 73 20 29 20 72 65 74 75 72 6e 20  s>iRhs ) return 
31280 2d 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  -1;..    return 
31290 28 69 4c 68 73 20 3c 20 69 52 68 73 29 3b 0d 0a  (iLhs < iRhs);..
312a0 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63    }..}....static
312b0 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 53 65   void fts5ExprSe
312c0 74 45 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64  tEof(Fts5ExprNod
312d0 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a 20 20 69 6e  e *pNode){..  in
312e0 74 20 69 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62  t i;..  pNode->b
312f0 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 70 4e 6f 64  Eof = 1;..  pNod
31300 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b  e->bNomatch = 0;
31310 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
31320 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
31330 2b 29 7b 0d 0a 20 20 20 20 66 74 73 35 45 78 70  +){..    fts5Exp
31340 72 53 65 74 45 6f 66 28 70 4e 6f 64 65 2d 3e 61  rSetEof(pNode->a
31350 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20 7d  pChild[i]);..  }
31360 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f  ..}....static vo
31370 69 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a  id fts5ExprNodeZ
31380 65 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35 45  eroPoslist(Fts5E
31390 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b  xprNode *pNode){
313a0 0d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65  ..  if( pNode->e
313b0 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e  Type==FTS5_STRIN
313c0 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70  G || pNode->eTyp
313d0 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0d  e==FTS5_TERM ){.
313e0 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 65 61  .    Fts5ExprNea
313f0 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e  rset *pNear = pN
31400 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d 0a 20 20 20  ode->pNear;..   
31410 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72   int i;..    for
31420 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
31430 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20  Phrase; i++){.. 
31440 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
31450 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
31460 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
31470 5d 3b 0d 0a 20 20 20 20 20 20 70 50 68 72 61 73  ];..      pPhras
31480 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30  e->poslist.n = 0
31490 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73  ;..    }..  }els
314a0 65 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a  e{..    int i;..
314b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
314c0 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
314d0 2b 29 7b 0d 0a 20 20 20 20 20 20 66 74 73 35 45  +){..      fts5E
314e0 78 70 72 4e 6f 64 65 5a 65 72 6f 50 6f 73 6c 69  xprNodeZeroPosli
314f0 73 74 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  st(pNode->apChil
31500 64 5b 69 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20  d[i]);..    }.. 
31510 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d   }..}......../*.
31520 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
31530 76 61 6c 75 65 73 20 63 75 72 72 65 6e 74 6c 79  values currently
31540 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
31550 65 20 74 77 6f 20 6e 6f 64 65 73 20 61 73 20 66  e two nodes as f
31560 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  ollows:..**..** 
31570 20 20 20 72 65 73 20 3d 20 28 2a 70 31 29 20 2d     res = (*p1) -
31580 20 28 2a 70 32 29 0d 0a 2a 2a 0d 0a 2a 2a 20 4e   (*p2)..**..** N
31590 6f 64 65 73 20 74 68 61 74 20 70 6f 69 6e 74 20  odes that point 
315a0 74 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 63  to values that c
315b0 6f 6d 65 20 6c 61 74 65 72 20 69 6e 20 74 68 65  ome later in the
315c0 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72   iteration order
315d0 20 61 72 65 0d 0a 2a 2a 20 63 6f 6e 73 69 64 65   are..** conside
315e0 72 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72  red to be larger
315f0 2e 20 4e 6f 64 65 73 20 61 74 20 45 4f 46 20 61  . Nodes at EOF a
31600 72 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6f  re the largest o
31610 66 20 61 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54  f all...**..** T
31620 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69  his means that i
31630 66 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  f the iteration 
31640 6f 72 64 65 72 20 69 73 20 41 53 43 2c 20 74 68  order is ASC, th
31650 65 6e 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c  en numerically l
31660 61 72 67 65 72 0d 0a 2a 2a 20 72 6f 77 69 64 73  arger..** rowids
31670 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
31680 6c 61 72 67 65 72 2e 20 4f 72 20 69 66 20 69 74  larger. Or if it
31690 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
316a0 44 45 53 43 2c 20 6e 75 6d 65 72 69 63 61 6c 6c  DESC, numericall
316b0 79 0d 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 72 6f  y..** smaller ro
316c0 77 69 64 73 20 61 72 65 20 6c 61 72 67 65 72 2e  wids are larger.
316d0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
316e0 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65   fts5NodeCompare
316f0 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  (..  Fts5Expr *p
31700 45 78 70 72 2c 0d 0a 20 20 46 74 73 35 45 78 70  Expr,..  Fts5Exp
31710 72 4e 6f 64 65 20 2a 70 31 2c 20 0d 0a 20 20 46  rNode *p1, ..  F
31720 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 0d  ts5ExprNode *p2.
31730 0a 29 7b 0d 0a 20 20 69 66 28 20 70 32 2d 3e 62  .){..  if( p2->b
31740 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  Eof ) return -1;
31750 0d 0a 20 20 69 66 28 20 70 31 2d 3e 62 45 6f 66  ..  if( p1->bEof
31760 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0d 0a 20   ) return +1;.. 
31770 20 72 65 74 75 72 6e 20 66 74 73 35 52 6f 77 69   return fts5Rowi
31780 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31 2d 3e  dCmp(pExpr, p1->
31790 69 52 6f 77 69 64 2c 20 70 32 2d 3e 69 52 6f 77  iRowid, p2->iRow
317a0 69 64 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  id);..}..../*..*
317b0 2a 20 41 6c 6c 20 69 6e 64 69 76 69 64 75 61 6c  * All individual
317c0 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20   term iterators 
317d0 69 6e 20 70 4e 65 61 72 20 61 72 65 20 67 75 61  in pNear are gua
317e0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 76 61  ranteed to be va
317f0 6c 69 64 20 77 68 65 6e 0d 0a 2a 2a 20 74 68 69  lid when..** thi
31800 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31810 6c 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  lled. This funct
31820 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 6c  ion checks if al
31830 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73  l term iterators
31840 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  ..** point to th
31850 65 20 73 61 6d 65 20 72 6f 77 69 64 2c 20 61 6e  e same rowid, an
31860 64 20 69 66 20 6e 6f 74 2c 20 61 64 76 61 6e 63  d if not, advanc
31870 65 73 20 74 68 65 6d 20 75 6e 74 69 6c 20 74 68  es them until th
31880 65 79 20 64 6f 2e 0d 0a 2a 2a 20 49 66 20 61 6e  ey do...** If an
31890 20 45 4f 46 20 69 73 20 72 65 61 63 68 65 64 20   EOF is reached 
318a0 62 65 66 6f 72 65 20 74 68 69 73 20 68 61 70 70  before this happ
318b0 65 6e 73 2c 20 2a 70 62 45 6f 66 20 69 73 20 73  ens, *pbEof is s
318c0 65 74 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72  et to true befor
318d0 65 0d 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  e..** returning.
318e0 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f  ..**..** SQLITE_
318f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
31900 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31910 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
31920 65 72 72 6f 72 20 63 6f 64 65 20 0d 0a 2a 2a 20  error code ..** 
31930 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73  otherwise. It is
31940 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
31950 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
31960 20 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65 61   an iterator rea
31970 63 68 65 73 0d 0a 2a 2a 20 45 4f 46 2e 0d 0a 2a  ches..** EOF...*
31980 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
31990 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53  s5ExprNodeTest_S
319a0 54 52 49 4e 47 28 0d 0a 20 20 46 74 73 35 45 78  TRING(..  Fts5Ex
319b0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
319c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
319d0 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20  ression pPhrase 
319e0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20  belongs to */.. 
319f0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
31a00 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  Node..){..  Fts5
31a10 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
31a20 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ar = pNode->pNea
31a30 72 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68  r;..  Fts5ExprPh
31a40 72 61 73 65 20 2a 70 4c 65 66 74 20 3d 20 70 4e  rase *pLeft = pN
31a50 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
31a60 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ;..  int rc = SQ
31a70 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 36 34 20  LITE_OK;..  i64 
31a80 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  iLast;          
31a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
31aa0 61 73 74 65 73 74 20 72 6f 77 69 64 20 61 6e 79  astest rowid any
31ab0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
31ac0 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 2c   to */..  int i,
31ad0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
31ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72            /* Phr
31af0 61 73 65 20 61 6e 64 20 74 6f 6b 65 6e 20 69 6e  ase and token in
31b00 64 65 78 2c 20 72 65 73 70 65 63 74 69 76 65 6c  dex, respectivel
31b10 79 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 4d 61 74  y */..  int bMat
31b20 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
31b30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31b40 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  if all terms are
31b50 20 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f 77   at the same row
31b60 69 64 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 69  id */..  const i
31b70 6e 74 20 62 44 65 73 63 20 3d 20 70 45 78 70 72  nt bDesc = pExpr
31b80 2d 3e 62 44 65 73 63 3b 0d 0a 0d 0a 20 20 2f 2a  ->bDesc;....  /*
31b90 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
31ba0 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f 74   node should not
31bb0 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a 2f   be FTS5_TERM */
31bc0 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61  ..  assert( pNea
31bd0 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0d 0a 20  r->nPhrase>1 .. 
31be0 20 20 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e        || pNear->
31bf0 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65  apPhrase[0]->nTe
31c00 72 6d 3e 31 20 0d 0a 20 20 20 20 20 20 20 7c 7c  rm>1 ..       ||
31c10 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65   pNear->apPhrase
31c20 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53  [0]->aTerm[0].pS
31c30 79 6e 6f 6e 79 6d 0d 0a 20 20 20 20 20 20 20 7c  ynonym..       |
31c40 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  | pNear->apPhras
31c50 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62  e[0]->aTerm[0].b
31c60 46 69 72 73 74 0d 0a 20 20 29 3b 0d 0a 0d 0a 20  First..  );.... 
31c70 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 69   /* Initialize i
31c80 4c 61 73 74 2c 20 74 68 65 20 22 6c 61 73 74 65  Last, the "laste
31c90 73 74 22 20 72 6f 77 69 64 20 61 6e 79 20 69 74  st" rowid any it
31ca0 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
31cb0 2e 20 49 66 20 74 68 65 0d 0a 20 20 2a 2a 20 69  . If the..  ** i
31cc0 74 65 72 61 74 6f 72 20 73 6b 69 70 73 20 74 68  terator skips th
31cd0 72 6f 75 67 68 20 72 6f 77 69 64 73 20 69 6e 20  rough rowids in 
31ce0 74 68 65 20 64 65 66 61 75 6c 74 20 61 73 63 65  the default asce
31cf0 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 74 68 69  nding order, thi
31d00 73 20 6d 65 61 6e 73 0d 0a 20 20 2a 2a 20 74 68  s means..  ** th
31d10 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 2e  e maximum rowid.
31d20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 74 65 72   Or, if the iter
31d30 61 74 6f 72 20 69 73 20 22 4f 52 44 45 52 20 42  ator is "ORDER B
31d40 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 74  Y rowid DESC", t
31d50 68 65 6e 20 69 74 0d 0a 20 20 2a 2a 20 6d 65 61  hen it..  ** mea
31d60 6e 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 72  ns the minimum r
31d70 6f 77 69 64 2e 20 20 2a 2f 0d 0a 20 20 69 66 28  owid.  */..  if(
31d80 20 70 4c 65 66 74 2d 3e 61 54 65 72 6d 5b 30 5d   pLeft->aTerm[0]
31d90 2e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0d 0a 20 20  .pSynonym ){..  
31da0 20 20 69 4c 61 73 74 20 3d 20 66 74 73 35 45 78    iLast = fts5Ex
31db0 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 26  prSynonymRowid(&
31dc0 70 4c 65 66 74 2d 3e 61 54 65 72 6d 5b 30 5d 2c  pLeft->aTerm[0],
31dd0 20 62 44 65 73 63 2c 20 30 29 3b 0d 0a 20 20 7d   bDesc, 0);..  }
31de0 65 6c 73 65 7b 0d 0a 20 20 20 20 69 4c 61 73 74  else{..    iLast
31df0 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65 72 6d 5b   = pLeft->aTerm[
31e00 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  0].pIter->iRowid
31e10 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 64 6f 20 7b  ;..  }....  do {
31e20 0d 0a 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31  ..    bMatch = 1
31e30 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
31e40 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
31e50 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 46  ; i++){..      F
31e60 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
31e70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
31e80 61 70 50 68 72 61 73 65 5b 69 5d 3b 0d 0a 20 20  apPhrase[i];..  
31e90 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
31ea0 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a  Phrase->nTerm; j
31eb0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74  ++){..        Ft
31ec0 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
31ed0 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  m = &pPhrase->aT
31ee0 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20 20 20 20  erm[j];..       
31ef0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e   if( pTerm->pSyn
31f00 6f 6e 79 6d 20 29 7b 0d 0a 20 20 20 20 20 20 20  onym ){..       
31f10 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
31f20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
31f30 6f 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73  owid(pTerm, bDes
31f40 63 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20  c, 0);..        
31f50 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 69 4c    if( iRowid==iL
31f60 61 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d  ast ) continue;.
31f70 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
31f80 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  h = 0;..        
31f90 20 20 69 66 28 20 66 74 73 35 45 78 70 72 53 79    if( fts5ExprSy
31fa0 6e 6f 6e 79 6d 41 64 76 61 6e 63 65 74 6f 28 70  nonymAdvanceto(p
31fb0 54 65 72 6d 2c 20 62 44 65 73 63 2c 20 26 69 4c  Term, bDesc, &iL
31fc0 61 73 74 2c 20 26 72 63 29 20 29 7b 0d 0a 20 20  ast, &rc) ){..  
31fd0 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
31fe0 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a  >bNomatch = 0;..
31ff0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64              pNod
32000 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  e->bEof = 1;..  
32010 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
32020 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 20 20   rc;..          
32030 7d 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  }..        }else
32040 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  {..          Fts
32050 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
32060 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65  r = pPhrase->aTe
32070 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0d 0a 20 20  rm[j].pIter;..  
32080 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
32090 72 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74  r->iRowid==iLast
320a0 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20   || pIter->bEof 
320b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20  ) continue;..   
320c0 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20         bMatch = 
320d0 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  0;..          if
320e0 28 20 66 74 73 35 45 78 70 72 41 64 76 61 6e 63  ( fts5ExprAdvanc
320f0 65 74 6f 28 70 49 74 65 72 2c 20 62 44 65 73 63  eto(pIter, bDesc
32100 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 2c 20 26  , &iLast, &rc, &
32110 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 20 29 7b 0d  pNode->bEof) ){.
32120 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
32130 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20  urn rc;..       
32140 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
32150 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
32160 0a 20 20 7d 77 68 69 6c 65 28 20 62 4d 61 74 63  .  }while( bMatc
32170 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 70 4e 6f  h==0 );....  pNo
32180 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 69 4c 61  de->iRowid = iLa
32190 73 74 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e  st;..  pNode->bN
321a0 6f 6d 61 74 63 68 20 3d 20 28 28 30 3d 3d 66 74  omatch = ((0==ft
321b0 73 35 45 78 70 72 4e 65 61 72 54 65 73 74 28 26  s5ExprNearTest(&
321c0 72 63 2c 20 70 45 78 70 72 2c 20 70 4e 6f 64 65  rc, pExpr, pNode
321d0 29 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  )) && rc==SQLITE
321e0 5f 4f 4b 29 3b 0d 0a 20 20 61 73 73 65 72 74 28  _OK);..  assert(
321f0 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20   pNode->bEof==0 
32200 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74  || pNode->bNomat
32210 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 72 65  ch==0 );....  re
32220 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f  turn rc;..}..../
32230 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  *..** Advance th
32240 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 74 65  e first term ite
32250 72 61 74 6f 72 20 69 6e 20 74 68 65 20 66 69 72  rator in the fir
32260 73 74 20 70 68 72 61 73 65 20 6f 66 20 70 4e 65  st phrase of pNe
32270 61 72 2e 20 53 65 74 20 6f 75 74 70 75 74 0d 0a  ar. Set output..
32280 2a 2a 20 76 61 72 69 61 62 6c 65 20 2a 70 62 45  ** variable *pbE
32290 6f 66 20 74 6f 20 74 72 75 65 20 69 66 20 69 74  of to true if it
322a0 20 72 65 61 63 68 65 73 20 45 4f 46 20 6f 72 20   reaches EOF or 
322b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
322c0 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75  rs...**..** Retu
322d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
322e0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
322f0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
32300 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0d  ode if an error.
32310 0a 2a 2a 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d  .** occurs...*/.
32320 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
32330 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 53 54 52  ExprNodeNext_STR
32340 49 4e 47 28 0d 0a 20 20 46 74 73 35 45 78 70 72  ING(..  Fts5Expr
32350 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
32360 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
32370 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65  ssion pPhrase be
32380 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20 20 46  longs to */..  F
32390 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
323a0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  de,            /
323b0 2a 20 46 54 53 35 5f 53 54 52 49 4e 47 20 6f 72  * FTS5_STRING or
323c0 20 46 54 53 35 5f 54 45 52 4d 20 6e 6f 64 65 20   FTS5_TERM node 
323d0 2a 2f 0d 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56  */..  int bFromV
323e0 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20 69 46 72  alid,..  i64 iFr
323f0 6f 6d 20 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45  om ..){..  Fts5E
32400 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  xprTerm *pTerm =
32410 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e   &pNode->pNear->
32420 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65  apPhrase[0]->aTe
32430 72 6d 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 72 63  rm[0];..  int rc
32440 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d   = SQLITE_OK;...
32450 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74  .  pNode->bNomat
32460 63 68 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 70  ch = 0;..  if( p
32470 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
32480 7b 0d 0a 20 20 20 20 69 6e 74 20 62 45 6f 66 20  {..    int bEof 
32490 3d 20 31 3b 0d 0a 20 20 20 20 46 74 73 35 45 78  = 1;..    Fts5Ex
324a0 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20 20  prTerm *p;....  
324b0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69    /* Find the fi
324c0 72 73 74 65 73 74 20 72 6f 77 69 64 20 61 6e 79  rstest rowid any
324d0 20 73 79 6e 6f 6e 79 6d 20 70 6f 69 6e 74 73 20   synonym points 
324e0 74 6f 2e 20 2a 2f 0d 0a 20 20 20 20 69 36 34 20  to. */..    i64 
324f0 69 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70  iRowid = fts5Exp
32500 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54  rSynonymRowid(pT
32510 65 72 6d 2c 20 70 45 78 70 72 2d 3e 62 44 65 73  erm, pExpr->bDes
32520 63 2c 20 30 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a  c, 0);....    /*
32530 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 69 74   Advance each it
32540 65 72 61 74 6f 72 20 74 68 61 74 20 63 75 72 72  erator that curr
32550 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
32560 69 52 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20 69  iRowid. Or, if i
32570 46 72 6f 6d 0d 0a 20 20 20 20 2a 2a 20 69 73 20  From..    ** is 
32580 76 61 6c 69 64 20 2d 20 65 61 63 68 20 69 74 65  valid - each ite
32590 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  rator that point
325a0 73 20 74 6f 20 61 20 72 6f 77 69 64 20 62 65 66  s to a rowid bef
325b0 6f 72 65 20 69 46 72 6f 6d 2e 20 20 2a 2f 0d 0a  ore iFrom.  */..
325c0 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b      for(p=pTerm;
325d0 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
325e0 6d 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 73  m){..      if( s
325f0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
32600 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29  f(p->pIter)==0 )
32610 7b 0d 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  {..        i64 i
32620 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69 52  i = p->pIter->iR
32630 6f 77 69 64 3b 0d 0a 20 20 20 20 20 20 20 20 69  owid;..        i
32640 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0d 0a  f( ii==iRowid ..
32650 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72           || (bFr
32660 6f 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d 69  omValid && ii!=i
32670 46 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72 6f  From && (ii>iFro
32680 6d 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73 63  m)==pExpr->bDesc
32690 29 20 0d 0a 20 20 20 20 20 20 20 20 29 7b 0d 0a  ) ..        ){..
326a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 46            if( bF
326b0 72 6f 6d 56 61 6c 69 64 20 29 7b 0d 0a 20 20 20  romValid ){..   
326c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
326d0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
326e0 74 46 72 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20  tFrom(p->pIter, 
326f0 69 46 72 6f 6d 29 3b 0d 0a 20 20 20 20 20 20 20  iFrom);..       
32700 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
32710 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32720 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
32730 70 2d 3e 70 49 74 65 72 29 3b 0d 0a 20 20 20 20  p->pIter);..    
32740 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
32750 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32760 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20  E_OK ) break;.. 
32770 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
32780 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
32790 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29 7b 0d  p->pIter)==0 ){.
327a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 45 6f  .            bEo
327b0 66 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  f = 0;..        
327c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c    }..        }el
327d0 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  se{..          b
327e0 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  Eof = 0;..      
327f0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
32800 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 65    }....    /* Se
32810 74 20 74 68 65 20 45 4f 46 20 66 6c 61 67 20 69  t the EOF flag i
32820 66 20 65 69 74 68 65 72 20 61 6c 6c 20 73 79 6e  f either all syn
32830 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 73 20 61  onym iterators a
32840 72 65 20 61 74 20 45 4f 46 20 6f 72 20 61 6e 0d  re at EOF or an.
32850 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 68 61  .    ** error ha
32860 73 20 6f 63 63 75 72 72 65 64 2e 20 20 2a 2f 0d  s occurred.  */.
32870 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  .    pNode->bEof
32880 20 3d 20 28 72 63 20 7c 7c 20 62 45 6f 66 29 3b   = (rc || bEof);
32890 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20  ..  }else{..    
328a0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
328b0 49 74 65 72 20 3d 20 70 54 65 72 6d 2d 3e 70 49  Iter = pTerm->pI
328c0 74 65 72 3b 0d 0a 0d 0a 20 20 20 20 61 73 73 65  ter;....    asse
328d0 72 74 28 20 46 74 73 35 4e 6f 64 65 49 73 53 74  rt( Fts5NodeIsSt
328e0 72 69 6e 67 28 70 4e 6f 64 65 29 20 29 3b 0d 0a  ring(pNode) );..
328f0 20 20 20 20 69 66 28 20 62 46 72 6f 6d 56 61 6c      if( bFromVal
32900 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20  id ){..      rc 
32910 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
32920 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c  rNextFrom(pIter,
32930 20 69 46 72 6f 6d 29 3b 0d 0a 20 20 20 20 7d 65   iFrom);..    }e
32940 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d  lse{..      rc =
32950 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
32960 4e 65 78 74 28 70 49 74 65 72 29 3b 0d 0a 20 20  Next(pIter);..  
32970 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 4e 6f 64 65    }....    pNode
32980 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c 20  ->bEof = (rc || 
32990 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
329a0 6f 66 28 70 49 74 65 72 29 29 3b 0d 0a 20 20 7d  of(pIter));..  }
329b0 0d 0a 0d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  ....  if( pNode-
329c0 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20  >bEof==0 ){..   
329d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
329e0 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 72  ITE_OK );..    r
329f0 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
32a00 54 65 73 74 5f 53 54 52 49 4e 47 28 70 45 78 70  Test_STRING(pExp
32a10 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d  r, pNode);..  }.
32a20 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  ...  return rc;.
32a30 0a 7d 0d 0a 0d 0a 0d 0a 73 74 61 74 69 63 20 69  .}......static i
32a40 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54  nt fts5ExprNodeT
32a50 65 73 74 5f 54 45 52 4d 28 0d 0a 20 20 46 74 73  est_TERM(..  Fts
32a60 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
32a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a80 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  Expression that 
32a90 70 4e 65 61 72 20 69 73 20 61 20 70 61 72 74 20  pNear is a part 
32aa0 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  of */..  Fts5Exp
32ab0 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20  rNode *pNode    
32ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32ad0 22 4e 45 41 52 22 20 6e 6f 64 65 20 28 46 54 53  "NEAR" node (FTS
32ae0 35 5f 54 45 52 4d 29 20 2a 2f 0d 0a 29 7b 0d 0a  5_TERM) */..){..
32af0 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22 4e 45    /* As this "NE
32b00 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20 61 63  AR" object is ac
32b10 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  tually a single 
32b20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e 73  phrase that cons
32b30 69 73 74 73 20 0d 0a 20 20 2a 2a 20 6f 66 20 61  ists ..  ** of a
32b40 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e 6c   single term onl
32b50 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72 73  y, grab pointers
32b60 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69 73   into the poslis
32b70 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
32b80 0d 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64 65  ..  ** fts5_inde
32b90 78 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  x.c iterator obj
32ba0 65 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75 63  ect. This is muc
32bb0 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79  h faster than sy
32bc0 6e 74 68 65 73 69 7a 69 6e 67 20 0d 0a 20 20 2a  nthesizing ..  *
32bd0 2a 20 61 20 6e 65 77 20 70 6f 73 6c 69 73 74 20  * a new poslist 
32be0 74 68 65 20 77 61 79 20 77 65 20 68 61 76 65 20  the way we have 
32bf0 74 6f 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 70  to for more comp
32c00 6c 69 63 61 74 65 64 20 70 68 72 61 73 65 20 6f  licated phrase o
32c10 72 20 4e 45 41 52 0d 0a 20 20 2a 2a 20 65 78 70  r NEAR..  ** exp
32c20 72 65 73 73 69 6f 6e 73 2e 20 20 2a 2f 0d 0a 20  ressions.  */.. 
32c30 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
32c40 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 6f 64 65  *pPhrase = pNode
32c50 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  ->pNear->apPhras
32c60 65 5b 30 5d 3b 0d 0a 20 20 46 74 73 35 49 6e 64  e[0];..  Fts5Ind
32c70 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  exIter *pIter = 
32c80 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
32c90 5d 2e 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 61 73  ].pIter;....  as
32ca0 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
32cb0 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 3b  pe==FTS5_TERM );
32cc0 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ..  assert( pNod
32cd0 65 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  e->pNear->nPhras
32ce0 65 3d 3d 31 20 26 26 20 70 50 68 72 61 73 65 2d  e==1 && pPhrase-
32cf0 3e 6e 54 65 72 6d 3d 3d 31 20 29 3b 0d 0a 20 20  >nTerm==1 );..  
32d00 61 73 73 65 72 74 28 20 70 50 68 72 61 73 65 2d  assert( pPhrase-
32d10 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e  >aTerm[0].pSynon
32d20 79 6d 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 70 50  ym==0 );....  pP
32d30 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e  hrase->poslist.n
32d40 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 3b   = pIter->nData;
32d50 0d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
32d60 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
32d70 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
32d80 4c 20 29 7b 0d 0a 20 20 20 20 70 50 68 72 61 73  L ){..    pPhras
32d90 65 2d 3e 70 6f 73 6c 69 73 74 2e 70 20 3d 20 28  e->poslist.p = (
32da0 75 38 2a 29 70 49 74 65 72 2d 3e 70 44 61 74 61  u8*)pIter->pData
32db0 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f 64 65 2d  ;..  }..  pNode-
32dc0 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d  >iRowid = pIter-
32dd0 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 70 4e 6f 64  >iRowid;..  pNod
32de0 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 70  e->bNomatch = (p
32df0 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
32e00 6e 3d 3d 30 29 3b 0d 0a 20 20 72 65 74 75 72 6e  n==0);..  return
32e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a   SQLITE_OK;..}..
32e20 0d 0a 2f 2a 0d 0a 2a 2a 20 78 4e 65 78 74 28 29  ../*..** xNext()
32e30 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 6e 6f   method for a no
32e40 64 65 20 6f 66 20 74 79 70 65 20 46 54 53 35 5f  de of type FTS5_
32e50 54 45 52 4d 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  TERM...*/..stati
32e60 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
32e70 64 65 4e 65 78 74 5f 54 45 52 4d 28 0d 0a 20 20  deNext_TERM(..  
32e80 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
32e90 20 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64   ..  Fts5ExprNod
32ea0 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74  e *pNode,..  int
32eb0 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20   bFromValid,..  
32ec0 69 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20  i64 iFrom..){.. 
32ed0 20 69 6e 74 20 72 63 3b 0d 0a 20 20 46 74 73 35   int rc;..  Fts5
32ee0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
32ef0 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d   = pNode->pNear-
32f00 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54  >apPhrase[0]->aT
32f10 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d 0a 0d  erm[0].pIter;...
32f20 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
32f30 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0d 0a 20 20  ->bEof==0 );..  
32f40 69 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29  if( bFromValid )
32f50 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  {..    rc = sqli
32f60 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
32f70 72 6f 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d  rom(pIter, iFrom
32f80 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  );..  }else{..  
32f90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
32fa0 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  s5IterNext(pIter
32fb0 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72  );..  }..  if( r
32fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32fd0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
32fe0 6f 66 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0d  of(pIter)==0 ){.
32ff0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
33000 70 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28  prNodeTest_TERM(
33010 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
33020 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 4e    }else{..    pN
33030 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a  ode->bEof = 1;..
33040 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61      pNode->bNoma
33050 74 63 68 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20  tch = 0;..  }.. 
33060 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a   return rc;..}..
33070 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
33080 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f  s5ExprNodeTest_O
33090 52 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  R(..  Fts5Expr *
330a0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
330b0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
330c0 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e 6f  ion of which pNo
330d0 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f 0d  de is a part */.
330e0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
330f0 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20  *pNode          
33100 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
33110 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f   node to test */
33120 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70 72  ..){..  Fts5Expr
33130 4e 6f 64 65 20 2a 70 4e 65 78 74 20 3d 20 70 4e  Node *pNext = pN
33140 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b  ode->apChild[0];
33150 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20  ..  int i;....  
33160 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 6f 64 65  for(i=1; i<pNode
33170 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0d  ->nChild; i++){.
33180 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64  .    Fts5ExprNod
33190 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 4e 6f 64  e *pChild = pNod
331a0 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 3b 0d 0a  e->apChild[i];..
331b0 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66 74      int cmp = ft
331c0 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45  s5NodeCompare(pE
331d0 78 70 72 2c 20 70 4e 65 78 74 2c 20 70 43 68 69  xpr, pNext, pChi
331e0 6c 64 29 3b 0d 0a 20 20 20 20 69 66 28 20 63 6d  ld);..    if( cm
331f0 70 3e 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26  p>0 || (cmp==0 &
33200 26 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d 61 74  & pChild->bNomat
33210 63 68 3d 3d 30 29 20 29 7b 0d 0a 20 20 20 20 20  ch==0) ){..     
33220 20 70 4e 65 78 74 20 3d 20 70 43 68 69 6c 64 3b   pNext = pChild;
33230 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20  ..    }..  }..  
33240 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20  pNode->iRowid = 
33250 70 4e 65 78 74 2d 3e 69 52 6f 77 69 64 3b 0d 0a  pNext->iRowid;..
33260 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
33270 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0d 0a 20 20  pNext->bEof;..  
33280 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
33290 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61 74 63  = pNext->bNomatc
332a0 68 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  h;..}....static 
332b0 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65  int fts5ExprNode
332c0 4e 65 78 74 5f 4f 52 28 0d 0a 20 20 46 74 73 35  Next_OR(..  Fts5
332d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0d 0a 20  Expr *pExpr, .. 
332e0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
332f0 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74 20 62 46 72  Node,..  int bFr
33300 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20  omValid,..  i64 
33310 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e 74  iFrom..){..  int
33320 20 69 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73 74   i;..  i64 iLast
33330 20 3d 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64   = pNode->iRowid
33340 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ;....  for(i=0; 
33350 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b  i<pNode->nChild;
33360 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35   i++){..    Fts5
33370 45 78 70 72 4e 6f 64 65 20 2a 70 31 20 3d 20 70  ExprNode *p1 = p
33380 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d  Node->apChild[i]
33390 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
333a0 31 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35 52  1->bEof || fts5R
333b0 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70  owidCmp(pExpr, p
333c0 31 2d 3e 69 52 6f 77 69 64 2c 20 69 4c 61 73 74  1->iRowid, iLast
333d0 29 3e 3d 30 20 29 3b 0d 0a 20 20 20 20 69 66 28  )>=0 );..    if(
333e0 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d   p1->bEof==0 ){.
333f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 31 2d 3e  .      if( (p1->
33400 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29 20 0d  iRowid==iLast) .
33410 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72 6f  .       || (bFro
33420 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52 6f  mValid && fts5Ro
33430 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31  widCmp(pExpr, p1
33440 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d 29  ->iRowid, iFrom)
33450 3c 30 29 0d 0a 20 20 20 20 20 20 29 7b 0d 0a 20  <0)..      ){.. 
33460 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
33470 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
33480 28 70 45 78 70 72 2c 20 70 31 2c 20 62 46 72 6f  (pExpr, p1, bFro
33490 6d 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0d  mValid, iFrom);.
334a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
334b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
334c0 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e           pNode->
334d0 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20  bNomatch = 0;.. 
334e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
334f0 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rc;..        }..
33500 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
33510 20 20 7d 0d 0a 0d 0a 20 20 66 74 73 35 45 78 70    }....  fts5Exp
33520 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45 78  rNodeTest_OR(pEx
33530 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 72  pr, pNode);..  r
33540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33550 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72  ..}..../*..** Ar
33560 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73 20  gument pNode is 
33570 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65  an FTS5_AND node
33580 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
33590 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
335a0 73 74 5f 41 4e 44 28 0d 0a 20 20 46 74 73 35 45  st_AND(..  Fts5E
335b0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
335c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
335d0 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65  pression pPhrase
335e0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a   belongs to */..
335f0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
33600 70 41 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  pAnd            
33610 20 20 2f 2a 20 46 54 53 35 5f 41 4e 44 20 6e 6f    /* FTS5_AND no
33620 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  de to advance */
33630 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 43 68 69  ..){..  int iChi
33640 6c 64 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73 74  ld;..  i64 iLast
33650 20 3d 20 70 41 6e 64 2d 3e 69 52 6f 77 69 64 3b   = pAnd->iRowid;
33660 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
33670 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 20 62  ITE_OK;..  int b
33680 4d 61 74 63 68 3b 0d 0a 0d 0a 20 20 61 73 73 65  Match;....  asse
33690 72 74 28 20 70 41 6e 64 2d 3e 62 45 6f 66 3d 3d  rt( pAnd->bEof==
336a0 30 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20  0 );..  do {..  
336b0 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68    pAnd->bNomatch
336c0 20 3d 20 30 3b 0d 0a 20 20 20 20 62 4d 61 74 63   = 0;..    bMatc
336d0 68 20 3d 20 31 3b 0d 0a 20 20 20 20 66 6f 72 28  h = 1;..    for(
336e0 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69 6c 64  iChild=0; iChild
336f0 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b 20 69  <pAnd->nChild; i
33700 43 68 69 6c 64 2b 2b 29 7b 0d 0a 20 20 20 20 20  Child++){..     
33710 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
33720 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61 70  Child = pAnd->ap
33730 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0d 0a  Child[iChild];..
33740 20 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20        int cmp = 
33750 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78  fts5RowidCmp(pEx
33760 70 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c  pr, iLast, pChil
33770 64 2d 3e 69 52 6f 77 69 64 29 3b 0d 0a 20 20 20  d->iRowid);..   
33780 20 20 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0d     if( cmp>0 ){.
33790 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61  .        /* Adva
337a0 6e 63 65 20 70 43 68 69 6c 64 20 75 6e 74 69 6c  nce pChild until
337b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 4c   it points to iL
337c0 61 73 74 20 6f 72 20 6c 61 73 74 65 72 20 2a 2f  ast or laster */
337d0 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ..        rc = f
337e0 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
337f0 70 45 78 70 72 2c 20 70 43 68 69 6c 64 2c 20 31  pExpr, pChild, 1
33800 2c 20 69 4c 61 73 74 29 3b 0d 0a 20 20 20 20 20  , iLast);..     
33810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33820 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20  E_OK ){..       
33830 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63     pAnd->bNomatc
33840 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  h = 0;..        
33850 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20    return rc;..  
33860 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
33870 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ....      /* If 
33880 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 69  the child node i
33890 73 20 6e 6f 77 20 61 74 20 45 4f 46 2c 20 73 6f  s now at EOF, so
338a0 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 41   is the parent A
338b0 4e 44 20 6e 6f 64 65 2e 20 4f 74 68 65 72 77 69  ND node. Otherwi
338c0 73 65 2c 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68  se,..      ** th
338d0 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 69 73 20  e child node is 
338e0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
338f0 76 65 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c  ve advanced at l
33900 65 61 73 74 20 61 73 20 66 61 72 20 61 73 0d 0a  east as far as..
33910 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 69        ** rowid i
33920 4c 61 73 74 2e 20 53 6f 20 69 66 20 69 74 20 69  Last. So if it i
33930 73 20 6e 6f 74 20 61 74 20 65 78 61 63 74 6c 79  s not at exactly
33940 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e   iLast, pChild->
33950 69 52 6f 77 69 64 20 69 73 20 74 68 65 0d 0a 20  iRowid is the.. 
33960 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c 61 73 74       ** new last
33970 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20 73  est rowid seen s
33980 6f 20 66 61 72 2e 20 20 2a 2f 0d 0a 20 20 20 20  o far.  */..    
33990 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
339a0 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35 52 6f  ->bEof || fts5Ro
339b0 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 69 4c  widCmp(pExpr, iL
339c0 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69 52 6f  ast, pChild->iRo
339d0 77 69 64 29 3c 3d 30 20 29 3b 0d 0a 20 20 20 20  wid)<=0 );..    
339e0 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62 45    if( pChild->bE
339f0 6f 66 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66  of ){..        f
33a00 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41  ts5ExprSetEof(pA
33a10 6e 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 62 4d  nd);..        bM
33a20 61 74 63 68 20 3d 20 31 3b 0d 0a 20 20 20 20 20  atch = 1;..     
33a30 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
33a40 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 61 73 74   }else if( iLast
33a50 21 3d 70 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64  !=pChild->iRowid
33a60 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 62 4d 61   ){..        bMa
33a70 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  tch = 0;..      
33a80 20 20 69 4c 61 73 74 20 3d 20 70 43 68 69 6c 64    iLast = pChild
33a90 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20  ->iRowid;..     
33aa0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28 20   }....      if( 
33ab0 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d 61 74 63 68  pChild->bNomatch
33ac0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 41 6e   ){..        pAn
33ad0 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 31 3b  d->bNomatch = 1;
33ae0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
33af0 0d 0a 20 20 7d 77 68 69 6c 65 28 20 62 4d 61 74  ..  }while( bMat
33b00 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69 66  ch==0 );....  if
33b10 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68  ( pAnd->bNomatch
33b20 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70 72 2d   && pAnd!=pExpr-
33b30 3e 70 52 6f 6f 74 20 29 7b 0d 0a 20 20 20 20 66  >pRoot ){..    f
33b40 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
33b50 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0d 0a 20  oslist(pAnd);.. 
33b60 20 7d 0d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77   }..  pAnd->iRow
33b70 69 64 20 3d 20 69 4c 61 73 74 3b 0d 0a 20 20 72  id = iLast;..  r
33b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33b90 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  ..}....static in
33ba0 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  t fts5ExprNodeNe
33bb0 78 74 5f 41 4e 44 28 0d 0a 20 20 46 74 73 35 45  xt_AND(..  Fts5E
33bc0 78 70 72 20 2a 70 45 78 70 72 2c 20 0d 0a 20 20  xpr *pExpr, ..  
33bd0 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
33be0 6f 64 65 2c 0d 0a 20 20 69 6e 74 20 62 46 72 6f  ode,..  int bFro
33bf0 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20 69  mValid,..  i64 i
33c00 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  From..){..  int 
33c10 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
33c20 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 4e 6f  eNext(pExpr, pNo
33c30 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2c 20  de->apChild[0], 
33c40 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f  bFromValid, iFro
33c50 6d 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  m);..  if( rc==S
33c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
33c70 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
33c80 64 65 54 65 73 74 5f 41 4e 44 28 70 45 78 70 72  deTest_AND(pExpr
33c90 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 65 6c  , pNode);..  }el
33ca0 73 65 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  se{..    pNode->
33cb0 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20  bNomatch = 0;.. 
33cc0 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
33cd0 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  ..}....static in
33ce0 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
33cf0 73 74 5f 4e 4f 54 28 0d 0a 20 20 46 74 73 35 45  st_NOT(..  Fts5E
33d00 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
33d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
33d20 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65  pression pPhrase
33d30 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a   belongs to */..
33d40 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
33d50 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pNode           
33d60 20 20 2f 2a 20 46 54 53 35 5f 4e 4f 54 20 6e 6f    /* FTS5_NOT no
33d70 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  de to advance */
33d80 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  ..){..  int rc =
33d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46   SQLITE_OK;..  F
33da0 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31 20  ts5ExprNode *p1 
33db0 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  = pNode->apChild
33dc0 5b 30 5d 3b 0d 0a 20 20 46 74 73 35 45 78 70 72  [0];..  Fts5Expr
33dd0 4e 6f 64 65 20 2a 70 32 20 3d 20 70 4e 6f 64 65  Node *p2 = pNode
33de0 2d 3e 61 70 43 68 69 6c 64 5b 31 5d 3b 0d 0a 20  ->apChild[1];.. 
33df0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
33e00 6e 43 68 69 6c 64 3d 3d 32 20 29 3b 0d 0a 0d 0a  nChild==2 );....
33e10 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
33e20 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d 3e 62 45  ITE_OK && p1->bE
33e30 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 6e  of==0 ){..    in
33e40 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65  t cmp = fts5Node
33e50 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70  Compare(pExpr, p
33e60 31 2c 20 70 32 29 3b 0d 0a 20 20 20 20 69 66 28  1, p2);..    if(
33e70 20 63 6d 70 3e 30 20 29 7b 0d 0a 20 20 20 20 20   cmp>0 ){..     
33e80 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
33e90 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32  deNext(pExpr, p2
33ea0 2c 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29  , 1, p1->iRowid)
33eb0 3b 0d 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 66  ;..      cmp = f
33ec0 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70  ts5NodeCompare(p
33ed0 45 78 70 72 2c 20 70 31 2c 20 70 32 29 3b 0d 0a  Expr, p1, p2);..
33ee0 20 20 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 72      }..    asser
33ef0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33f00 20 7c 7c 20 63 6d 70 3c 3d 30 20 29 3b 0d 0a 20   || cmp<=0 );.. 
33f10 20 20 20 69 66 28 20 63 6d 70 20 7c 7c 20 70 32     if( cmp || p2
33f20 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 20 62 72 65  ->bNomatch ) bre
33f30 61 6b 3b 0d 0a 20 20 20 20 72 63 20 3d 20 66 74  ak;..    rc = ft
33f40 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70  s5ExprNodeNext(p
33f50 45 78 70 72 2c 20 70 31 2c 20 30 2c 20 30 29 3b  Expr, p1, 0, 0);
33f60 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f 64 65 2d 3e  ..  }..  pNode->
33f70 62 45 6f 66 20 3d 20 70 31 2d 3e 62 45 6f 66 3b  bEof = p1->bEof;
33f80 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ..  pNode->bNoma
33f90 74 63 68 20 3d 20 70 31 2d 3e 62 4e 6f 6d 61 74  tch = p1->bNomat
33fa0 63 68 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52  ch;..  pNode->iR
33fb0 6f 77 69 64 20 3d 20 70 31 2d 3e 69 52 6f 77 69  owid = p1->iRowi
33fc0 64 3b 0d 0a 20 20 69 66 28 20 70 31 2d 3e 62 45  d;..  if( p1->bE
33fd0 6f 66 20 29 7b 0d 0a 20 20 20 20 66 74 73 35 45  of ){..    fts5E
33fe0 78 70 72 4e 6f 64 65 5a 65 72 6f 50 6f 73 6c 69  xprNodeZeroPosli
33ff0 73 74 28 70 32 29 3b 0d 0a 20 20 7d 0d 0a 20 20  st(p2);..  }..  
34000 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d  return rc;..}...
34010 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
34020 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54  ExprNodeNext_NOT
34030 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  (..  Fts5Expr *p
34040 45 78 70 72 2c 20 0d 0a 20 20 46 74 73 35 45 78  Expr, ..  Fts5Ex
34050 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0d 0a  prNode *pNode,..
34060 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64    int bFromValid
34070 2c 0d 0a 20 20 69 36 34 20 69 46 72 6f 6d 0d 0a  ,..  i64 iFrom..
34080 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 66  ){..  int rc = f
34090 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
340a0 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61 70  pExpr, pNode->ap
340b0 43 68 69 6c 64 5b 30 5d 2c 20 62 46 72 6f 6d 56  Child[0], bFromV
340c0 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20  alid, iFrom);.. 
340d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
340e0 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  OK ){..    rc = 
340f0 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
34100 5f 4e 4f 54 28 70 45 78 70 72 2c 20 70 4e 6f 64  _NOT(pExpr, pNod
34110 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  e);..  }..  if( 
34120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34130 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f  ..    pNode->bNo
34140 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 7d 0d  match = 0;..  }.
34150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
34160 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 70 4e  ..../*..** If pN
34170 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ode currently po
34180 69 6e 74 73 20 74 6f 20 61 20 6d 61 74 63 68 2c  ints to a match,
34190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
341a0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
341b0 0d 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f 64  ..** without mod
341c0 69 66 79 69 6e 67 20 69 74 2e 20 4f 74 68 65 72  ifying it. Other
341d0 77 69 73 65 2c 20 70 4e 6f 64 65 20 69 73 20 61  wise, pNode is a
341e0 64 76 61 6e 63 65 64 20 75 6e 74 69 6c 20 69 74  dvanced until it
341f0 20 64 6f 65 73 20 70 6f 69 6e 74 0d 0a 2a 2a 20   does point..** 
34200 74 6f 20 61 20 6d 61 74 63 68 20 6f 72 20 45 4f  to a match or EO
34210 46 20 69 73 20 72 65 61 63 68 65 64 2e 0d 0a 2a  F is reached...*
34220 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
34230 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28 0d  s5ExprNodeTest(.
34240 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
34250 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
34260 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
34270 20 6f 66 20 77 68 69 63 68 20 70 4e 6f 64 65 20   of which pNode 
34280 69 73 20 61 20 70 61 72 74 20 2a 2f 0d 0a 20 20  is a part */..  
34290 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
342a0 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
342b0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6e 6f  /* Expression no
342c0 64 65 20 74 6f 20 74 65 73 74 20 2a 2f 0d 0a 29  de to test */..)
342d0 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  {..  int rc = SQ
342e0 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20  LITE_OK;..  if( 
342f0 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29  pNode->bEof==0 )
34300 7b 0d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  {..    switch( p
34310 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0d 0a  Node->eType ){..
34320 0d 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  ..      case FTS
34330 35 5f 53 54 52 49 4e 47 3a 20 7b 0d 0a 20 20 20  5_STRING: {..   
34340 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78       rc = fts5Ex
34350 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e  prNodeTest_STRIN
34360 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  G(pExpr, pNode);
34370 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
34380 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
34390 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52     case FTS5_TER
343a0 4d 3a 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 63  M: {..        rc
343b0 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54   = fts5ExprNodeT
343c0 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c 20  est_TERM(pExpr, 
343d0 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20 20  pNode);..       
343e0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d   break;..      }
343f0 0d 0a 0d 0a 20 20 20 20 20 20 63 61 73 65 20 46  ....      case F
34400 54 53 35 5f 41 4e 44 3a 20 7b 0d 0a 20 20 20 20  TS5_AND: {..    
34410 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
34420 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45  rNodeTest_AND(pE
34430 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20  xpr, pNode);..  
34440 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
34450 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 63      }....      c
34460 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0d 0a  ase FTS5_OR: {..
34470 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
34480 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45 78 70  NodeTest_OR(pExp
34490 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20  r, pNode);..    
344a0 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
344b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 64 65 66    }....      def
344c0 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e  ault: assert( pN
344d0 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
344e0 5f 4e 4f 54 20 29 3b 20 7b 0d 0a 20 20 20 20 20  _NOT ); {..     
344f0 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
34500 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78  NodeTest_NOT(pEx
34510 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  pr, pNode);..   
34520 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
34530 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
34540 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
34550 7d 0d 0a 0d 0a 20 0d 0a 2f 2a 0d 0a 2a 2a 20 53  }.... ../*..** S
34560 65 74 20 6e 6f 64 65 20 70 4e 6f 64 65 2c 20 77  et node pNode, w
34570 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
34580 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
34590 2c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  , to point to th
345a0 65 20 66 69 72 73 74 0d 0a 2a 2a 20 6d 61 74 63  e first..** matc
345b0 68 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  h. If there are 
345c0 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73 65 74 20  no matches, set 
345d0 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66 20 66 6c  the Node.bEof fl
345e0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 45  ag to indicate E
345f0 4f 46 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75  OF...**..** Retu
34600 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
34610 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
34620 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 53  ror occurs, or S
34630 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
34640 73 65 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  se...** It is no
34650 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
34660 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
34670 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  es...*/..static 
34680 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65  int fts5ExprNode
34690 46 69 72 73 74 28 46 74 73 35 45 78 70 72 20 2a  First(Fts5Expr *
346a0 70 45 78 70 72 2c 20 46 74 73 35 45 78 70 72 4e  pExpr, Fts5ExprN
346b0 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a 20 20  ode *pNode){..  
346c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
346d0 4f 4b 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45  OK;..  pNode->bE
346e0 6f 66 20 3d 20 30 3b 0d 0a 20 20 70 4e 6f 64 65  of = 0;..  pNode
346f0 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d  ->bNomatch = 0;.
34700 0a 0d 0a 20 20 69 66 28 20 46 74 73 35 4e 6f 64  ...  if( Fts5Nod
34710 65 49 73 53 74 72 69 6e 67 28 70 4e 6f 64 65 29  eIsString(pNode)
34720 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 6e 69 74   ){..    /* Init
34730 69 61 6c 69 7a 65 20 61 6c 6c 20 74 65 72 6d 20  ialize all term 
34740 69 74 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  iterators in the
34750 20 4e 45 41 52 20 6f 62 6a 65 63 74 2e 20 2a 2f   NEAR object. */
34760 0d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45  ..    rc = fts5E
34770 78 70 72 4e 65 61 72 49 6e 69 74 41 6c 6c 28 70  xprNearInitAll(p
34780 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20  Expr, pNode);.. 
34790 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65   }else if( pNode
347a0 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b 0d 0a 20  ->xNext==0 ){.. 
347b0 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
347c0 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20   1;..  }else{.. 
347d0 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 69     int i;..    i
347e0 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0d 0a 20 20  nt nEof = 0;..  
347f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f    for(i=0; i<pNo
34800 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72 63  de->nChild && rc
34810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
34820 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78  ){..      Fts5Ex
34830 70 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d  prNode *pChild =
34840 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
34850 69 5d 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20  i];..      rc = 
34860 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73  fts5ExprNodeFirs
34870 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e  t(pExpr, pNode->
34880 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20  apChild[i]);..  
34890 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
348a0 6c 64 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70  ld->bEof==0 || p
348b0 43 68 69 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20 29  Child->bEof==1 )
348c0 3b 0d 0a 20 20 20 20 20 20 6e 45 6f 66 20 2b 3d  ;..      nEof +=
348d0 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3b 0d 0a   pChild->bEof;..
348e0 20 20 20 20 7d 0d 0a 20 20 20 20 70 4e 6f 64 65      }..    pNode
348f0 2d 3e 69 52 6f 77 69 64 20 3d 20 70 4e 6f 64 65  ->iRowid = pNode
34900 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 69 52  ->apChild[0]->iR
34910 6f 77 69 64 3b 0d 0a 0d 0a 20 20 20 20 73 77 69  owid;....    swi
34920 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  tch( pNode->eTyp
34930 65 20 29 7b 0d 0a 20 20 20 20 20 20 63 61 73 65  e ){..      case
34940 20 46 54 53 35 5f 41 4e 44 3a 0d 0a 20 20 20 20   FTS5_AND:..    
34950 20 20 20 20 69 66 28 20 6e 45 6f 66 3e 30 20 29      if( nEof>0 )
34960 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66 28   fts5ExprSetEof(
34970 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20 20  pNode);..       
34980 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20   break;....     
34990 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 0d 0a   case FTS5_OR:..
349a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64          if( pNod
349b0 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45 6f 66 20  e->nChild==nEof 
349c0 29 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66  ) fts5ExprSetEof
349d0 28 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20  (pNode);..      
349e0 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20    break;....    
349f0 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20    default:..    
34a00 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
34a10 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e  e->eType==FTS5_N
34a20 4f 54 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 70  OT );..        p
34a30 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 6f  Node->bEof = pNo
34a40 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e  de->apChild[0]->
34a50 62 45 6f 66 3b 0d 0a 20 20 20 20 20 20 20 20 62  bEof;..        b
34a60 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  reak;..    }..  
34a70 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  }....  if( rc==S
34a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
34a90 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
34aa0 64 65 54 65 73 74 28 70 45 78 70 72 2c 20 70 4e  deTest(pExpr, pN
34ab0 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65  ode);..  }..  re
34ac0 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d  turn rc;..}.....
34ad0 0a 2f 2a 0d 0a 2a 2a 20 42 65 67 69 6e 20 69 74  ./*..** Begin it
34ae0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
34af0 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
34b00 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70 49  ents in index pI
34b10 64 78 20 6d 61 74 63 68 65 64 20 62 79 0d 0a 2a  dx matched by..*
34b20 2a 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72  * the MATCH expr
34b30 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
34b40 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
34b50 65 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44 65  ent. If the "bDe
34b60 73 63 22 20 0d 0a 2a 2a 20 70 61 72 61 6d 65 74  sc" ..** paramet
34b70 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20 6e  er is passed a n
34b80 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
34b90 74 65 72 61 74 69 6f 6e 20 69 73 20 69 6e 20 64  teration is in d
34ba0 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
34bb0 0d 0a 2a 2a 20 6f 72 64 65 72 2e 20 4f 72 2c 20  ..** order. Or, 
34bc0 69 66 20 69 74 20 69 73 20 7a 65 72 6f 2c 20 69  if it is zero, i
34bd0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
34be0 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 69 74  r...**..** If it
34bf0 65 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65 6e  erating in ascen
34c00 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
34c10 20 28 62 44 65 73 63 3d 3d 30 29 2c 20 74 68 65   (bDesc==0), the
34c20 20 66 69 72 73 74 20 64 6f 63 75 6d 65 6e 74 0d   first document.
34c30 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 73 20 74  .** visited is t
34c40 68 61 74 20 77 69 74 68 20 74 68 65 20 73 6d 61  hat with the sma
34c50 6c 6c 65 73 74 20 72 6f 77 69 64 20 74 68 61 74  llest rowid that
34c60 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
34c70 6f 72 20 65 71 75 61 6c 0d 0a 2a 2a 20 74 6f 20  or equal..** to 
34c80 70 61 72 61 6d 65 74 65 72 20 69 46 69 72 73 74  parameter iFirst
34c90 2e 20 4f 72 2c 20 69 66 20 69 74 65 72 61 74 69  . Or, if iterati
34ca0 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ng in ascending 
34cb0 6f 72 64 65 72 20 28 62 44 65 73 63 3d 3d 31 29  order (bDesc==1)
34cc0 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 66  ,..** then the f
34cd0 69 72 73 74 20 64 6f 63 75 6d 65 6e 74 20 76 69  irst document vi
34ce0 73 69 74 65 64 20 6d 75 73 74 20 68 61 76 65 20  sited must have 
34cf0 61 20 72 6f 77 69 64 20 73 6d 61 6c 6c 65 72 20  a rowid smaller 
34d00 74 68 61 6e 20 6f 72 0d 0a 2a 2a 20 65 71 75 61  than or..** equa
34d10 6c 20 74 6f 20 69 46 69 72 73 74 2e 0d 0a 2a 2a  l to iFirst...**
34d20 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
34d30 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
34d40 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
34d50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
34d60 65 72 77 69 73 65 2e 20 49 74 0d 0a 2a 2a 20 69  erwise. It..** i
34d70 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
34d80 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
34d90 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
34da0 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65  match any docume
34db0 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  nts...*/..static
34dc0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
34dd0 45 78 70 72 46 69 72 73 74 28 46 74 73 35 45 78  ExprFirst(Fts5Ex
34de0 70 72 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78  pr *p, Fts5Index
34df0 20 2a 70 49 64 78 2c 20 69 36 34 20 69 46 69 72   *pIdx, i64 iFir
34e00 73 74 2c 20 69 6e 74 20 62 44 65 73 63 29 7b 0d  st, int bDesc){.
34e10 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
34e20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f 6f  *pRoot = p->pRoo
34e30 74 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t;..  int rc;   
34e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
34e60 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 70 2d 3e  code */....  p->
34e70 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0d 0a  pIndex = pIdx;..
34e80 20 20 70 2d 3e 62 44 65 73 63 20 3d 20 62 44 65    p->bDesc = bDe
34e90 73 63 3b 0d 0a 20 20 72 63 20 3d 20 66 74 73 35  sc;..  rc = fts5
34ea0 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28 70 2c  ExprNodeFirst(p,
34eb0 20 70 52 6f 6f 74 29 3b 0d 0a 0d 0a 20 20 2f 2a   pRoot);....  /*
34ec0 20 49 66 20 6e 6f 74 20 61 74 20 45 4f 46 20 62   If not at EOF b
34ed0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ut the current r
34ee0 6f 77 69 64 20 6f 63 63 75 72 73 20 65 61 72 6c  owid occurs earl
34ef0 69 65 72 20 74 68 61 6e 20 69 46 69 72 73 74 20  ier than iFirst 
34f00 69 6e 0d 0a 20 20 2a 2a 20 74 68 65 20 69 74 65  in..  ** the ite
34f10 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c 20 6d 6f  ration order, mo
34f20 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 69  ve to document i
34f30 46 69 72 73 74 20 6f 72 20 6c 61 74 65 72 2e 20  First or later. 
34f40 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
34f50 4c 49 54 45 5f 4f 4b 20 0d 0a 20 20 20 26 26 20  LITE_OK ..   && 
34f60 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 0d  0==pRoot->bEof .
34f70 0a 20 20 20 26 26 20 66 74 73 35 52 6f 77 69 64  .   && fts5Rowid
34f80 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52  Cmp(p, pRoot->iR
34f90 6f 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30 20  owid, iFirst)<0 
34fa0 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d  ..  ){..    rc =
34fb0 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78   fts5ExprNodeNex
34fc0 74 28 70 2c 20 70 52 6f 6f 74 2c 20 31 2c 20 69  t(p, pRoot, 1, i
34fd0 46 69 72 73 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a  First);..  }....
34fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 74 65 72    /* If the iter
34ff0 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 74 20 61  ator is not at a
35000 20 72 65 61 6c 20 6d 61 74 63 68 2c 20 73 6b 69   real match, ski
35010 70 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20  p forward until 
35020 69 74 20 69 73 2e 20 2a 2f 0d 0a 20 20 77 68 69  it is. */..  whi
35030 6c 65 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61  le( pRoot->bNoma
35040 74 63 68 20 29 7b 0d 0a 20 20 20 20 61 73 73 65  tch ){..    asse
35050 72 74 28 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d  rt( pRoot->bEof=
35060 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
35070 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 72 63 20 3d  _OK );..    rc =
35080 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78   fts5ExprNodeNex
35090 74 28 70 2c 20 70 52 6f 6f 74 2c 20 30 2c 20 30  t(p, pRoot, 0, 0
350a0 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72  );..  }..  retur
350b0 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  n rc;..}..../*..
350c0 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
350d0 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0d 0a 2a  ext document ..*
350e0 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  *..** Return SQL
350f0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
35100 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
35110 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
35120 68 65 72 77 69 73 65 2e 20 49 74 0d 0a 2a 2a 20  herwise. It..** 
35130 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
35140 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
35150 65 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  e query does not
35160 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d   match any docum
35170 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ents...*/..stati
35180 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
35190 35 45 78 70 72 4e 65 78 74 28 46 74 73 35 45 78  5ExprNext(Fts5Ex
351a0 70 72 20 2a 70 2c 20 69 36 34 20 69 4c 61 73 74  pr *p, i64 iLast
351b0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20  ){..  int rc;.. 
351c0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
351d0 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b  Root = p->pRoot;
351e0 0d 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
351f0 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 52  t->bEof==0 && pR
35200 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30  oot->bNomatch==0
35210 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20 20   );..  do {..   
35220 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
35230 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c  deNext(p, pRoot,
35240 20 30 2c 20 30 29 3b 0d 0a 20 20 20 20 61 73 73   0, 0);..    ass
35250 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d  ert( pRoot->bNom
35260 61 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d  atch==0 || (rc==
35270 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f  SQLITE_OK && pRo
35280 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0d  ot->bEof==0) );.
35290 0a 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74  .  }while( pRoot
352a0 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 3b 0d 0a 20  ->bNomatch );.. 
352b0 20 69 66 28 20 66 74 73 35 52 6f 77 69 64 43 6d   if( fts5RowidCm
352c0 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f 77  p(p, pRoot->iRow
352d0 69 64 2c 20 69 4c 61 73 74 29 3e 30 20 29 7b 0d  id, iLast)>0 ){.
352e0 0a 20 20 20 20 70 52 6f 6f 74 2d 3e 62 45 6f 66  .    pRoot->bEof
352f0 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65   = 1;..  }..  re
35300 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73  turn rc;..}....s
35310 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
35320 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73  3Fts5ExprEof(Fts
35330 35 45 78 70 72 20 2a 70 29 7b 0d 0a 20 20 72 65  5Expr *p){..  re
35340 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62  turn p->pRoot->b
35350 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  Eof;..}....stati
35360 63 20 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  c i64 sqlite3Fts
35370 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35 45  5ExprRowid(Fts5E
35380 78 70 72 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75  xpr *p){..  retu
35390 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 69 52 6f  rn p->pRoot->iRo
353a0 77 69 64 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  wid;..}....stati
353b0 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65 53  c int fts5ParseS
353c0 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28 46  tringFromToken(F
353d0 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
353e0 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0d 0a 20  , char **pz){.. 
353f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35400 5f 4f 4b 3b 0d 0a 20 20 2a 70 7a 20 3d 20 73 71  _OK;..  *pz = sq
35410 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
35420 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c  (&rc, pToken->p,
35430 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0d 0a 20 20   pToken->n);..  
35440 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d  return rc;..}...
35450 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
35460 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70   phrase object p
35470 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
35480 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d  y argument...*/.
35490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
354a0 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28  5ExprPhraseFree(
354b0 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
354c0 70 50 68 72 61 73 65 29 7b 0d 0a 20 20 69 66 28  pPhrase){..  if(
354d0 20 70 50 68 72 61 73 65 20 29 7b 0d 0a 20 20 20   pPhrase ){..   
354e0 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72   int i;..    for
354f0 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d  (i=0; i<pPhrase-
35500 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20  >nTerm; i++){.. 
35510 20 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72       Fts5ExprTer
35520 6d 20 2a 70 53 79 6e 3b 0d 0a 20 20 20 20 20 20  m *pSyn;..      
35530 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 4e  Fts5ExprTerm *pN
35540 65 78 74 3b 0d 0a 20 20 20 20 20 20 46 74 73 35  ext;..      Fts5
35550 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
35560 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  = &pPhrase->aTer
35570 6d 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 73 71 6c  m[i];..      sql
35580 69 74 65 33 5f 66 72 65 65 28 70 54 65 72 6d 2d  ite3_free(pTerm-
35590 3e 7a 54 65 72 6d 29 3b 0d 0a 20 20 20 20 20 20  >zTerm);..      
355a0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
355b0 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74 65  lose(pTerm->pIte
355c0 72 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 70  r);..      for(p
355d0 53 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  Syn=pTerm->pSyno
355e0 6e 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d  nym; pSyn; pSyn=
355f0 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 20  pNext){..       
35600 20 70 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70   pNext = pSyn->p
35610 53 79 6e 6f 6e 79 6d 3b 0d 0a 20 20 20 20 20 20  Synonym;..      
35620 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
35630 72 43 6c 6f 73 65 28 70 53 79 6e 2d 3e 70 49 74  rClose(pSyn->pIt
35640 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 74  er);..        ft
35650 73 35 42 75 66 66 65 72 46 72 65 65 28 28 46 74  s5BufferFree((Ft
35660 73 35 42 75 66 66 65 72 2a 29 26 70 53 79 6e 5b  s5Buffer*)&pSyn[
35670 31 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71  1]);..        sq
35680 6c 69 74 65 33 5f 66 72 65 65 28 70 53 79 6e 29  lite3_free(pSyn)
35690 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
356a0 7d 0d 0a 20 20 20 20 69 66 28 20 70 50 68 72 61  }..    if( pPhra
356b0 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 53 70 61  se->poslist.nSpa
356c0 63 65 3e 30 20 29 20 66 74 73 35 42 75 66 66 65  ce>0 ) fts5Buffe
356d0 72 46 72 65 65 28 26 70 50 68 72 61 73 65 2d 3e  rFree(&pPhrase->
356e0 70 6f 73 6c 69 73 74 29 3b 0d 0a 20 20 20 20 73  poslist);..    s
356f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 68 72  qlite3_free(pPhr
35700 61 73 65 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  ase);..  }..}...
35710 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20  ./*..** Set the 
35720 22 62 46 69 72 73 74 22 20 66 6c 61 67 20 6f 6e  "bFirst" flag on
35730 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e   the first token
35740 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 70   of the phrase p
35750 61 73 73 65 64 20 61 73 20 74 68 65 0d 0a 2a 2a  assed as the..**
35760 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
35770 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
35780 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
35790 65 53 65 74 43 61 72 65 74 28 46 74 73 35 45 78  eSetCaret(Fts5Ex
357a0 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
357b0 65 29 7b 0d 0a 20 20 69 66 28 20 70 50 68 72 61  e){..  if( pPhra
357c0 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e 6e  se && pPhrase->n
357d0 54 65 72 6d 20 29 7b 0d 0a 20 20 20 20 70 50 68  Term ){..    pPh
357e0 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62  rase->aTerm[0].b
357f0 46 69 72 73 74 20 3d 20 31 3b 0d 0a 20 20 7d 0d  First = 1;..  }.
35800 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20  .}..../*..** If 
35810 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72 20 69  argument pNear i
35820 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 6e  s NULL, then a n
35830 65 77 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ew Fts5ExprNears
35840 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  et object is all
35850 6f 63 61 74 65 64 0d 0a 2a 2a 20 61 6e 64 20 70  ocated..** and p
35860 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70 50  opulated with pP
35870 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70 4e  hrase. Or, if pN
35880 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ear is not NULL,
35890 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65 20   phrase pPhrase 
358a0 69 73 0d 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20  is..** appended 
358b0 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72 65  to it and the re
358c0 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e 0d  sults returned..
358d0 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  .**..** If an OO
358e0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
358f0 62 6f 74 68 20 74 68 65 20 70 4e 65 61 72 20 61  both the pNear a
35900 6e 64 20 70 50 68 72 61 73 65 20 6f 62 6a 65 63  nd pPhrase objec
35910 74 73 20 61 72 65 20 66 72 65 65 64 20 61 6e 64  ts are freed and
35920 0d 0a 2a 2a 20 4e 55 4c 4c 20 72 65 74 75 72 6e  ..** NULL return
35930 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ed...*/..static 
35940 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
35950 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
35960 65 4e 65 61 72 73 65 74 28 0d 0a 20 20 46 74 73  eNearset(..  Fts
35970 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
35980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35990 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
359a0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  ..  Fts5ExprNear
359b0 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20 20 20  set *pNear,     
359c0 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
359d0 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55 4c 4c  nearset, or NULL
359e0 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50   */..  Fts5ExprP
359f0 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 20  hrase *pPhrase  
35a00 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e 74         /* Recent
35a10 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73 65  ly parsed phrase
35a20 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74   */..){..  const
35a30 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38   int SZALLOC = 8
35a40 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  ;..  Fts5ExprNea
35a50 72 73 65 74 20 2a 70 52 65 74 20 3d 20 30 3b 0d  rset *pRet = 0;.
35a60 0a 0d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ...  if( pParse-
35a70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
35a80 7b 0d 0a 20 20 20 20 69 66 28 20 70 50 68 72 61  {..    if( pPhra
35a90 73 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  se==0 ){..      
35aa0 72 65 74 75 72 6e 20 70 4e 65 61 72 3b 0d 0a 20  return pNear;.. 
35ab0 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 4e     }..    if( pN
35ac0 65 61 72 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20  ear==0 ){..     
35ad0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
35ae0 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61 72  eof(Fts5ExprNear
35af0 73 65 74 29 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a  set) + SZALLOC *
35b00 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
35b10 50 68 72 61 73 65 2a 29 3b 0d 0a 20 20 20 20 20  Phrase*);..     
35b20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
35b30 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0d 0a  malloc(nByte);..
35b40 20 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d        if( pRet==
35b50 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 50  0 ){..        pP
35b60 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
35b70 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20  E_NOMEM;..      
35b80 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20  }else{..        
35b90 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
35ba0 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 7d  nByte);..      }
35bb0 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
35bc0 28 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20  (pNear->nPhrase 
35bd0 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b  % SZALLOC)==0 ){
35be0 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  ..      int nNew
35bf0 20 3d 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   = pNear->nPhras
35c00 65 20 2b 20 53 5a 41 4c 4c 4f 43 3b 0d 0a 20 20  e + SZALLOC;..  
35c10 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
35c20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e  sizeof(Fts5ExprN
35c30 65 61 72 73 65 74 29 20 2b 20 6e 4e 65 77 20 2a  earset) + nNew *
35c40 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
35c50 50 68 72 61 73 65 2a 29 3b 0d 0a 0d 0a 20 20 20  Phrase*);....   
35c60 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 45     pRet = (Fts5E
35c70 78 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69  xprNearset*)sqli
35c80 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4e 65 61  te3_realloc(pNea
35c90 72 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  r, nByte);..    
35ca0 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
35cb0 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ..        pParse
35cc0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
35cd0 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  MEM;..      }.. 
35ce0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
35cf0 20 70 52 65 74 20 3d 20 70 4e 65 61 72 3b 0d 0a   pRet = pNear;..
35d00 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
35d10 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0d 0a  if( pRet==0 ){..
35d20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
35d30 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se->rc!=SQLITE_O
35d40 4b 20 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65  K );..    sqlite
35d50 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
35d60 74 46 72 65 65 28 70 4e 65 61 72 29 3b 0d 0a 20  tFree(pNear);.. 
35d70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
35d80 72 73 65 50 68 72 61 73 65 46 72 65 65 28 70 50  rsePhraseFree(pP
35d90 68 72 61 73 65 29 3b 0d 0a 20 20 7d 65 6c 73 65  hrase);..  }else
35da0 7b 0d 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d  {..    if( pRet-
35db0 3e 6e 50 68 72 61 73 65 3e 30 20 29 7b 0d 0a 20  >nPhrase>0 ){.. 
35dc0 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
35dd0 61 73 65 20 2a 70 4c 61 73 74 20 3d 20 70 52 65  ase *pLast = pRe
35de0 74 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74  t->apPhrase[pRet
35df0 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 3b 0d 0a 20  ->nPhrase-1];.. 
35e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 61       assert( pLa
35e10 73 74 3d 3d 70 50 61 72 73 65 2d 3e 61 70 50 68  st==pParse->apPh
35e20 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68  rase[pParse->nPh
35e30 72 61 73 65 2d 32 5d 20 29 3b 0d 0a 20 20 20 20  rase-2] );..    
35e40 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e    if( pPhrase->n
35e50 54 65 72 6d 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Term==0 ){..    
35e60 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
35e70 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29 3b  seFree(pPhrase);
35e80 0d 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ..        pRet->
35e90 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a 20 20 20 20  nPhrase--;..    
35ea0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72      pParse->nPhr
35eb0 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 20 20  ase--;..        
35ec0 70 50 68 72 61 73 65 20 3d 20 70 4c 61 73 74 3b  pPhrase = pLast;
35ed0 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
35ee0 28 20 70 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d  ( pLast->nTerm==
35ef0 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 74  0 ){..        ft
35f00 73 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65  s5ExprPhraseFree
35f10 28 70 4c 61 73 74 29 3b 0d 0a 20 20 20 20 20 20  (pLast);..      
35f20 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61    pParse->apPhra
35f30 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61  se[pParse->nPhra
35f40 73 65 2d 32 5d 20 3d 20 70 50 68 72 61 73 65 3b  se-2] = pPhrase;
35f50 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ..        pParse
35f60 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a 20 20  ->nPhrase--;..  
35f70 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 72        pRet->nPhr
35f80 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 7d 0d  ase--;..      }.
35f90 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 52 65 74  .    }..    pRet
35fa0 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74 2d  ->apPhrase[pRet-
35fb0 3e 6e 50 68 72 61 73 65 2b 2b 5d 20 3d 20 70 50  >nPhrase++] = pP
35fc0 68 72 61 73 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72  hrase;..  }..  r
35fd0 65 74 75 72 6e 20 70 52 65 74 3b 0d 0a 7d 0d 0a  eturn pRet;..}..
35fe0 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
35ff0 20 54 6f 6b 65 6e 43 74 78 20 54 6f 6b 65 6e 43   TokenCtx TokenC
36000 74 78 3b 0d 0a 73 74 72 75 63 74 20 54 6f 6b 65  tx;..struct Toke
36010 6e 43 74 78 20 7b 0d 0a 20 20 46 74 73 35 45 78  nCtx {..  Fts5Ex
36020 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
36030 65 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 7d  e;..  int rc;..}
36040 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c  ;..../*..** Call
36050 62 61 63 6b 20 66 6f 72 20 74 6f 6b 65 6e 69 7a  back for tokeniz
36060 69 6e 67 20 74 65 72 6d 73 20 75 73 65 64 20 62  ing terms used b
36070 79 20 50 61 72 73 65 54 65 72 6d 28 29 2e 0d 0a  y ParseTerm()...
36080 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
36090 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65  ts5ParseTokenize
360a0 28 0d 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  (..  void *pCont
360b0 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
360c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
360d0 74 6f 20 46 74 73 35 49 6e 73 65 72 74 43 74 78  to Fts5InsertCtx
360e0 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e   object */..  in
360f0 74 20 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20  t tflags,       
36100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36110 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f   Mask of FTS5_TO
36120 4b 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a  KEN_* flags */..
36130 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
36140 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
36150 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
36160 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d  aining token */.
36170 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20  .  int nToken,  
36180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36190 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f     /* Size of to
361a0 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  ken in bytes */.
361b0 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 31 2c  .  int iUnused1,
361c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361d0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73     /* Start offs
361e0 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a  et of token */..
361f0 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20 20    int iUnused2  
36200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36210 20 20 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20    /* End offset 
36220 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d  of token */..){.
36230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36240 54 45 5f 4f 4b 3b 0d 0a 20 20 63 6f 6e 73 74 20  TE_OK;..  const 
36250 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b  int SZALLOC = 8;
36260 0d 0a 20 20 54 6f 6b 65 6e 43 74 78 20 2a 70 43  ..  TokenCtx *pC
36270 74 78 20 3d 20 28 54 6f 6b 65 6e 43 74 78 2a 29  tx = (TokenCtx*)
36280 70 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 46 74 73  pContext;..  Fts
36290 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
362a0 72 61 73 65 20 3d 20 70 43 74 78 2d 3e 70 50 68  rase = pCtx->pPh
362b0 72 61 73 65 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45  rase;....  UNUSE
362c0 44 5f 50 41 52 41 4d 32 28 69 55 6e 75 73 65 64  D_PARAM2(iUnused
362d0 31 2c 20 69 55 6e 75 73 65 64 32 29 3b 0d 0a 0d  1, iUnused2);...
362e0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
362f0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
36300 63 75 72 72 65 64 2c 20 74 68 69 73 20 69 73 20  curred, this is 
36310 61 20 6e 6f 2d 6f 70 20 2a 2f 0d 0a 20 20 69 66  a no-op */..  if
36320 28 20 70 43 74 78 2d 3e 72 63 21 3d 53 51 4c 49  ( pCtx->rc!=SQLI
36330 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70  TE_OK ) return p
36340 43 74 78 2d 3e 72 63 3b 0d 0a 20 20 69 66 28 20  Ctx->rc;..  if( 
36350 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f  nToken>FTS5_MAX_
36360 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f  TOKEN_SIZE ) nTo
36370 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54  ken = FTS5_MAX_T
36380 4f 4b 45 4e 5f 53 49 5a 45 3b 0d 0a 0d 0a 20 20  OKEN_SIZE;....  
36390 69 66 28 20 70 50 68 72 61 73 65 20 26 26 20 70  if( pPhrase && p
363a0 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20  Phrase->nTerm>0 
363b0 26 26 20 28 74 66 6c 61 67 73 20 26 20 46 54 53  && (tflags & FTS
363c0 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45  5_TOKEN_COLOCATE
363d0 44 29 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45  D) ){..    Fts5E
363e0 78 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0d 0a  xprTerm *pSyn;..
363f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
36400 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54  sizeof(Fts5ExprT
36410 65 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  erm) + sizeof(Ft
36420 73 35 42 75 66 66 65 72 29 20 2b 20 6e 54 6f 6b  s5Buffer) + nTok
36430 65 6e 2b 31 3b 0d 0a 20 20 20 20 70 53 79 6e 20  en+1;..    pSyn 
36440 3d 20 28 46 74 73 35 45 78 70 72 54 65 72 6d 2a  = (Fts5ExprTerm*
36450 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
36460 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 69 66 28  nByte);..    if(
36470 20 70 53 79 6e 3d 3d 30 20 29 7b 0d 0a 20 20 20   pSyn==0 ){..   
36480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
36490 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  OMEM;..    }else
364a0 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  {..      memset(
364b0 70 53 79 6e 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pSyn, 0, nByte);
364c0 0d 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 7a 54  ..      pSyn->zT
364d0 65 72 6d 20 3d 20 28 28 63 68 61 72 2a 29 70 53  erm = ((char*)pS
364e0 79 6e 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  yn) + sizeof(Fts
364f0 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73 69 7a  5ExprTerm) + siz
36500 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 3b  eof(Fts5Buffer);
36510 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ..      memcpy(p
36520 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70 54 6f 6b  Syn->zTerm, pTok
36530 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a 20 20  en, nToken);..  
36540 20 20 20 20 70 53 79 6e 2d 3e 70 53 79 6e 6f 6e      pSyn->pSynon
36550 79 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54  ym = pPhrase->aT
36560 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54 65  erm[pPhrase->nTe
36570 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d 3b 0d  rm-1].pSynonym;.
36580 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
36590 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
365a0 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d  Term-1].pSynonym
365b0 20 3d 20 70 53 79 6e 3b 0d 0a 20 20 20 20 7d 0d   = pSyn;..    }.
365c0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 46  .  }else{..    F
365d0 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
365e0 72 6d 3b 0d 0a 20 20 20 20 69 66 28 20 70 50 68  rm;..    if( pPh
365f0 72 61 73 65 3d 3d 30 20 7c 7c 20 28 70 50 68 72  rase==0 || (pPhr
36600 61 73 65 2d 3e 6e 54 65 72 6d 20 25 20 53 5a 41  ase->nTerm % SZA
36610 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0d 0a 20 20 20  LLOC)==0 ){..   
36620 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
36630 65 20 2a 70 4e 65 77 3b 0d 0a 20 20 20 20 20 20  e *pNew;..      
36640 69 6e 74 20 6e 4e 65 77 20 3d 20 53 5a 41 4c 4c  int nNew = SZALL
36650 4f 43 20 2b 20 28 70 50 68 72 61 73 65 20 3f 20  OC + (pPhrase ? 
36660 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 3a  pPhrase->nTerm :
36670 20 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 70 4e   0);....      pN
36680 65 77 20 3d 20 28 46 74 73 35 45 78 70 72 50 68  ew = (Fts5ExprPh
36690 72 61 73 65 2a 29 73 71 6c 69 74 65 33 5f 72 65  rase*)sqlite3_re
366a0 61 6c 6c 6f 63 28 70 50 68 72 61 73 65 2c 20 0d  alloc(pPhrase, .
366b0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
366c0 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  f(Fts5ExprPhrase
366d0 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45  ) + sizeof(Fts5E
366e0 78 70 72 54 65 72 6d 29 20 2a 20 6e 4e 65 77 0d  xprTerm) * nNew.
366f0 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20  .      );..     
36700 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0d   if( pNew==0 ){.
36710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
36720 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
36730 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
36740 20 20 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d     if( pPhrase==
36750 30 20 29 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  0 ) memset(pNew,
36760 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45   0, sizeof(Fts5E
36770 78 70 72 50 68 72 61 73 65 29 29 3b 0d 0a 20 20  xprPhrase));..  
36780 20 20 20 20 20 20 70 43 74 78 2d 3e 70 50 68 72        pCtx->pPhr
36790 61 73 65 20 3d 20 70 50 68 72 61 73 65 20 3d 20  ase = pPhrase = 
367a0 70 4e 65 77 3b 0d 0a 20 20 20 20 20 20 20 20 70  pNew;..        p
367b0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 6e 4e 65  New->nTerm = nNe
367c0 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0d 0a 20 20  w - SZALLOC;..  
367d0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
367e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
367f0 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
36800 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
36810 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d  ->aTerm[pPhrase-
36820 3e 6e 54 65 72 6d 2b 2b 5d 3b 0d 0a 20 20 20 20  >nTerm++];..    
36830 20 20 6d 65 6d 73 65 74 28 70 54 65 72 6d 2c 20    memset(pTerm, 
36840 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  0, sizeof(Fts5Ex
36850 70 72 54 65 72 6d 29 29 3b 0d 0a 20 20 20 20 20  prTerm));..     
36860 20 70 54 65 72 6d 2d 3e 7a 54 65 72 6d 20 3d 20   pTerm->zTerm = 
36870 73 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64  sqlite3Fts5Strnd
36880 75 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2c 20  up(&rc, pToken, 
36890 6e 54 6f 6b 65 6e 29 3b 0d 0a 20 20 20 20 7d 0d  nToken);..    }.
368a0 0a 20 20 7d 0d 0a 0d 0a 20 20 70 43 74 78 2d 3e  .  }....  pCtx->
368b0 72 63 20 3d 20 72 63 3b 0d 0a 20 20 72 65 74 75  rc = rc;..  retu
368c0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f  rn rc;..}....../
368d0 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  *..** Free the p
368e0 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73  hrase object pas
368f0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
36900 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73  argument...*/..s
36910 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
36920 65 33 46 74 73 35 50 61 72 73 65 50 68 72 61 73  e3Fts5ParsePhras
36930 65 46 72 65 65 28 46 74 73 35 45 78 70 72 50 68  eFree(Fts5ExprPh
36940 72 61 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0d  rase *pPhrase){.
36950 0a 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73  .  fts5ExprPhras
36960 65 46 72 65 65 28 70 50 68 72 61 73 65 29 3b 0d  eFree(pPhrase);.
36970 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65  .}..../*..** Fre
36980 65 20 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a  e the phrase obj
36990 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
369a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
369b0 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  t...*/..static v
369c0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
369d0 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28  arseNearsetFree(
369e0 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
369f0 2a 70 4e 65 61 72 29 7b 0d 0a 20 20 69 66 28 20  *pNear){..  if( 
36a00 70 4e 65 61 72 20 29 7b 0d 0a 20 20 20 20 69 6e  pNear ){..    in
36a10 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d  t i;..    for(i=
36a20 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  0; i<pNear->nPhr
36a30 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  ase; i++){..    
36a40 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65    fts5ExprPhrase
36a50 46 72 65 65 28 70 4e 65 61 72 2d 3e 61 70 50 68  Free(pNear->apPh
36a60 72 61 73 65 5b 69 5d 29 3b 0d 0a 20 20 20 20 7d  rase[i]);..    }
36a70 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
36a80 65 65 28 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65  ee(pNear->pColse
36a90 74 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  t);..    sqlite3
36aa0 5f 66 72 65 65 28 70 4e 65 61 72 29 3b 0d 0a 20  _free(pNear);.. 
36ab0 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20   }..}....static 
36ac0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
36ad0 50 61 72 73 65 46 69 6e 69 73 68 65 64 28 46 74  ParseFinished(Ft
36ae0 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
36af0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
36b00 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
36b10 61 72 73 65 2d 3e 70 45 78 70 72 3d 3d 30 20 29  arse->pExpr==0 )
36b20 3b 0d 0a 20 20 70 50 61 72 73 65 2d 3e 70 45 78  ;..  pParse->pEx
36b30 70 72 20 3d 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  pr = p;..}..../*
36b40 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
36b50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
36b60 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 70 72  the parser to pr
36b70 6f 63 65 73 73 20 61 20 73 74 72 69 6e 67 20 74  ocess a string t
36b80 6f 6b 65 6e 2e 20 54 68 65 0d 0a 2a 2a 20 73 74  oken. The..** st
36b90 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d 61 79 20  ring may or may 
36ba0 6e 6f 74 20 62 65 20 71 75 6f 74 65 64 2e 20 49  not be quoted. I
36bb0 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20 69 73  n any case it is
36bc0 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64 20 61   tokenized and a
36bd0 0d 0a 2a 2a 20 70 68 72 61 73 65 20 6f 62 6a 65  ..** phrase obje
36be0 63 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ct consisting of
36bf0 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72 65 74 75   all tokens retu
36c00 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  rned...*/..stati
36c10 63 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65  c Fts5ExprPhrase
36c20 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
36c30 73 65 54 65 72 6d 28 0d 0a 20 20 46 74 73 35 50  seTerm(..  Fts5P
36c40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
36c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36c60 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a  rse context */..
36c70 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
36c80 20 2a 70 41 70 70 65 6e 64 2c 20 20 20 20 20 20   *pAppend,      
36c90 20 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 61    /* Phrase to a
36ca0 70 70 65 6e 64 20 74 6f 20 2a 2f 0d 0a 20 20 46  ppend to */..  F
36cb0 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
36cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
36cd0 2a 20 53 74 72 69 6e 67 20 74 6f 20 74 6f 6b 65  * String to toke
36ce0 6e 69 7a 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62  nize */..  int b
36cf0 50 72 65 66 69 78 20 20 20 20 20 20 20 20 20 20  Prefix          
36d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
36d10 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
36d20 20 74 72 61 69 6c 69 6e 67 20 22 2a 22 20 2a 2f   trailing "*" */
36d30 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 43 6f 6e 66  ..){..  Fts5Conf
36d40 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 50  ig *pConfig = pP
36d50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0d 0a  arse->pConfig;..
36d60 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 3b    TokenCtx sCtx;
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
36d90 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 63 61  ect passed to ca
36da0 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74  llback */..  int
36db0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36dd0 54 6f 6b 65 6e 69 7a 65 20 72 65 74 75 72 6e 20  Tokenize return 
36de0 63 6f 64 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20  code */..  char 
36df0 2a 7a 20 3d 20 30 3b 0d 0a 0d 0a 20 20 6d 65 6d  *z = 0;....  mem
36e00 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69  set(&sCtx, 0, si
36e10 7a 65 6f 66 28 54 6f 6b 65 6e 43 74 78 29 29 3b  zeof(TokenCtx));
36e20 0d 0a 20 20 73 43 74 78 2e 70 50 68 72 61 73 65  ..  sCtx.pPhrase
36e30 20 3d 20 70 41 70 70 65 6e 64 3b 0d 0a 0d 0a 20   = pAppend;.... 
36e40 20 72 63 20 3d 20 66 74 73 35 50 61 72 73 65 53   rc = fts5ParseS
36e50 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28 70  tringFromToken(p
36e60 54 6f 6b 65 6e 2c 20 26 7a 29 3b 0d 0a 20 20 69  Token, &z);..  i
36e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36e80 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 66 6c 61   ){..    int fla
36e90 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 49  gs = FTS5_TOKENI
36ea0 5a 45 5f 51 55 45 52 59 20 7c 20 28 62 50 72 65  ZE_QUERY | (bPre
36eb0 66 69 78 20 3f 20 46 54 53 35 5f 54 4f 4b 45 4e  fix ? FTS5_TOKEN
36ec0 49 5a 45 5f 50 52 45 46 49 58 20 3a 20 30 29 3b  IZE_PREFIX : 0);
36ed0 0d 0a 20 20 20 20 69 6e 74 20 6e 3b 0d 0a 20 20  ..    int n;..  
36ee0 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71    sqlite3Fts5Deq
36ef0 75 6f 74 65 28 7a 29 3b 0d 0a 20 20 20 20 6e 20  uote(z);..    n 
36f00 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
36f10 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
36f20 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28  te3Fts5Tokenize(
36f30 70 43 6f 6e 66 69 67 2c 20 66 6c 61 67 73 2c 20  pConfig, flags, 
36f40 7a 2c 20 6e 2c 20 26 73 43 74 78 2c 20 66 74 73  z, n, &sCtx, fts
36f50 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 29 3b  5ParseTokenize);
36f60 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33  ..  }..  sqlite3
36f70 5f 66 72 65 65 28 7a 29 3b 0d 0a 20 20 69 66 28  _free(z);..  if(
36f80 20 72 63 20 7c 7c 20 28 72 63 20 3d 20 73 43 74   rc || (rc = sCt
36f90 78 2e 72 63 29 20 29 7b 0d 0a 20 20 20 20 70 50  x.rc) ){..    pP
36fa0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0d 0a  arse->rc = rc;..
36fb0 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
36fc0 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72  seFree(sCtx.pPhr
36fd0 61 73 65 29 3b 0d 0a 20 20 20 20 73 43 74 78 2e  ase);..    sCtx.
36fe0 70 50 68 72 61 73 65 20 3d 20 30 3b 0d 0a 20 20  pPhrase = 0;..  
36ff0 7d 65 6c 73 65 7b 0d 0a 0d 0a 20 20 20 20 69 66  }else{....    if
37000 28 20 70 41 70 70 65 6e 64 3d 3d 30 20 29 7b 0d  ( pAppend==0 ){.
37010 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 61 72  .      if( (pPar
37020 73 65 2d 3e 6e 50 68 72 61 73 65 20 25 20 38 29  se->nPhrase % 8)
37030 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
37040 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
37050 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
37060 65 2a 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  e*) * (pParse->n
37070 50 68 72 61 73 65 20 2b 20 38 29 3b 0d 0a 20 20  Phrase + 8);..  
37080 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68        Fts5ExprPh
37090 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0d 0a 20  rase **apNew;.. 
370a0 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 28         apNew = (
370b0 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a  Fts5ExprPhrase**
370c0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
370d0 28 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73  (pParse->apPhras
370e0 65 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  e, nByte);..    
370f0 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
37100 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70   ){..          p
37110 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
37120 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20  TE_NOMEM;..     
37130 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72       fts5ExprPhr
37140 61 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68  aseFree(sCtx.pPh
37150 72 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  rase);..        
37160 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
37170 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
37180 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65  pParse->apPhrase
37190 20 3d 20 61 70 4e 65 77 3b 0d 0a 20 20 20 20 20   = apNew;..     
371a0 20 7d 0d 0a 20 20 20 20 20 20 70 50 61 72 73 65   }..      pParse
371b0 2d 3e 6e 50 68 72 61 73 65 2b 2b 3b 0d 0a 20 20  ->nPhrase++;..  
371c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 73    }....    if( s
371d0 43 74 78 2e 70 50 68 72 61 73 65 3d 3d 30 20 29  Ctx.pPhrase==0 )
371e0 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  {..      /* This
371f0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 61   happens when pa
37200 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20 6f 72  rsing a token or
37210 20 71 75 6f 74 65 64 20 70 68 72 61 73 65 20 74   quoted phrase t
37220 68 61 74 20 63 6f 6e 74 61 69 6e 73 0d 0a 20 20  hat contains..  
37230 20 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20      ** no token 
37240 63 68 61 72 61 63 74 65 72 73 20 61 74 20 61 6c  characters at al
37250 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43  l. (e.g ... MATC
37260 48 20 27 22 22 27 29 2e 20 2a 2f 0d 0a 20 20 20  H '""'). */..   
37270 20 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 20     sCtx.pPhrase 
37280 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  = sqlite3Fts5Mal
37290 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d  locZero(&pParse-
372a0 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
372b0 45 78 70 72 50 68 72 61 73 65 29 29 3b 0d 0a 20  ExprPhrase));.. 
372c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 43 74     }else if( sCt
372d0 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  x.pPhrase->nTerm
372e0 20 29 7b 0d 0a 20 20 20 20 20 20 73 43 74 78 2e   ){..      sCtx.
372f0 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 73  pPhrase->aTerm[s
37300 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65  Ctx.pPhrase->nTe
37310 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20 3d 20  rm-1].bPrefix = 
37320 28 75 38 29 62 50 72 65 66 69 78 3b 0d 0a 20 20  (u8)bPrefix;..  
37330 20 20 7d 0d 0a 20 20 20 20 70 50 61 72 73 65 2d    }..    pParse-
37340 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
37350 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20 73  ->nPhrase-1] = s
37360 43 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a 20 20  Ctx.pPhrase;..  
37370 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 73 43  }....  return sC
37380 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a 7d 0d 0a  tx.pPhrase;..}..
37390 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20  ../*..** Create 
373a0 61 20 6e 65 77 20 46 54 53 35 20 65 78 70 72 65  a new FTS5 expre
373b0 73 73 69 6f 6e 20 62 79 20 63 6c 6f 6e 69 6e 67  ssion by cloning
373c0 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20   phrase iPhrase 
373d0 6f 66 20 74 68 65 0d 0a 2a 2a 20 65 78 70 72 65  of the..** expre
373e0 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
373f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
37400 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ent...*/..static
37410 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
37420 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28  ExprClonePhrase(
37430 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  ..  Fts5Expr *pE
37440 78 70 72 2c 20 0d 0a 20 20 69 6e 74 20 69 50 68  xpr, ..  int iPh
37450 72 61 73 65 2c 20 0d 0a 20 20 46 74 73 35 45 78  rase, ..  Fts5Ex
37460 70 72 20 2a 2a 70 70 4e 65 77 0d 0a 29 7b 0d 0a  pr **ppNew..){..
37470 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37480 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
37490 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
374a0 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50   */..  Fts5ExprP
374b0 68 72 61 73 65 20 2a 70 4f 72 69 67 3b 20 20 20  hrase *pOrig;   
374c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 68         /* The ph
374d0 72 61 73 65 20 65 78 74 72 61 63 74 65 64 20 66  rase extracted f
374e0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0d 0a 20 20  rom pExpr */..  
374f0 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77 20 3d  Fts5Expr *pNew =
37500 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37510 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
37520 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 70 4e   return via *ppN
37530 65 77 20 2a 2f 0d 0a 20 20 54 6f 6b 65 6e 43 74  ew */..  TokenCt
37540 78 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d 3b 20  x sCtx = {0,0}; 
37550 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
37560 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 66  ext object for f
37570 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65  ts5ParseTokenize
37580 20 2a 2f 0d 0a 0d 0a 20 20 70 4f 72 69 67 20 3d   */....  pOrig =
37590 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68   pExpr->apExprPh
375a0 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0d 0a  rase[iPhrase];..
375b0 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78    pNew = (Fts5Ex
375c0 70 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  pr*)sqlite3Fts5M
375d0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
375e0 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 29 29  izeof(Fts5Expr))
375f0 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
37600 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70  ITE_OK ){..    p
37610 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73  New->apExprPhras
37620 65 20 3d 20 28 46 74 73 35 45 78 70 72 50 68 72  e = (Fts5ExprPhr
37630 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 46 74 73  ase**)sqlite3Fts
37640 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
37650 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f   ..        sizeo
37660 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  f(Fts5ExprPhrase
37670 2a 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28  *));..  }..  if(
37680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37690 7b 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f  {..    pNew->pRo
376a0 6f 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f  ot = (Fts5ExprNo
376b0 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  de*)sqlite3Fts5M
376c0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0d  allocZero(&rc, .
376d0 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
376e0 46 74 73 35 45 78 70 72 4e 6f 64 65 29 29 3b 0d  Fts5ExprNode));.
376f0 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
37700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
37710 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70    pNew->pRoot->p
37720 4e 65 61 72 20 3d 20 28 46 74 73 35 45 78 70 72  Near = (Fts5Expr
37730 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33  Nearset*)sqlite3
37740 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
37750 72 63 2c 20 0d 0a 20 20 20 20 20 20 20 20 73 69  rc, ..        si
37760 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61  zeof(Fts5ExprNea
37770 72 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 46  rset) + sizeof(F
37780 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 29  ts5ExprPhrase*))
37790 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63  ;..  }..  if( rc
377a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
377b0 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a      Fts5Colset *
377c0 70 43 6f 6c 73 65 74 4f 72 69 67 20 3d 20 70 4f  pColsetOrig = pO
377d0 72 69 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e 65 61  rig->pNode->pNea
377e0 72 2d 3e 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20  r->pColset;..   
377f0 20 69 66 28 20 70 43 6f 6c 73 65 74 4f 72 69 67   if( pColsetOrig
37800 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e   ){..      int n
37810 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
37820 73 35 43 6f 6c 73 65 74 29 20 2b 20 28 70 43 6f  s5Colset) + (pCo
37830 6c 73 65 74 4f 72 69 67 2d 3e 6e 43 6f 6c 2d 31  lsetOrig->nCol-1
37840 29 20 2a 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b  ) * sizeof(int);
37850 0d 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6c 73  ..      Fts5Cols
37860 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 28 46  et *pColset = (F
37870 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69 74  ts5Colset*)sqlit
37880 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
37890 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20  (&rc, nByte);.. 
378a0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74       if( pColset
378b0 20 29 7b 20 0d 0a 20 20 20 20 20 20 20 20 6d 65   ){ ..        me
378c0 6d 63 70 79 28 70 43 6f 6c 73 65 74 2c 20 70 43  mcpy(pColset, pC
378d0 6f 6c 73 65 74 4f 72 69 67 2c 20 6e 42 79 74 65  olsetOrig, nByte
378e0 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
378f0 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e     pNew->pRoot->
37900 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d  pNear->pColset =
37910 20 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20 20 7d   pColset;..    }
37920 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70  ..  }....  if( p
37930 4f 72 69 67 2d 3e 6e 54 65 72 6d 20 29 7b 0d 0a  Orig->nTerm ){..
37940 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37960 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
37970 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70  terate through p
37980 68 72 61 73 65 20 74 65 72 6d 73 20 2a 2f 0d 0a  hrase terms */..
37990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
379a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
379b0 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b 20 69 2b  pOrig->nTerm; i+
379c0 2b 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 74  +){..      int t
379d0 66 6c 61 67 73 20 3d 20 30 3b 0d 0a 20 20 20 20  flags = 0;..    
379e0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
379f0 70 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  p;..      for(p=
37a00 26 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d  &pOrig->aTerm[i]
37a10 3b 20 70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ; p && rc==SQLIT
37a20 45 5f 4f 4b 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f  E_OK; p=p->pSyno
37a30 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 20 20 63  nym){..        c
37a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
37a50 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0d 0a 20 20   = p->zTerm;..  
37a60 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 50        rc = fts5P
37a70 61 72 73 65 54 6f 6b 65 6e 69 7a 65 28 28 76 6f  arseTokenize((vo
37a80 69 64 2a 29 26 73 43 74 78 2c 20 74 66 6c 61 67  id*)&sCtx, tflag
37a90 73 2c 20 7a 54 65 72 6d 2c 20 28 69 6e 74 29 73  s, zTerm, (int)s
37aa0 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0d 0a 20  trlen(zTerm),.. 
37ab0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
37ac0 3b 0d 0a 20 20 20 20 20 20 20 20 74 66 6c 61 67  ;..        tflag
37ad0 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s = FTS5_TOKEN_C
37ae0 4f 4c 4f 43 41 54 45 44 3b 0d 0a 20 20 20 20 20  OLOCATED;..     
37af0 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
37b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
37b10 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 50 68          sCtx.pPh
37b20 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62  rase->aTerm[i].b
37b30 50 72 65 66 69 78 20 3d 20 70 4f 72 69 67 2d 3e  Prefix = pOrig->
37b40 61 54 65 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78  aTerm[i].bPrefix
37b50 3b 0d 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  ;..        sCtx.
37b60 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69  pPhrase->aTerm[i
37b70 5d 2e 62 46 69 72 73 74 20 3d 20 70 4f 72 69 67  ].bFirst = pOrig
37b80 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 46 69 72 73  ->aTerm[i].bFirs
37b90 74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  t;..      }..   
37ba0 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20   }..  }else{..  
37bb0 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
37bc0 73 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  s when parsing a
37bd0 20 74 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65 64   token or quoted
37be0 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e   phrase that con
37bf0 74 61 69 6e 73 0d 0a 20 20 20 20 2a 2a 20 6e 6f  tains..    ** no
37c00 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72   token character
37c10 73 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e  s at all. (e.g .
37c20 2e 2e 20 4d 41 54 43 48 20 27 22 22 27 29 2e 20  .. MATCH '""'). 
37c30 2a 2f 0d 0a 20 20 20 20 73 43 74 78 2e 70 50 68  */..    sCtx.pPh
37c40 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74  rase = sqlite3Ft
37c50 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
37c60 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  , sizeof(Fts5Exp
37c70 72 50 68 72 61 73 65 29 29 3b 0d 0a 20 20 7d 0d  rPhrase));..  }.
37c80 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
37c90 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 2f  ITE_OK ){..    /
37ca0 2a 20 41 6c 6c 20 74 68 65 20 61 6c 6c 6f 63 61  * All the alloca
37cb0 74 69 6f 6e 73 20 73 75 63 63 65 65 64 65 64 2e  tions succeeded.
37cc0 20 50 75 74 20 74 68 65 20 65 78 70 72 65 73 73   Put the express
37cd0 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 67 65 74  ion object toget
37ce0 68 65 72 2e 20 2a 2f 0d 0a 20 20 20 20 70 4e 65  her. */..    pNe
37cf0 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 45 78 70  w->pIndex = pExp
37d00 72 2d 3e 70 49 6e 64 65 78 3b 0d 0a 20 20 20 20  r->pIndex;..    
37d10 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20  pNew->pConfig = 
37d20 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 3b 0d  pExpr->pConfig;.
37d30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 50 68 72 61  .    pNew->nPhra
37d40 73 65 20 3d 20 31 3b 0d 0a 20 20 20 20 70 4e 65  se = 1;..    pNe
37d50 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b  w->apExprPhrase[
37d60 30 5d 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73  0] = sCtx.pPhras
37d70 65 3b 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52  e;..    pNew->pR
37d80 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68  oot->pNear->apPh
37d90 72 61 73 65 5b 30 5d 20 3d 20 73 43 74 78 2e 70  rase[0] = sCtx.p
37da0 50 68 72 61 73 65 3b 0d 0a 20 20 20 20 70 4e 65  Phrase;..    pNe
37db0 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d  w->pRoot->pNear-
37dc0 3e 6e 50 68 72 61 73 65 20 3d 20 31 3b 0d 0a 20  >nPhrase = 1;.. 
37dd0 20 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d     sCtx.pPhrase-
37de0 3e 70 4e 6f 64 65 20 3d 20 70 4e 65 77 2d 3e 70  >pNode = pNew->p
37df0 52 6f 6f 74 3b 0d 0a 0d 0a 20 20 20 20 69 66 28  Root;....    if(
37e00 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3d 3d 31   pOrig->nTerm==1
37e10 20 0d 0a 20 20 20 20 20 26 26 20 70 4f 72 69 67   ..     && pOrig
37e20 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
37e30 6e 79 6d 3d 3d 30 20 0d 0a 20 20 20 20 20 26 26  nym==0 ..     &&
37e40 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 30 5d   pOrig->aTerm[0]
37e50 2e 62 46 69 72 73 74 3d 3d 30 20 0d 0a 20 20 20  .bFirst==0 ..   
37e60 20 29 7b 0d 0a 20 20 20 20 20 20 70 4e 65 77 2d   ){..      pNew-
37e70 3e 70 52 6f 6f 74 2d 3e 65 54 79 70 65 20 3d 20  >pRoot->eType = 
37e80 46 54 53 35 5f 54 45 52 4d 3b 0d 0a 20 20 20 20  FTS5_TERM;..    
37e90 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 78    pNew->pRoot->x
37ea0 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e  Next = fts5ExprN
37eb0 6f 64 65 4e 65 78 74 5f 54 45 52 4d 3b 0d 0a 20  odeNext_TERM;.. 
37ec0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
37ed0 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54   pNew->pRoot->eT
37ee0 79 70 65 20 3d 20 46 54 53 35 5f 53 54 52 49 4e  ype = FTS5_STRIN
37ef0 47 3b 0d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  G;..      pNew->
37f00 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d 20 66  pRoot->xNext = f
37f10 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f  ts5ExprNodeNext_
37f20 53 54 52 49 4e 47 3b 0d 0a 20 20 20 20 7d 0d 0a  STRING;..    }..
37f30 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71    }else{..    sq
37f40 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65  lite3Fts5ExprFre
37f50 65 28 70 4e 65 77 29 3b 0d 0a 20 20 20 20 66 74  e(pNew);..    ft
37f60 73 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65  s5ExprPhraseFree
37f70 28 73 43 74 78 2e 70 50 68 72 61 73 65 29 3b 0d  (sCtx.pPhrase);.
37f80 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0d 0a  .    pNew = 0;..
37f90 20 20 7d 0d 0a 0d 0a 20 20 2a 70 70 4e 65 77 20    }....  *ppNew 
37fa0 3d 20 70 4e 65 77 3b 0d 0a 20 20 72 65 74 75 72  = pNew;..  retur
37fb0 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a  n rc;..}....../*
37fc0 0d 0a 2a 2a 20 54 6f 6b 65 6e 20 70 54 6f 6b 20  ..** Token pTok 
37fd0 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e 20  has appeared in 
37fe0 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69  a MATCH expressi
37ff0 6f 6e 20 77 68 65 72 65 20 74 68 65 20 4e 45 41  on where the NEA
38000 52 20 6f 70 65 72 61 74 6f 72 0d 0a 2a 2a 20 69  R operator..** i
38010 73 20 65 78 70 65 63 74 65 64 2e 20 49 66 20 74  s expected. If t
38020 6f 6b 65 6e 20 70 54 6f 6b 20 64 6f 65 73 20 6e  oken pTok does n
38030 6f 74 20 63 6f 6e 74 61 69 6e 20 22 4e 45 41 52  ot contain "NEAR
38040 22 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  ", store an erro
38050 72 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  r..** in the pPa
38060 72 73 65 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d  rse object...*/.
38070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
38080 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
38090 72 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61  r(Fts5Parse *pPa
380a0 72 73 65 2c 20 46 74 73 35 54 6f 6b 65 6e 20 2a  rse, Fts5Token *
380b0 70 54 6f 6b 29 7b 0d 0a 20 20 69 66 28 20 70 54  pTok){..  if( pT
380c0 6f 6b 2d 3e 6e 21 3d 34 20 7c 7c 20 6d 65 6d 63  ok->n!=4 || memc
380d0 6d 70 28 22 4e 45 41 52 22 2c 20 70 54 6f 6b 2d  mp("NEAR", pTok-
380e0 3e 70 2c 20 34 29 20 29 7b 0d 0a 20 20 20 20 73  >p, 4) ){..    s
380f0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45  qlite3Fts5ParseE
38100 72 72 6f 72 28 0d 0a 20 20 20 20 20 20 20 20 70  rror(..        p
38110 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20 73 79  Parse, "fts5: sy
38120 6e 74 61 78 20 65 72 72 6f 72 20 6e 65 61 72 20  ntax error near 
38130 5c 22 25 2e 2a 73 5c 22 22 2c 20 70 54 6f 6b 2d  \"%.*s\"", pTok-
38140 3e 6e 2c 20 70 54 6f 6b 2d 3e 70 0d 0a 20 20 20  >n, pTok->p..   
38150 20 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73   );..  }..}....s
38160 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
38170 65 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69  e3Fts5ParseSetDi
38180 73 74 61 6e 63 65 28 0d 0a 20 20 46 74 73 35 50  stance(..  Fts5P
38190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0d 0a  arse *pParse, ..
381a0 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
381b0 74 20 2a 70 4e 65 61 72 2c 0d 0a 20 20 46 74 73  t *pNear,..  Fts
381c0 35 54 6f 6b 65 6e 20 2a 70 0d 0a 29 7b 0d 0a 20  5Token *p..){.. 
381d0 20 69 66 28 20 70 4e 65 61 72 20 29 7b 0d 0a 20   if( pNear ){.. 
381e0 20 20 20 69 6e 74 20 6e 4e 65 61 72 20 3d 20 30     int nNear = 0
381f0 3b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20  ;..    int i;.. 
38200 20 20 20 69 66 28 20 70 2d 3e 6e 20 29 7b 0d 0a     if( p->n ){..
38210 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
38220 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0d 0a 20 20  <p->n; i++){..  
38230 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 28        char c = (
38240 63 68 61 72 29 70 2d 3e 70 5b 69 5d 3b 0d 0a 20  char)p->p[i];.. 
38250 20 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27         if( c<'0'
38260 20 7c 7c 20 63 3e 27 39 27 20 29 7b 0d 0a 20 20   || c>'9' ){..  
38270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
38280 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 0d 0a  ts5ParseError(..
38290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
382a0 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
382b0 69 6e 74 65 67 65 72 2c 20 67 6f 74 20 5c 22 25  integer, got \"%
382c0 2e 2a 73 5c 22 22 2c 20 70 2d 3e 6e 2c 20 70 2d  .*s\"", p->n, p-
382d0 3e 70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  >p..            
382e0 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20    );..          
382f0 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20  return;..       
38300 20 7d 0d 0a 20 20 20 20 20 20 20 20 6e 4e 65 61   }..        nNea
38310 72 20 3d 20 6e 4e 65 61 72 20 2a 20 31 30 2